c# - 如何在没有多个 if 语句的情况下检查条件?

标签 c# android if-statement dry

我正在 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: Levelclass 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/

相关文章:

c# - 如何在 C# 中格式化异常的堆栈跟踪?

android - 如何使用上下文菜单获取 Edittext 数据?

javascript - 将条件语句应用于数组中的每个元素

c - 冗余的 if-else 如何帮助优化?

c# - Winforms 文本框掩码

c# - 如何上传/转换 *.docx 到谷歌文档?谷歌云端硬盘 API v3

尝试在扩展类型 T 上实现抽象泛型类时出现 C# 编译错误

安卓 : clear listview in Listadapter

java - AcharEngine制作日期相关图表

php - 停止为PHP提供错误number_format