すごろくゲームを通して繰り返し処理を覚えよう

こんにちは、雑記ラビリンスです。

今回は、Javaですごろくゲームを作り繰り返し処理を学んでいきます。

繰り返し処理は「if文」同様プログラミング言語では必須の考え方になってきます。
なぜなら繰り返し処理はどの言語でも用いられているからです。

今回は、すごろくゲームを通して繰り返し処理を使えるようになりましょう。

まずはソースコードの全体図です。

package src;

public class Kurikaesi {
    public static void main(String[] args) {
        //ゴールについたらフラグを立てる
        int flg = 0;
        final int GOAL = 20;
        //masume 初期化
        int masume[] = {0,0,0,0,0,0};
        String name[] = {"curedream","curebeauty","curegrace","cureheart","curesparcle","curemelody"};

        //誰かがゴールにつくまで繰り返す
        while(flg == 0) {
            //プレイヤー文繰り返す
            for (int i = 0; i < name.length; i++) {
                System.out.println(name[i] + "さんの番です");
                int result = new java.util.Random().nextInt(6) +1;
                //前のマスに加算する
                masume[i] = masume[i] + result;
                System.out.println(result + "つ進んでください");
                if (masume[i] >= GOAL) {
                    System.out.println("GOAL!" + name[i] + "さん、優勝です。");
                    flg = 1;
                    //優勝が決まったのでループを抜ける
                    break;
                }else {
                    System.out.println(name[i] +"さん" + masume[i] + "のマスに到着です。");
                }
            }
        }
    }
}

それでは順番に見ていきましょう

        //ゴールについたらフラグを立てる
        int flg = 0;
        final int GOAL = 20;
        //masume 初期化
        int masume[] = {0,0,0,0,0,0};
        String name[] = {"curedream","curebeauty","curegrace","cureheart","curesparcle","curemelody"};

まず最初に今回使用するパラメータを準備します。

このfinal演算子は変数GOALの上書きを防ぐために設定しています。
またJavaでは慣習的に定数を大文字で書いていきますので覚えいておいてください。
今回はマス目「20」がゴール地点です。

プレイヤーは最初スタート地点にいるのでマス目「0」に設定しています
続いて繰り返し処理の方を見ていきます

        //誰かがゴールにつくまで繰り返す
        while(flg == 0) {
            //プレイヤー文繰り返す
            for (int i = 0; i < name.length; i++) {
                System.out.println(name[i] + "さんの番です");
                int result = new java.util.Random().nextInt(6) +1;
                //前のマスに加算する
                masume[i] = masume[i] + result;
                System.out.println(result + "つ進んでください");
                if (masume[i] >= GOAL) {
                    System.out.println("GOAL!" + name[i] + "さん、優勝です。");
                    flg = 1;
                    //優勝が決まったのでループを抜ける
                    break;
                }else {
                    System.out.println(name[i] +"さん" + masume[i] + "のマスに到着です。");
                }
            }
        }

繰り返し処理は「while文」と「for文」を使用します

「while文」は「while(条件)」で条件が真の間、繰り返し処理を行います。

今回の例では変数flgが「0」の間はずっと繰り返し処理を行います
変数flgが「0」でなくなるのは優勝者が決まった時に「1」にセットします。
続いて「for文」の方に行きます。

「for文」の使い方は「for(初期値、最終値、増加数)」という書き方をします。
今回の例では初期値は変数「i」の値が「0」、最終値が「name.length」、増加数が「1」です。

この「name.length」とは配列「name」の要素数です。要素数とは配列に入っている値の数と思っていおいてください。
すごろくですので順番が回ってきたらサイコロを振ります。その処理が下のコードです。

                System.out.println(name[i] + "さんの番です");
                int result = new java.util.Random().nextInt(6) +1;
                //前のマスに加算する
                masume[i] = masume[i] + result;
                System.out.println(result + "つ進んでください");

続いて条件分岐の処理です。ここではGOALにたどり着いたか否かで処理を分岐させています。

                if (masume[i] >= GOAL) {
                    System.out.println("GOAL!" + name[i] + "さん、優勝です。");
                    flg = 1;
                    //優勝が決まったのでループを抜ける
                    break;
                }else {
                    System.out.println(name[i] +"さん" + masume[i] + "のマスに到着です。");
                }

GOALすなわちサイコロを振って出た値の合計値が最初に20を越えたら優勝ですので、優勝したら
条件が真となります。それ以外は「else」の方に分岐して到着したマス目を表示します。

このゲームでは最初にゴールした人がいる時点でゲームが終了になりますので「break」で繰り返しから抜けています。

「break」を入れないとこんな結果になります

