質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

5501閲覧

Javaでビンゴゲームのコードを作成したい

lino

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2022/08/31 01:10

前提

Java初心者が研修でビンゴカードゲームを作っています。

実現したいこと

下記2問です。
1.縦5マス、横5マス、計25マスのそれぞれに1〜75までの数字をランダムに配置する。
2.1で作成したビンゴカードでビンゴゲームを行った経過を示す。
例↓
26 64 27 23 17
34 54 65 37 25
24 30 - 57 44
35 68 43 3 18
13 42 38 73 10
1個目: 13
26 64 27 23 17
34 54 65 37 25
24 30 - 57 44
35 68 43 3 18

  • 42 38 73 10

2個目:50
ビンゴになるまで続く...

発生している問題・エラーメッセージ

ネットにあったコードのコピペで問題1は出来ました。問題2に移るために問題1のコードの内容を理解しようとして1行づつ調べていきましたが、途中で処理の意味が分からなくなりました。

よって問題2を解くためのあたりもつけられない状況です。

該当のソースコード

Java

1//ArraylistはListインターフェイスを実装したクラス。 2//java.util.Collectionsは便利な機能が色々入っているクラス。 3 4import java.util.ArrayList; 5import java.util.Collections; 6 7public class Question07 { 8 9//public static void main(String[] args) 10//public どこからでも参照可能、static インスタンス可しなくても外部から使用可能、void 戻り値無し、main メソッド名 11//String[]引数をString型の配列で受け取る、args 引数名。argument 12 public static void main(String[] args) { 13//ArrayListをINT型に指定する。new演算子でクラスからインスタンスを作る。 14//1列目for構文でiに0を代入。iは4以下と指定。iはforで繰り返す毎に0から1づつ増えていく。 15 ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); 16 int num = 1; 17 for (int i = 0; i <= 4; i++) { 18 ArrayList<Integer> list = new ArrayList<>(); 19 for (int j = num; j <= num + 14; j++) { 20 list.add(j); 21 } 22 Collections.shuffle(list); 23 lists.add(list); 24 num += 15; 25 } 26 27 System.out.println(" B | I | N | G | O"); 28 29 for (int i = 0; i <= 4; i++) { 30 for (int j = 0; j <= 4; j++) { 31 if (i == 2 && j == 2) { 32 System.out.print(" "); 33 } else { 34 System.out.printf("%3d", lists.get(j).get(i)); 35 } 36 if (j != 4) { 37 System.out.print(" |"); 38 } 39 } 40 System.out.println(); 41 42 } 43 44 } 45 46} 47//B:1~15 48//I:16~30 49//N:31~45 50//G:46~60 51//O:61~75

試したこと

問題1のコードを理解するために1行づつ意味を調べていきました。理解できた所はコメントアウトでメモをコード中に残しています。

for (int j = num; j <= num + 14; j++) {

ここで、書いてある意味は分かるのですが前後のiとの関係が良く分かりません。
iはBINGOカードの1行目で、jは2行目という意味なのでしょうか?

補足情報(FW/ツールのバージョンなど)

問題1のコードは、ビンゴゲームのルールに則ってBは1~15の数字、Iは16~30の数字と数字に制限があります。これは問題1で指示された内容では無いので守らなくても問題ないのですが、ただ私がネット上に転がっていたコードを使ったので、たまたまビンゴゲームのルールに則ったコードになったというだけです。
詰まっている所も、この数字の制限の所のコードが読めない事だと思っています。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2022/08/31 01:34

> たまたまビンゴゲームのルールに則ったコードになったというだけです。 詰まっている所も、この数字の制限の所のコードが読めない事だと思っています。 えーと、Javaでのプログラミング研修であろうと言うのに、取り組み方がおかしいってように思いますがそんなことは無いですか。問題を理解してそれを解決するプログラムを書くのがプログラミングなのですが。
dodox86

2022/08/31 01:41

> それを解決するプログラムを書くのがプログラミングなのですが。 内容を理解せずにコピペして作り上げることは含みません。プログラマー、あるいはそれを目指す者でないならそれもあり得るでしょうけど。
lino

2022/08/31 01:44

理想はそうですが。現状0から全て書けと言われて無理なのでこの様な手段をとっています。 コピペでも後で1行づづ理解すれば、次に応用できるからです。
jimbe

2022/08/31 05:07

コードが動作するイメージを持つ必要はあるでしょうね。
BeatStar

2022/08/31 08:31 編集

質問者さん、コードを理解しても次に生かせないと思いますよ。 なんていうか、中間テストの答えを丸暗記して期末テストに臨むような感じの意味不明感です。 プログラミングって、実際には穴埋め問題とかみたいにすでに答えがあるものじゃなくて小説を書くときみたいなまっさらな状態からロジック上の間違いを出さずに書いていくものです。 数学の証明問題で、しかも https://www.asahi.com/articles/ASP937HM6P8ZULBJ00T.html にあるようなプロでも頭を悩ますような殆ど答えがないものを解くようなものだから、もしプロになりたいと思っているのならコードを自分で考えることができるようにするかすっぱりと諦めるしかないかと。
kazuma-s

2022/08/31 11:53

> ネットにあったコードのコピペで問題1は出来ました。 出来ていないと思います。 そのコードを実行して表示されるものは、1~75までの数字をランダムに配置していません。 各行が昇順になっていて、B の列には 1~15、I の列には 16~30 の値が入っています。 質問にある例ではそうなっていませんよね。
Crimson_Tide

2022/08/31 14:34

> System.out.println(" B | I | N | G | O"); の直前までの処理で、ざっくり何をしようとしているのか理解できていますか? listsの中身がどのようになるか想像つきますか? > ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); > int num = 1; > ArrayList<Integer> list = new ArrayList<>(); > list.add(j); > Collections.shuffle(list); > lists.add(list); > num += 15; for文以外の各処理がどういうことをしているか説明できますか?調べたらこう書いてあったからこうなんだろうではなく、ちゃんとどういった処理なのか理解できているでしょうかという質問です。
guest

