仅针对特定条件重置变量值,为其他所有内容重置固定值

时间:2017-07-17 16:37:30

标签: c++ loops variables if-statement constants

我正在为游戏制作更新。

在游戏中,有些武器数量不同的单位。如:Baneblade Super Heavy Tank with(Baneblade Cannoon,Demolisher Cannon and Heavy Bolter)。
有些武器具有特殊的武器特性而其他武器没有。零特征的武器显示为"" (不是空,只有空格) 在我的例子中,Baneblade Cannon是"",Demolisher Cannon是"Siege",Heavy Bolter是""。 我想要做的是:如果武器具有"Siege"特征,敌人掩护将被忽略,它将是0

我可以这样做:

for (int w = 0; w < 4; w++)
{
    ... // some other codes

    int nDefCover = g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover; //     to reset nCover
    const auto& traits = m_arrUnitEx[nAtt].unit.pType->arrWeapons[w]->strTraits;

    // I check if a number w weapon has "Siege" string
    if (traits.Find("Siege") != std::string::npos) 
    {
        // nCover gives the value of enemy's cover.
        g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = 0;
    }

    ... // some other weapon trait codes

    if (traits.Find("") != std::string::npos)
    {
        g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;
    }
}

在此之后,我必须重置nCover值或从现在开始,所有武器都将忽略敌人的掩护奖励。我想只是围攻武器忽略封面。
因此,我使用g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;nCover重置为其他武器的实际值。

但系统的工作原理如下:
它看第一件武器。它是"",因此会将nCover更改为原始值 它查看了第二种武器,它是"Siege",因此它将nCover更改为0
它查看第三种武器,它是"",因此它将nCover更改为其原始值 最后,nCover返回原始值,Siege武器特征无效。这就像001情况一样 如果一个单位在其最后一个武器插槽中有Siege武器,则此代码可以工作,但武器顺序随每个单位而变化 如何为nCover武器更改0Siege,但对于其他所有情况,请更改为原始值而不更改Siege武器nCover?我应该用一个循环来做到这一点但是找不到放在哪里以及我应该使用哪个循环。

2 个答案:

答案 0 :(得分:0)

我的意思是你应该为每件武器计算伤害,而不是之后, 所以你应该有类似的东西:

for (auto& weapon : m_arrUnitEx[nAtt].unit.pType->arrWeapons)
{
    // if (distance(nAtt, nDef) > weapon.range) continue;
    dealDamage(weapon, nDef);
}

使用:

void dealDamage(Weapon& weapon, int nDef)
{
    const auto& traits = weapon.strTraits;
    int nDefCover = g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover;
    if (traits.Find("Siege") != std::string::npos) 
    {
        nDefCover = 0;
    }

    m_arrUnitEx[nDef].hitPoints -= computeDamage(weapon, nDefCover);
    --weapon.ammo;
}

答案 1 :(得分:0)

我用一种奇怪的方式解决了这个问题,我无法想象......
首先,我从代码顶部和ifs中删除了nDefCover定义。
然后我在const auto& traits上面写了一个定义为:nFinalAccuracy = max(0, min(100, nFinalAccuracy));

之后,我将nDefCover的值添加到nFinalAccuracy的{​​{1}}和其他必要武器的值中。
最终代码是:

Siege

我认为它有效;武器开火,计算敌人和玩家单位的主动权,对双方施加伤害并继续下一个武器,在检查其他武器的特征之前,它会将for (int w = 0; w < 4; w++) { nFinalAccuracy = max(0, min(100, nFinalAccuracy)); const auto& traits = m_arrUnitEx[nAtt].unit.pType->arrWeapons[w]->strTraits; if (traits.Find("Siege") != std::string::npos) { nFinalAccuracy = max(0, min(100, (nFinalAccuracy + nDefCover))); } if (traits.Find("Siege") != std::string::npos && traits.Find("Titankiller") != std::string::npos) { nFinalAccuracy = 100; } if (traits.Find("Siege") != std::string::npos && traits.Find("Terror") != std::string::npos) { nFinalAccuracy = max(0, min(100, (nFinalAccuracy + nDefCover))); } if (m_arrUnitEx[nDef].unit.pType->nUnitClass == UC_AIRCRAFT && traits.Find("AA") != std::string::npos) { nFinalAccuracy = 100; } if (traits.Find("Terror") != std::string::npos) { m_arrUnitEx[nDef].unit.nMorale.actual = m_arrUnitEx[nDef].unit.nMorale.actual - 10; } } 重置为原始值。 到目前为止,似乎代码适用于任何武器。