我正在更新游戏。
在游戏中,有拥有不同数量武器的单位。比如:毒刃超重型坦克(毒刃加农炮、爆破加农炮和重型爆弹枪)。
有些武器有特殊的武器特性,有些则没有。特性为零的武器显示为“”(不为空,只有空格)。
在我的示例中,Baneblade Cannon 是 ""
, 爆破炮是 "Siege"
, 重型 bolt 是 ""
.
我想做的是:如果武器有 "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
值(value)或从现在开始,所有武器将无视敌人的掩护奖励。我只想攻城武器忽略掩体。
所以,我使用g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;
重置 nCover
其他武器的实际值(value)。
但是系统是这样工作的:
它看着第一个武器。这是""
, 所以它改变了 nCover
到它的原始值。
它看着第二件武器,它是"Siege"
, 所以它改变了 nCover
至 0
.
它查看第三件武器,它是 ""
, 所以它改变了 nCover
到它的原始值。
最后,nCover
返回其原始值和 Siege
武器特性毫无意义。就像0
或者 0
或者 1
情况。
如果一个单位有 Siege
武器在其最后一个武器插槽中此代码可以工作,但武器顺序随每个单元而变化。
我怎样才能改变nCover
至 0
对于 Siege
weapon 但对于所有其他情况,更改为原始值而不更改 Siege
武器 nCover
?我应该用一个循环来做到这一点,但找不到把它放在哪里以及我应该使用哪个循环。
最佳答案
我的意思是你应该计算每件武器的伤害,而不是之后, 所以你应该有这样的东西:
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;
}
关于c++ - 仅为特定条件重置变量值,为其他一切设置固定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149423/