我正在 Xamarin 中开发一款 Android 游戏,但我有两个非常干燥的特定部分(不要重复自己)。
第一部分是当我想要更改音轨(音频播放)或背景时,我根据级别为同一音轨设置了三种不同的音高,对于背景 Canvas 交替的背景也有相同的音高。
对于这些方法,条件基于等于玩家所在级别的整数级别。
示例代码
private void SetBackgrounds()
{
if (level == 5)
{
gameAreaCanvas.SetBackgroundResource(Resource.Drawable.LevelUpOneBackground);
}
else if (level == 10)
{
gameAreaCanvas.SetBackgroundResource(Resource.Drawable.LevelUpTwoBackground);
}
else if (level == 15)
{
gameAreaCanvas.SetBackgroundResource(Resource.Drawable.LevelUpThreeBackground);
}
}
代码的不同部分也是如此,其中 alot 基于整数值(即级别)。每次玩家将级别整数递增一,然后该 Activity 具有检查整数级别的方法。该代码可以工作,但显然效率非常低,因为有很多重复的代码,只需稍加调整即可。
例如,关卡如下所示。
if(level == 1) {
levelDisplay.Text = "LEVEL 1";
timer = new Timer();
timer.Interval = 2000; /// DIFFERENT
timer.Enabled = true;
timer.Elapsed += Level1; /// DIFFERENT
timer.Start();
}
///LEVEL 2
if (level == 2)
{
levelDisplay.Text = "LEVEL 2";
timer = new Timer();
timer.Interval = 2000; /// DIFFERENT
timer.Enabled = true;
timer.Elapsed += Level2; /// DIFFERENT
timer.Start();
}
有没有办法让这段代码不那么干燥?感谢您的意见。
最佳答案
第一部分可精简如下:
canvas.SetBackgroundResource( level == 5? Resource.Drawable.LevelUpOneBackground :
level = 10? Resource.Drawable.LevelUpTwoBackground :
Resource.Drawable.LevelUpThreeBackground );
或者,更好的是,创建一个字典,将级别数字映射到背景,这样你就可以得到这个:
gameAreaCanvas.SetBackgroundResource( resourcesFromLevels[level] );
简化第二部分有点复杂。
在这种情况下,一种可能的解决方案是继承。
您创建一个新的抽象类级别
来表示游戏的级别,并为每个特定级别创建该类的子类。因此,您将拥有 class Level1: Level
、class Level2: Level
等等。基类有一个 Setup()
方法,该方法通过调用自身可重写来工作,每个可重写都有一个默认实现,但 Level
的后代可以提供自己的实现。
此外,并非所有事情都必须由可重写处理。 Level 类可以接受一些构造函数参数,例如级别名称,然后每个后代都可以向基类提供正确的级别名称。所以,它看起来像这样:
class Level
{
readonly string levelName;
Level( String levelName )
{
this.levelName = levelName;
}
void Setup()
{
levelDisplay.Text = levelName;
SetupTimer();
}
virtual void SetupTimer()
{
//Default implementation
}
}
class Level1: Level
{
Level1() : Level( "LEVEL 1" )
{
}
override void SetupTimer()
{
//Level1 implementation
}
}
关于c# - 如何在没有多个 if 语句的情况下检查条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44377500/