/*------------------------------ ex8_6.java ビンゴ改良版(2次元配列未使用) -------------------------------*/ import java.util.Random; import java.util.Scanner; class ex8_6 { public static void main(String[] args) { int num = 5; // ビンゴ版サイズ(5×5) int a[] = new int[num*num]; // ビンゴ版用配列 int b[] = new int[num*num*2]; // ビンゴボール用配列(5×5×2) int c[] = new int[num*2+2]; // ビンゴ判定用配列(5*2+2は,縦・横・斜め用) int i, j, k, tmp, r1, c1, usr, bingo; Random rnd = new Random(); Scanner stdIn = new Scanner(System.in); a[0] = 11 + rnd.nextInt(100/(num*num)); for (i = 1; i < num*num; i++) { a[i] = a[i-1] + 1 + rnd.nextInt(100/(num*num)); // ビンゴ版:初期化(11〜99をランダムに割り当て) } b[0] = 11 + rnd.nextInt(100/(num*num)); for (i = 1; i < num*num*2; i++) { b[i] = b[i-1] + 1 + rnd.nextInt(100/(num*num*2)); // ビンゴボール:初期化(11〜99をランダムに割り当て) } k = 0; while (k<10000) { // ビンゴ版とボールの初期設定(数値のシャッフル10000回) r1 = rnd.nextInt(num*num); // 0〜24の整数乱数を生成 c1 = rnd.nextInt(num*num); tmp = a[r1]; // 数値のスワップ:ビンゴ版[r1]と[c1]を入れ替え a[r1] = a[c1]; a[c1] = tmp; r1 = rnd.nextInt(num*num*2); // 0〜49の整数乱数を生成 c1 = rnd.nextInt(num*num*2); tmp = b[r1]; // 数値のスワップ:ビンゴボール[r1]と[c1]を入れ替え b[r1] = b[c1]; b[c1] = tmp; k++; } /* ビンゴゲームスタート */ System.out.println("-------- Bingo Game! ---------"); for (i = 0; i < num*num; i++) { System.out.printf(" %2d", a[i]); if ((i+1)%5 == 0) System.out.println(); } System.out.println("------------------------------"); k = 0; // 繰り返し回数用 bingo = 0; // ビンゴ判定用 while (k < num*num*2) { if (bingo == 0) { // bingoフラグが0ならまだビンゴでないので処理継続 System.out.print(" 次のボールを引きます [Yes = 1, No = 0] --> "); usr = stdIn.nextInt(); if (usr == 0) { // もうやめる場合は終了(whileループを抜ける) break; } } else { // bingoフラグが1ならビンゴなので終了(whileループを抜ける) break; } System.out.printf(" %2d回目の当たり数字は [%2d]\n", k+1, b[k]); for (i = 0; i < num*num; i++) { if (a[i] == b[k]) { a[i] = 0; } } /* ビンゴ判定:ビンゴ版の縦・横・斜めの和を計算 */ for (i = 0; i < num*2+2; i++) { c[i] = 0; } for (i = 0; i < num; i++) { // c[0]〜c[4] は縦の和(ex. c[5] = a[0]+a[5]+a[10]+a[15]+a[20]) for (j = 0; j < num; j++) { c[i] += a[i+5*j]; } } for (i = 0; i < num; i++) { // c[5]〜c[9] は横の和(ex. c[0] = a[0]+a[1]+a[2]+a[3]+a[4]) for (j = 0; j < num; j++) { c[i+5] += a[5*i+j]; } } for (i = 0 ;i < num; i++) { // c[10],c[11] は斜めの和 c[10] += a[i+5*i]; // (ex. c[10] = a[0]+a[6]+a[12]+a[18]+a[24]) c[11] += a[5*(i+1)-i-1]; // (ex. c[11] = a[4]+a[8]+a[12]+a[16]+a[20]) } /*--- ビンゴ判定 ---*/ for (i = 0; i < num*2+2; i++) { if (c[i] == 0) { // いずれかの和が0ならビンゴ列が存在 System.out.println("\n ★☆★ Bingo! Congratulations ☆★☆ \n"); bingo = 1; break; } } for (i = 0; i < num*num; i++) { // 現在のビンゴ版表示 System.out.printf(" %2d", a[i]); if ((i+1)%5 == 0) System.out.println(); } System.out.println("------------------------------"); k++; } if (k == num*num*2 && bingo == 0) { // 玉が出尽くし,かつ,まだビンゴでないならゲーム・オーバー System.out.println("\n玉切れです.ゲーム・オーバー\n"); } else { System.out.println("\n終了します.また会いに来てね\n"); } } }