0

我想创建一个 Simon Says 游戏来提高我的编程技能,这比我想象的要难。所以最初我决定最多有 50 个级别,所以我在 1-4 之间生成 50 个随机数并将它们存储在一个数组中,我在控制台中测试了它的工作原理:

    for(int i = 0; i <50; i++){
        random = randomGenerator.nextInt(4)+1;
        array[i] = random;
        System.out.println(Integer.toString(i)+" " + Integer.toString(array[i]));  
    }

接下来我调用一个名为 play 的方法来运行游戏,在这个方法中我有 for 循环运行 50 次,它检查我的数组的索引 i 是否为 1、2、3 或 4,然后为编号按钮着色。

public void play(){

    for(int i =ii; i<50; i++){
        if(b1bool==false){
            if(array[i] == 1){
                //Set button to Blue
                b1.setBackgroundColor(0xFF0000FF);



            }

            else if(array[i] == 2){
                //SEt button to Yellow
                b2.setBackgroundColor(0xFFFFFF00);


            }


            else if(array[i] == 3){
                //SEt button to Red
                b3.setBackgroundColor(0xFFFF0000);


            }


            else if(array[i] == 4){
                //SEt button to Green
                b4.setBackgroundColor(0xFF00FF00);


            }

            b1bool = true;
        }
    }
}

我正在使用 bool 来停止 for 循环,目前通过按下 button1 继续 for 循环:

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:

        b1.setBackgroundColor(0xffffffff);
        b2.setBackgroundColor(0xffffffff);
        b3.setBackgroundColor(0xffffffff);
        b4.setBackgroundColor(0xffffffff);
        b1bool=false;
        ii++;
        play();



        break;
    case R.id.button2:
        if(b2bool == true)
        {


        }

        break;
    case R.id.button3:
        if(b3bool == true)
        {


        }

        break;
    case R.id.button4:
        if(b4bool == true)
        {


        }

        break;
    }   
}

我来 Stackoverflow 是因为我解决编程问题的常用方法通常很长,而且根本没有效率,当你给我一个解决方案或我想要的解决方案的一部分时,我需要你有经验的程序员关于如何解决问题的建议知道你是如何到达那里的,这样我就可以学习比现在更好的方法。

我正在考虑为 50 个级别中的每一个创建一个方法,并在其中运行每个级别的代码,并在 for 循环中调用它 50 次,这不是一个好的解决方案,但到目前为止我能想到的唯一方法这。任何意见是极大的赞赏。

4

1 回答 1

2

像这样的状态机可能会导致代码曲折,我相信这就是您所看到的。

考虑删除循环并使用用户/系统输入事件触发您的“播放”代码:按钮按下和活动的生命周期回调。您将能够删除所有标志检查代码。

此外,考虑使用单独的类 - 面向对象来实现每个“指令”和“正确输入”。这将使您的代码更具可扩展性,同时限制代码膨胀添加新的交互。您可以查看您的示例是否是 switch 语句占用了很多行。想象一下,只需要遍历一组“响应”,直到找到与用户所做操作相匹配的匹配项。

在此处输入图像描述

您会注意到缺少提供的代码示例。作为一种学习经验,我的建议的实施是一个巧妙的实验,示例可能会限制所教授的课程。

于 2013-05-08T10:01:16.723 回答