我试图做的是非常简单和简单,但我想知道是否有一个更优雅的解决方案。
基本上我有一场比赛,我想在比分在100到500之间的时候增加难度,当比分在500到1500之间时再增加一次,然后当比分在1500到3000之间时再增加一次。总之,难度应该增加3倍。
我要查一下:
这是我得到的。
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:我应该提到,上面的方法被称为每帧多次。
发布于 2014-09-03 20:58:17
小心你的不平等。您已经列出了500两次:一次是if (Score <= 500),另一次是else if (Score >= 500)。这是令人困惑的,因为第一个条件优先。
我认为使用一个状态变量表示当前的难度级别会更好。如果使用级别触发机制而不是边缘触发机制来确定NewDifficulty,代码也会更简单。
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;
}
}如果这个游戏的分数永远不会下降,那么你可以进一步简化它:
void IncreaseScore()
{
Difficulty = (Score < 100) ? 0
: (Score <= 500) ? 1
: (Score <= 1500) ? 2
: 3;
}发布于 2014-09-03 21:27:08
关于命名的一个简短的说明:
bool Increased100500 = false;bool Increased5001500 = false;bool Increased15003000 = false;
拜托,别那么做。我的意思是,是的,私有字段首先应该是camelCase,但这组数字相当烦人,它将游戏逻辑编码为标识符。
如果您想改变您的级别,更不用说让它们可配置,那么100500将告诉维护人员什么呢?
请考虑使用这样的名称:
var increasedLevel1 = false;
var increasedLevel2 = false;
var increasedLevel3 = false;这仍在将3个困难级别编码到标识符中,但至少阈值不是变量名称的一部分,所以这是一个开始。
发布于 2014-09-03 22:02:43
你不会谈论这个分数是否会下降,或者这个分数是否有可能跳过一个难度范围。如果这两件事都不可能,那么通过使用enum,设置困难的逻辑就会变得非常简单。
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;
//...
}
}
}但是,正如你所看到的,这会很快地重复。另一种方法是构造一个定义数据点的表。
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;
}
}https://codereview.stackexchange.com/questions/61889
复制相似问题