【问题标题】:Reseting value of variable just for specific condition and fixed value for everything else仅针对特定条件重置变量值,为其他所有内容重置固定值
【发布时间】:2017-07-17 16:37:30
【问题描述】:

我正在更新游戏。

在游戏中,有不同数量的武器单位。就像:带有(Baneblade Cannoon,Demolisher Cannon and Heavy Bolter)的Baneblade Super Heavy Tank。
有些武器具有特殊的武器特性,而有些则没有。具有零特征的武器显示为“”(不为空,只有空格)。
在我的例子中,毒刃加农炮是"",毁灭者加农炮是"Siege",重型爆矢枪是""
我想做的是:如果武器有"Siege" trait,敌人的掩护将被忽略,它将是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 武器特性则毫无意义。这就像0 OR 0 OR 1 情况。
如果一个单位在其最后一个武器槽中拥有Siege 武器,则此代码可以工作,但每个单位的武器顺序都会发生变化。
我如何将nCoverSiege 武器更改为0,但对于其他情况,在不更改Siege 武器nCover 的情况下更改为其原始值?我应该使用循环来执行此操作,但找不到放置它的位置以及我应该使用哪个循环。

【问题讨论】:

  • 你为什么要改变这个值?我的意思是球员的掩护并不取决于针对他的目标。只是某些武器忽略了该值(无论它是什么,无需修改)
  • 换句话说:为什么“......特质,敌人的掩护将被忽略,它将为“0””,而不仅仅是“敌人的掩护将被忽略。” ?为什么在忽略它的情况下将值设置为 0?
  • 我在最后阶段进入了这个过程。当他们建立这样的系统时,我不在场......在游戏中,掩护奖金就像10、25、30、50(最多)一样。所以如果他们是0,攻城武器计算它的伤害就好像没有掩护一样。你的说法其实是一样的。如果我不重置“掩体”,所有武器都会忽略掩体。这不是将其值更改为“0”或“忽略它”。这是关于在适当的时候重置值。
  • 如果你遍历你的武器,你可以计算掩护,计算伤害(为下一个武器恢复掩护)。
  • @Jarod42 感谢您的想法。我会尽力做到这一点。顺便说一句,也感谢您编辑代码,它给了我另一个想法。

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


【解决方案1】:

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

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;
}

【讨论】:

  • 谢谢你的回答,我会尝试这样的。但实际上相同的代码已经在代码中(用于武器的循环,nDefCover 声明)。没有弹药数量,但没关系,我明白你的意思。但是,损坏函数在另一个函数中,称为 ApplyDamage(int nUnit int nHP)。我需要喜欢;为攻城武器存储 nCover,但“同时”为其他所有东西恢复它......再次感谢您。
【解决方案2】:

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

在那之后,我将nDefCover 的值添加到nFinalAccuracy 的值中以获得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;
  }
}

我认为它的工作原理是;武器开火,计算敌人和玩家单位的主动权,对双方施加伤害并继续下一个武器,在检查其他武器的特征之前,它将nFinalAccuracy重置为原始值。
到目前为止,代码似乎适用于任何武器。

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多