/*------------ ex8_1.java レースゲーム ------------*/ import java.util.Scanner; import java.util.Random; class ex8_1 { public static void main(String[] args) { int i, j, n, flag, lb, ci, rb, usr; float mov; Random rnd = new Random(); Scanner stdIn = new Scanner(System.in); char[] spc = new char[40]; // 1ステップ描画用配列 n = 30; // レースの長さ(30回) lb = 5; // 初期化:壁左位置 ******←ここ *************** rb = 15; // 初期化:壁右位置 ****** ここ→*************** ci = (lb+rb)/2; // 初期化:マシン位置****** V←ここ*************** for (i = 0; i < lb; i++) spc[i] = '*'; // 壁の左側を「*」で描画 for (i = lb; i < rb; i++) spc[i] = ' '; // 道路を「 」で描画 for (i = rb; i < spc.length; i++) spc[i] = '*'; // 壁の右側を「*」で描画 spc[ci] = 'V'; // 自マシン位置にマシン「V」を描画 flag = 1; // ゲームを続けるかどうかのフラグ「1:続ける, 0:やめる」 System.out.println("--------------------------------------------------"); System.out.println(" R a c e G a m e !! "); System.out.println(); System.out.println("取説: [V]...マシン, [*]...壁, [1]=左へ, [2]=右へ "); System.out.println(); System.out.println("--------------------------------------------------"); while (flag == 1) { System.out.print(" Ready ? [yes = 1] --> "); stdIn.nextInt(); System.out.println(" G o ! "); for (j = 0; j < n; j++) { // レースの長さ(30回)だけ以下を繰り返す for (i = 0; i < spc.length; i++) { // 最初の「壁・道路・マシン」描画 System.out.print(spc[i]); } if (lb == 0) { // 左の壁が左限界までいっているなら右に戻す lb++; rb++; } else if (1 <= lb && lb <= spc.length/2) { // 左の壁位置が1〜真ん中までなら mov = rnd.nextFloat(); // 0.0〜1.0の一様擬似乱数を生成 if (mov >= 0.3) { // 乱数が0.3以上なら壁を右に1つ移動 lb++; rb++; } else { // そうでなければ壁を左に1つ移動 lb--; rb--; } } else if (spc.length/2 < lb && lb < spc.length-10) { // 左の壁位置が真ん中〜右-10までなら mov = rnd.nextFloat(); // 0.0〜1.0の一様擬似乱数を生成 if (mov >= 0.3) { // 乱数が0.3以上なら壁を左に1つ移動 lb--; rb--; } else { // そうでなければ壁を右に1つ移動 lb++; rb++; } } else if (lb == spc.length-10) { // 左の壁が右限界までいっているなら左に戻す lb--; rb--; } usr = stdIn.nextInt(); // プレイヤーが左「1」か右「2」にマシンを動かす if (usr == 1) { // 左に動かしたなら左へ ci--; } else if (usr == 2) { // 右に動かしたなら右へ ci++; } for (i = 0; i < lb; i++) spc[i] = '*'; for (i = lb; i < rb; i++) spc[i] = ' '; for (i = rb; i < spc.length; i++) spc[i] = '*'; spc[ci] = 'V'; if (ci <= lb || ci >= rb) { // 当たり判定(マシンが左壁か右壁に衝突したらゲームオーバー System.out.println("------- Crash!!! -------"); System.out.println(" G a m e O v e r ..."); break; } } if (lb < ci && ci < rb) { // 終了後(30回後)当たり判定 System.out.println("--------- G O A L !!! ---------"); System.out.println(" C o n g r a t u l a t i o n s "); System.out.println("-------------------------------"); } System.out.println("終了しますか? [終了=0, 続ける=1] --> "); flag = stdIn.nextInt(); ci = (lb+rb)/2; } System.out.println("終了します.また来てね"); } }