0

私は完成した単純なサイモンの記憶ゲームを作成しようとしていますが、コードは専門的ではありませんでした. 私が理解できない唯一の部分は、ハンドラーを正しく使用する方法です。これを1週間試みた後、助けが必要です。そのため、現在 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++;  
    }   
}

したがって、上記のコードは色を点灯させ、サウンドをすばやく再生します。2 番目の 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ループにあるはずだと思いますが、ここでの最良の解決策とその方法はわかりません. 複数の Handler を持つべきか、1 つだけ持つべきか、単一の Handler が最適であると感じました。

色と音を再生してから 0.5 秒後に次の音と色を再生する必要があるため、各メソッド呼び出しの間に 0.5 秒間隔を空ける必要があります。各メソッド呼び出しの後にアクティビティを一時停止してみてください。プログラミングを改善する必要があるため、これに関するアドバイスは素晴らしいでしょう。ありがとうございました。

4

1 に答える 1

0

必ず 1 つの Handler を使用し、Runnables はパラメーターの受け渡しに関しては苦手なため避け、代わりにメッセージを使用して handleMessage() で処理します。

于 2013-06-11T19:09:04.327 に答える