首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据分数增加难度

根据分数增加难度
EN

Code Review用户
提问于 2014-09-03 20:34:59
回答 10查看 3.1K关注 0票数 18

我试图做的是非常简单和简单,但我想知道是否有一个更优雅的解决方案。

基本上我有一场比赛,我想在比分在100到500之间的时候增加难度,当比分在500到1500之间时再增加一次,然后当比分在1500到3000之间时再增加一次。总之,难度应该增加3倍。

我要查一下:

  1. 不管我是否在其中一个范围内。
  2. 当我进入那个范围时,我是否已经提高了分数。

这是我得到的。

代码语言:javascript
复制
bool Increased100500 = false;
bool Increased5001500 = false;
bool Increased15003000 = false;

void IncreaseScore()
{
    if (Score >= 100 && Score <= 500 && !Increased100500)
    {
        Increase();
        Increased100500 = true;
    } 
    else if (Score >= 500 && Score < 1500 && !Increased5001500)
    {
        Increase();
        Increased5001500 = true;
    } 
    else if (Score >= 1500 && !Increased15003000)
    {
        Increase();
        Increased15003000 = true;
    } 
}

LE:我应该提到,上面的方法被称为每帧多次。

EN

回答 10

Code Review用户

回答已采纳

发布于 2014-09-03 20:58:17

小心你的不平等。您已经列出了500两次:一次是if (Score <= 500),另一次是else if (Score >= 500)。这是令人困惑的,因为第一个条件优先。

我认为使用一个状态变量表示当前的难度级别会更好。如果使用级别触发机制而不是边缘触发机制来确定NewDifficulty,代码也会更简单。

代码语言:javascript
复制
int Difficulty;

void IncreaseScore()
{
    int NewDifficulty = (Score <   100) ? 0
                      : (Score <=  500) ? 1
                      : (Score <= 1500) ? 2
                                        : 3;
    // One-way ratchet: difficulty can only increase, even if the
    // score subsequently drops.
    if (NewDifficulty < Difficulty)
    {
        Difficulty = NewDifficulty;
    }
}

如果这个游戏的分数永远不会下降,那么你可以进一步简化它:

代码语言:javascript
复制
void IncreaseScore()
{
    Difficulty = (Score <   100) ? 0
               : (Score <=  500) ? 1
               : (Score <= 1500) ? 2
                                 : 3;
}
票数 19
EN

Code Review用户

发布于 2014-09-03 21:27:08

关于命名的一个简短的说明:

bool Increased100500 = false;bool Increased5001500 = false;bool Increased15003000 = false;

拜托,别那么做。我的意思是,是的,私有字段首先应该是camelCase,但这组数字相当烦人,它将游戏逻辑编码为标识符。

如果您想改变您的级别,更不用说让它们可配置,那么100500将告诉维护人员什么呢?

请考虑使用这样的名称:

代码语言:javascript
复制
var increasedLevel1 = false;
var increasedLevel2 = false;
var increasedLevel3 = false;

这仍在将3个困难级别编码到标识符中,但至少阈值不是变量名称的一部分,所以这是一个开始。

票数 15
EN

Code Review用户

发布于 2014-09-03 22:02:43

你不会谈论这个分数是否会下降,或者这个分数是否有可能跳过一个难度范围。如果这两件事都不可能,那么通过使用enum,设置困难的逻辑就会变得非常简单。

代码语言:javascript
复制
enum Difficultly { Normal, Hard, Harder, Hardest }

class State
{
  private Difficultly _currentDifficultly = Difficultly.Normal;
  private int _score = 0;

  public void UpdateDifficulty()
  {
    switch(_currentDifficulty)
    {
      case Normal:
        if (_score  >= 100)
        {
          _currentDifficulty = Difficulty.Hard;
        }
        break;
      case Hard:
        if (_score  >= 500)
        {
          _currentDifficulty = Difficulty.Harder;
        }
        break;
      //...
    }
  }
}

但是,正如你所看到的,这会很快地重复。另一种方法是构造一个定义数据点的表。

代码语言:javascript
复制
Dictionary<Difficulty, Tuple<int, Difficulty>> _difficultyTransitions = new Dictionary<Difficulty, Tuple<int, Difficulty>>()
{
  { Difficulty.Normal, new Tuple<int, Difficulty>(100, Difficulty.Hard)},
  { Difficulty.Hard, new Tuple<int, Difficulty>(500, Difficulty.Harder)},
  { Difficulty.Harder, new Tuple<int, Difficulty>(1500, Difficulty.Hardest)},
  { Difficulty.Hardest, new Tuple<int, Difficulty>(int.MaxValue, Difficulty.Hardest)},
};

public void UpdateDifficulty()
{
  var transition = difficultyTransitions[_currentDifficulty];
  if (_score >= transition.Item1)
  {
    _currentDifficulty = transition.Item2;
  }
}
票数 12
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/61889

复制
相关文章

相似问题

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