こんにちは、雑記ラビリンスです。
今回は、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」についてすごろくゲームを通して解説しました。
一つの言語で理解してしまえば、どの言語でも考え方は同じですのでぜひマスターしてください。
おしまい