首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅适用于特定条件的变量的重新计算值和其他所有事物的固定值。

仅适用于特定条件的变量的重新计算值和其他所有事物的固定值。
EN

Stack Overflow用户
提问于 2017-07-17 16:37:30
回答 2查看 63关注 0票数 1

我在更新一个游戏。

在游戏中,有不同数量的武器单位。比如:香蕉刃超重坦克(Bane刀片Can正午,Demolisher Cannon和Heavy Bolter)。

有些武器有特殊的武器特征,而另一些则没有。零特征的武器被显示为"“(不为空,只有空间)。

在我的例子中,Bane刀片Cannon是"",Demolisher Cannon是"Siege",Heavy Bolter是""

我想要做的是:如果一个武器具有"Siege"特征,敌人的掩护将被忽略,它将是0

我可以这样做:

代码语言:javascript
复制
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更改为0 for Siege武器,但对于任何其他情况,在不更改Siege nCover的情况下,更改其原始值?我应该用一个循环来完成这个任务,但是还没有找到放置它的位置和应该使用的循环。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-19 14:59:03

我以一种不可思议的方式解决了这个问题.

首先,我从代码顶部和ifs中删除了nDefCover定义。

然后我在const auto& traits的上面写了一个定义为:nFinalAccuracy = max(0, min(100, nFinalAccuracy));

在那之后,我把nDefCover的价值增加到了nFinalAccuracySiege和其他必要武器的价值。

最后代码是:

代码语言:javascript
复制
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重置为原始值。

到目前为止,代码似乎适用于任何武器。

票数 0
EN

Stack Overflow用户

发布于 2017-07-19 12:15:35

我的意思是,你应该计算每件武器的伤害,而不是事后,所以你应该有这样的东西:

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

通过以下方式:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45149423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档