0

我一直在尝试创建一个简单的西蒙记忆游戏,我完成了但代码不专业,我正在重做它并希望学习如何正确地做。我唯一不知道的是如何正确使用处理程序,经过一周的尝试,我需要一些帮助。所以我有一个充满数字的数组,现在有 20 个数字,每个数字在 1 到 4 之间随机。一些代码根据数组中的数字调用某个方法,为了测试我想运行游戏来玩前 20 个关卡自动,这是游戏循环代码:

// First time pass 1 to Level method
public void Level(int lvl) {

    // for 20 times, once for each number in the array index
    for (int j = 0; j < 20; j++) {

        // lvl is initialsed to 1 so the first time it does this once
        for (int i = 0; i <= lvl; i++) {

            // Call checknumber method and pass arrayindex value
            checknumber(array[i]);
        }

        lvl++;  
    }   
}

所以上面的代码会点亮一种颜色并快速播放声音,我尝试在我的第二个 for 循环中执行此操作,但它要求将 i 变量设置为 final,这不起作用,我再次尝试了解它的原因需要是最终的,无法理解:

        for (int i = 0; i <= lvl; i++) {
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    // Call checknumber method and pass arrayindex value
                    checknumber(array[i]);
                }
            }, amount);

        }

所以在我的 checknumber 方法中,我有这个:

public void checknumber(int a) {
    //if number passed is 1 then play green button
    if (a == 1) {
        green();
    }

    //if number passed is 2 then play green button
    if (a == 2) {
        red();
    }

    //if number passed is 3 then play green button
    if (a == 3) {
        yellow();
    }

    //if number passed is 4 then play green button
    if (a == 4) {
        blue();
    }
}

调用这些方法:

public void green() {
    s1();
    b1.setBackgroundResource(R.drawable.b1tlchanged);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            b1.setBackgroundResource(R.drawable.b1tl);
        }
    }, amount);
}

public void red() {
    s2();
    b2.setBackgroundResource(R.drawable.b2trchanged);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            b2.setBackgroundResource(R.drawable.b2tr);
        }
    }, amount);
}

public void yellow() {
    s3();
    b3.setBackgroundResource(R.drawable.b3blchanged);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            b3.setBackgroundResource(R.drawable.b3bl);
        }
    }, amount);
}

public void blue() {
    s4();
    b4.setBackgroundResource(R.drawable.b4brchanged);
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            b4.setBackgroundResource(R.drawable.b4br);
        }
    }, amount);
}

您可以看到我拥有的当前处理程序并且它们不起作用,因为我认为它们位于错误的位置,它们应该在我的 for 循环中是我的想法,但我不知道这里最好的解决方案是什么以及如何去做. 如果我有多个处理程序,或者只有一个,我觉得一个处理程序是最好的。

我需要播放一种颜色和声音,然后在半秒后播放下一个声音和颜色,所以在每个方法调用之间有半秒,我应该尝试在每个方法调用后暂停活动吗?任何关于这方面的建议都会很棒,因为我需要在编程方面做得更好。谢谢你。

4

1 回答 1

0

绝对使用一个处理程序,并避免 Runnables,因为当涉及到参数传递时,它们是穷人,使用 Messages 而不是在 handleMessage() 中处理它们

于 2013-06-11T19:09:04.327 回答