回答3

0

ベストアンサー

ただ私がネット上に転がっていたコードを使った

参考コードは出典を明示してください。
【Java】ビンゴカード作成問題を解く - Qiita

Java初心者が研修でビンゴカードゲームを作っています。
現状0から全て書けと言われて無理

私はアマチュアなのでイメージが湧かないのですが、何かテキストに沿って学習した上での応用課題というわけではないんでしょうか?(例えばテキストでは「配列を使って九九表を作った」等)

ネットにあったコードのコピペで問題1は出来ました。問題2に移るために問題1のコードの内容を理解しようとして1行づつ調べていきましたが、途中で処理の意味が分からなくなりました。
よって問題2を解くためのあたりもつけられない状況です。
コピペでも後で1行づづ理解すれば、次に応用できるからです。

皆さん指摘されていますが、やはり取り組み方がおかしいと思います。
仮にこの課題が解けたところで業務には全く関係ないし、業務のコードがコピペで完成するわけありません(もちろん局所的にはコピペというか大いに参考にすることは多いと思います)

最初の手がかりとして検索するのはいいと思うのですが、参考にするには提示サイトは本格的過ぎたかもしれません(そのわりに作成だけですし^^;

ビンゴゲームはありがちな気がするんですが、案外これといったサイトが見つからないですね...


ビンゴゲームのおおざっぱな流れを考えると、こんな感じになりますね。

  1. カードの準備
  2. カードの表示
  3. 玉の抽選&表示
  4. カードに穴あけ
  5. カードの表示
  6. ビンゴ判定 yes→終了 no→3に戻る

答えになってしまっては課題の意味がなくなってしまうので、3×3のミニビンゴにします。

カードはintの配列の配列(2次元配列)とします(事前にサイズが決まっている場合はArrayListより楽)
とりあえず適当に数字を入れて表示までしてみます。

Java

1public class MiniBingo { 2 public static void main(String[] args) { 3 // 1 カードの準備 4 // int[3][3]の配列 5 int[][] card = { 6 { 1, 2, 3, }, 7 { 4, 5, 6, }, 8 { 7, 8, 9, }, 9 }; 10 11 // 2 カードの表示 12 // 2重ループはわかりにくいが、実行結果から動作はわかるでしょう 13 for (int j = 0; j < 3; j++) { 14 for (int i = 0; i < 3; i++) { 15 System.out.print(card[j][i] + " "); 16 } 17 System.out.println(); 18 } 19 20 // 3 玉の抽選&表示 21 22 // 4 カードに穴あけ 23 24 // 5 カードの表示 25 26 // 6 ビンゴ判定 yes→終了 no→3に戻る 27 28 } 29}

次に配列内の数字をランダム化します。

この辺は発想の問題ですが、実際のビンゴ同様にシャッフルされた数字を順に取り出せばいいでしょう。
配列をシャッフルしてもいいですが、面倒なのでArrayListを使用します(こういうところは大いに検索します)
java 重複せずにランダムに数字を取得 - Google 検索

Java

1import java.util.ArrayList; 2import java.util.Collections; 3 4public class MiniBingo { 5 public static void main(String[] args) { 6 // 1 カードの準備 7 int[][] card = new int[3][3]; 8 9 // ビンゴの玉のリスト 10 ArrayList<Integer> balls = new ArrayList<>(); 11 // 1から27までの数字を順に追加 12 for (int i = 1; i <= 27; i++) { 13 balls.add(i); 14 } 15 // シャッフル 16 Collections.shuffle(balls); 17 18 int n = 0; 19 for (int j = 0; j < 3; j++) { 20 for (int i = 0; i < 3; i++) { 21 // cardを総なめして、n番目の玉(数字)を入れる 22 card[j][i] = balls.get(n); 23 n++; // 次 24 } 25 } 26 27 // 2 カードの表示 28 for (int j = 0; j < 3; j++) { 29 for (int i = 0; i < 3; i++) { 30 System.out.print(card[j][i] + " "); 31 } 32 System.out.println(); 33 } 34 35 // 3 玉の抽選&表示 36 37 // 4 カードに穴あけ 38 39 // 5 カードの表示 40 41 // 6 ビンゴ判定 yes→終了 no→3に戻る 42 43 } 44}

次は抽選と穴あけです。

上と同じようにシャッフルされた数字を順に取り出します(シャッフルし直さないと、すぐにビンゴになってしまいますw)
穴あけは(配列が)大した量でないので、総なめでもいいでしょう(同じ数字はないはずなので、もし見つかったら打ち切れる)

Java

1import java.util.ArrayList; 2import java.util.Collections; 3 4public class MiniBingo { 5 public static void main(String[] args) { 6 // 1 カードの準備 7 int[][] card = new int[3][3]; 8 9 ArrayList<Integer> balls = new ArrayList<>(); 10 for (int i = 1; i <= 27; i++) { balls.add(i); } 11 Collections.shuffle(balls); 12 13 int n = 0; 14 for (int j = 0; j < 3; j++) { 15 for (int i = 0; i < 3; i++) { 16 card[j][i] = balls.get(n); 17 n++; 18 } 19 } 20 21 // 2 カードの表示 22 for (int j = 0; j < 3; j++) { 23 for (int i = 0; i < 3; i++) { 24 System.out.print(card[j][i] + " "); 25 } 26 System.out.println(); 27 } 28 29 // 3 玉の抽選&表示 30 Collections.shuffle(balls); // もう一度シャッフル 31 int count = 0; // 何個目かの変数 32 int ball = balls.get(count); // 抽選 33 count++; 34 System.out.println(count + "個目: " + ball); 35 36 // 4 カードに穴あけ 37 for (int j = 0; j < 3; j++) { 38 for (int i = 0; i < 3; i++) { 39 if (card[j][i] == ball) { // 当たっていたら... 40 card[j][i] = 0; // 0にすることにする 41 } 42 } 43 } 44 45 // 5 カードの表示 46 for (int j = 0; j < 3; j++) { 47 for (int i = 0; i < 3; i++) { 48 if (card[j][i] == 0) { 49 System.out.print("- "); // あいたマス 50 } else { 51 System.out.print(card[j][i] + " "); 52 } 53 } 54 System.out.println(); 55 } 56 57 // 6 ビンゴ判定 yes→終了 no→3に戻る 58 59 } 60}

最後は判定と繰り返しです。

縦横斜め1列がすべて0(=全部足して0)かどうかを確認します。
無限ループにしておいて、ビンゴだったら抜けることにします。

3×3なので全列直書きしました^^;
5×5では冗長に見えるでしょう。工夫のしどころですね。
ループを使う場合は、whileの抜け方(大域脱出)が問題になります。

Java

1import java.util.ArrayList; 2import java.util.Collections; 3 4public class MiniBingo { 5 public static void main(String[] args) { 6 // 1 カードの準備 7 int[][] card = new int[3][3]; 8 9 ArrayList<Integer> balls = new ArrayList<>(); 10 for (int i = 1; i <= 27; i++) { balls.add(i); } 11 Collections.shuffle(balls); 12 13 int n = 0; 14 for (int j = 0; j < 3; j++) { 15 for (int i = 0; i < 3; i++) { 16 card[j][i] = balls.get(n); 17 n++; 18 } 19 } 20 21 // 2 カードの表示 22 for (int j = 0; j < 3; j++) { 23 for (int i = 0; i < 3; i++) { 24 System.out.print(card[j][i] + " "); 25 } 26 System.out.println(); 27 } 28 29 Collections.shuffle(balls); 30 int count = 0; 31 while (true) { 32 // 3 玉の抽選&表示 33 int ball = balls.get(count); 34 count++; 35 System.out.println(count + "個目: " + ball); 36 37 // 4 カードに穴あけ 38 for (int j = 0; j < 3; j++) { 39 for (int i = 0; i < 3; i++) { 40 if (card[j][i] == ball) { 41 card[j][i] = 0; 42 } 43 } 44 } 45 46 // 5 カードの表示 47 for (int j = 0; j < 3; j++) { 48 for (int i = 0; i < 3; i++) { 49 if (card[j][i] == 0) { 50 System.out.print("- "); 51 } else { 52 System.out.print(card[j][i] + " "); 53 } 54 } 55 System.out.println(); 56 } 57 58 // 6 ビンゴ判定 yes→終了 no→3に戻る 59 // 縦 60 if (card[0][0] + card[1][0] + card[2][0] == 0) break; 61 if (card[0][1] + card[1][1] + card[2][1] == 0) break; 62 if (card[0][2] + card[1][2] + card[2][2] == 0) break; 63 // 横 64 if (card[0][0] + card[0][1] + card[0][2] == 0) break; 65 if (card[1][0] + card[1][1] + card[1][2] == 0) break; 66 if (card[2][0] + card[2][1] + card[2][2] == 0) break; 67 // 斜め 68 if (card[0][0] + card[1][1] + card[2][2] == 0) break; 69 if (card[0][2] + card[1][1] + card[2][0] == 0) break; 70 } 71 72 System.out.println("BINGO!"); 73 } 74}

回答はできるだけ平易に書いたので、冗長な部分もあります。

プログラムには決まった答えはありません。
仕様を満たしていればどんなコードでも正解と言えますし、10人いれば10通りの答えになるでしょう。

とはいえ出題者側視点だと、おそらくこの辺りをポイントとして見るでしょう。

  • 配列の使い方(2次元配列の利用を想定していると推測)
  • 重複せずにランダムに数字を取得
  • ビンゴの判定方法
  • 処理をメソッドに分けるかどうか

投稿2022/08/31 12:42

編集2022/08/31 12:57
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lino

2022/09/02 05:59

細かく解説して頂き、大変ありがとうございます。 配列を使って九九表を作るような演習は研修で出てこなかったので、そもそも2次元配列の概念も知りませんでした。 今回気づかせて頂けたので良かったです。
TN8001

2022/09/02 07:53

> 配列を使って九九表を作るような演習は研修で出てこなかったので、そもそも2次元配列の概念も知りませんでした。 表形式のものを2次元配列で表現するのは配列の勉強ではありがちなので、今回も「そういうお題かな?」と思ったのですがどうやらハズレのようですね^^; ArrayList<ArrayList<Integer>>もリストの中にリストが入っていますので、2次元配列とほぼ同じ概念です。 もちろん2次元配列を使わないと解けないというものでもありません。 1行目の配列 int[] line1; 2行目の配列 int[] line2; 。。。 5行目の配列 int[] line5; こういったデータの持ち方もあるでしょう。 あるいはint[25]をうまく使って縦横に表示することも可能です。 極論を言えば25個のint変数でもいいわけです^^; 研修の課題ということなので今の学習内容とあまりにかけ離れたものが出るとも思えません。 手持ちのカードでやりくりしつつ、どうしても解決しないところ(今回は「重複せずにランダムに数字を取得」がネックになると思います)を、どう解決するのかを見ているのかなという気がします。 「重複せずにランダムに数字を取得」も回答ではシャッフルした数字を順に使っていますが、 * リストからランダムで選び、選んだものはリストから削除する * ランダムで数字を出し、すでに出た数字だったらもう一度 等、方法はいろいろあるでしょう。
guest

0

数字の制限とやらが無ければ分かり易いんでしょうか。
変数名で区別が付き難いのでしたら、変名してみるのも手です。

java

1import java.util.*; 2 3public class Question07a { 4 public static void main(String[] args) { 5 List<Integer> nums = new ArrayList<Integer>(); 6 for (int i = 1; i <= 75; i++) { 7 nums.add(i); 8 } 9 Collections.shuffle(nums); 10 11 for (int row = 0; row < 5; row++) { 12 for (int column = 0; column < 5; column++) { 13 if (row == 2 && column == 2) { 14 System.out.print(" "); 15 } else { 16 System.out.printf("%3d", nums.get(row * 5 + column)); 17 } 18 } 19 System.out.println(); 20 } 21 } 22}

plain

1 75 44 59 16 65 2 49 42 40 29 51 3 41 71 45 63 4 14 47 46 52 66 5 33 27 9 67 32

投稿2022/08/31 11:38

編集2022/09/01 07:46
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ここで、書いてある意味は分かるのですが前後のiとの関係が良く分かりません。
iはBINGOカードの1行目で、jは2行目という意味なのでしょうか?

i:行 j:列 を表します。だから

Java

1 // i(0~4) 行の 2 for (int i = 0; i <= 4; i++) { 3 // j(0~4) 列を書く 4 for (int j = 0; j <= 4; j++) { 5 if (i == 2 && j == 2) { 6 // まんなかは空白 7 System.out.print(" "); 8 } else { 9 // i行j列の値を書く 10 System.out.printf("%3d", lists.get(j).get(i)); 11 } 12 if (j != 4) { 13 System.out.print(" |"); 14 } 15 } 16 System.out.println(); // 1行ごとに改行する 17 }

投稿2022/08/31 01:48

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/08/31 11:06

質問されているのはこれの前の lists の設定部分のループでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問