curedreamさんの番です
4つ進んでください
curedreamさん4のマスに到着です。 
curebeautyさんの番です
6つ進んでください
curebeautyさん6のマスに到着です。
curegraceさんの番です
2つ進んでください
curegraceさん2のマスに到着です。
cureheartさんの番です
2つ進んでください
cureheartさん2のマスに到着です。
curesparcleさんの番です
5つ進んでください
curesparcleさん5のマスに到着です。
curemelodyさんの番です
2つ進んでください
curemelodyさん2のマスに到着です。
curedreamさんの番です
2つ進んでください
curedreamさん6のマスに到着です。
curebeautyさんの番です
2つ進んでください
curebeautyさん8のマスに到着です。
curegraceさんの番です
4つ進んでください
curegraceさん6のマスに到着です。
cureheartさんの番です
5つ進んでください
cureheartさん7のマスに到着です。
curesparcleさんの番です
6つ進んでください
curesparcleさん11のマスに到着です。
curemelodyさんの番です
6つ進んでください
curemelodyさん8のマスに到着です。
curedreamさんの番です
5つ進んでください
curedreamさん11のマスに到着です。
curebeautyさんの番です
6つ進んでください
curebeautyさん14のマスに到着です。
curegraceさんの番です
4つ進んでください
curegraceさん10のマスに到着です。
cureheartさんの番です
5つ進んでください
cureheartさん12のマスに到着です。
curesparcleさんの番です
1つ進んでください
curesparcleさん12のマスに到着です。
curemelodyさんの番です
6つ進んでください
curemelodyさん14のマスに到着です。
curedreamさんの番です
3つ進んでください
curedreamさん14のマスに到着です。
curebeautyさんの番です
1つ進んでください
curebeautyさん15のマスに到着です。
curegraceさんの番です
1つ進んでください
curegraceさん11のマスに到着です。
cureheartさんの番です
4つ進んでください
cureheartさん16のマスに到着です。
curesparcleさんの番です
6つ進んでください
curesparcleさん18のマスに到着です。
curemelodyさんの番です
4つ進んでください
curemelodyさん18のマスに到着です。
curedreamさんの番です
4つ進んでください
curedreamさん18のマスに到着です。
curebeautyさんの番です
3つ進んでください
curebeautyさん18のマスに到着です。
curegraceさんの番です
1つ進んでください
curegraceさん12のマスに到着です。
cureheartさんの番です
3つ進んでください
cureheartさん19のマスに到着です。
curesparcleさんの番です
4つ進んでください
GOAL!curesparcleさん、優勝です。
curemelodyさんの番です
5つ進んでください
GOAL!curemelodyさん、優勝です。

優勝者が二人出てしまっています。なぜなら「for文」はプレイヤー6人分を繰り返しているため、
途中の人が先にゴールする場合も当然あります。しかし最初にゴールした人が優勝ですので
この場合は優勝者が出た時点で「for文」を終わらせる必要が出てきます。

「break」は処理を途中で抜けループを中断できるので優勝者が出た時点で次の人の番にならずに済むのです。

実際に流してみた結果です。

curedreamさんの番です
6つ進んでください
curedreamさん6のマスに到着です。 
curebeautyさんの番です
6つ進んでください
curebeautyさん6のマスに到着です。
curegraceさんの番です
5つ進んでください
curegraceさん5のマスに到着です。
cureheartさんの番です
1つ進んでください
cureheartさん1のマスに到着です。
curesparcleさんの番です
1つ進んでください
curesparcleさん1のマスに到着です。
curemelodyさんの番です
4つ進んでください
curemelodyさん4のマスに到着です。
curedreamさんの番です
4つ進んでください
curedreamさん10のマスに到着です。
curebeautyさんの番です
1つ進んでください
curebeautyさん7のマスに到着です。
curegraceさんの番です
3つ進んでください
curegraceさん8のマスに到着です。
cureheartさんの番です
5つ進んでください
cureheartさん6のマスに到着です。
curesparcleさんの番です
3つ進んでください
curesparcleさん4のマスに到着です。
curemelodyさんの番です
4つ進んでください
curemelodyさん8のマスに到着です。
curedreamさんの番です
6つ進んでください
curedreamさん16のマスに到着です。
curebeautyさんの番です
5つ進んでください
curebeautyさん12のマスに到着です。
curegraceさんの番です
1つ進んでください
curegraceさん9のマスに到着です。
cureheartさんの番です
3つ進んでください
cureheartさん9のマスに到着です。
curesparcleさんの番です
3つ進んでください
curesparcleさん7のマスに到着です。
curemelodyさんの番です
6つ進んでください
curemelodyさん14のマスに到着です。
curedreamさんの番です
5つ進んでください
GOAL!curedreamさん、優勝です。

優勝者が出た時点で次の人の番にはならず処理が終了しています。

まとめ

繰り返し処理である「while」と「for」についてすごろくゲームを通して解説しました。
一つの言語で理解してしまえば、どの言語でも考え方は同じですのでぜひマスターしてください。

おしまい