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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

6491閲覧

C言語においてビンゴゲームのビンゴ判定をしたい

kurira

総合スコア28

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/11/09 02:45

5×5のビンゴカードにFisher–Yatesを用いて、1~100の乱数を格納
ガラガラを使っていることを想定して、またFisher–Yatesを用いて、抽選用乱数を生成
生成された乱数が、ビンゴカードにある数値と『アタリ』か『ハズレ』かを判定
縦横斜めのいずれかが当たった場合、ガラガラによる乱数生成のループを抜け、何行目がアタリです!といった文言を表示する
というソースを書きたいです。

該当のソースコード

C言語

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4 5#define N 100 6 7//FisherYatesを用いて、乱数生成 8 9//ビンゴカード 10void InitArray(int* data, int n) { 11 int i; 12 for (i = 0; i < n; i++) { 13 data[i] = i + 1; 14 } 15} 16//ガラガラ 17void lotteryArray(int* data, int n) { 18 int v; 19 for (v = 0; v < n; v++) { 20 data[v] = v + 1; 21 } 22} 23void Wait(int n) 24{ 25 int i, j; 26 for (i = 0; i < 60000; i++) 27 { 28 for (j = 0; j < 1000 * n; j++) 29 { 30 ; 31 } 32 } 33} 34 35int main(void) 36{ 37 int i, j, count, x; 38 int temp; 39 int v, w, gara; 40 int a[N]; 41 int d[N]; 42 int b[5][5]; 43 int r, c = 5; 44 int atari = 0; 45 int bingo; 46 47 srand((unsigned int)time(NULL)); 48 49 InitArray(a, N); 50 51 52 for (i = N - 1; i >= 1; i--) 53 { 54 x = rand() % (i + 1); 55 temp = a[x]; 56 a[x] = a[i]; 57 a[i] = temp; 58 } 59 60 count = 0; 61 for (i = 0; i < 5; i++) 62 { 63 for (j = 0; j < 5; j++) 64 { 65 b[i][j] = a[count]; 66 count++; 67 } 68 } 69 70 71 printf("これがあなたのビンゴカードです。\n\n"); 72 for (i = 0; i < 5; i++) 73 { 74 for (j = 0; j < 5; j++) 75 { 76 printf("%3d ", b[i][j]); 77 } 78 printf("\n"); 79 } 80 81 printf("\n抽選を開始します!\n\n"); 82 83 srand((unsigned int)time(NULL)); 84 85 lotteryArray(d, N); 86 87 for (v = N - 1; v >= 1; v--) 88 { 89 w = rand() % (v + 1); 90 91 gara = a[w]; 92 a[w] = a[v]; 93 a[v] = gara; 94 95 96 printf("%3d\n", gara); 97 for (r = 0; r < 5; r++) 98 { 99 for (c = 0; c < 5; c++) 100 { 101 if (gara == b[r][c]) 102 { 103 printf(" アタリ\n"); 104 atari = 1; 105 } 106 107 108 } 109 110 111 112 } Wait(1); 113 } 114 for (r = 0; r < 5; r++) { // 行 115 bingo = 1; 116 for (c = 0; c < 5; c++) { 117 if (b[r][c] != atari) bingo = 0; 118 } 119 if (bingo) { 120 121 printf("おめでとう!%d行目がビンゴです!", r); 122 } 123 } 124 for (c = 0; c < 5; r++) { // 列 125 bingo = 1; 126 for (r = 0; r < 5; c++) { 127 if (b[r][c] != atari) bingo = 0; 128 if (bingo) { 129 130 printf("おめでとう!%d列目がビンゴです!", c); 131 } 132 } 133 // 左上から右下の斜め 134 { 135 bingo = 1; 136 for (i = 0; i < 5; i++) { 137 if (b[i][i] != atari) bingo = 0; 138 } 139 if (bingo) { 140 141 printf("おめでとう!左斜めがビンゴです!"); 142 } 143 } 144 // 右上から左下の斜め 145 { 146 bingo = 1; 147 for (i = 0; i < 5; i++) { 148 if (b[i][4 - i] != atari) bingo = 0; 149 } 150 if (bingo) { 151 152 printf("おめでとう!右斜めがビンゴです!"); 153 } 154 } 155 156 } 157 return 0; 158 159}

試したこと

少々長くなってしまって申し訳ありません。
上記のようなソースを書きました。
変数名の変更や、ループの場所を変えたりなどしてみました。アタリ判定まではできたのですが、ビンゴ判定が上手くいきません。
どう直したら良いか、教えてくだいさい。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

回答ではありませんが・・・↓あってますか?

c

1 for (c = 0; c < 5; r++) { // 列 2 bingo = 1; 3 for (r = 0; r < 5; c++) { 4

投稿2020/11/09 03:41

cateye

総合スコア6851

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

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

kurira

2020/11/09 04:01

ご指摘ありがとうございます。打ち間違いです、すみません!
guest

0

ベストアンサー

ビンゴ判定とは何なのか?考えてみる必要があります。

縦、横、斜めのいずれかの向きで、全てのマスがアタリであること、だということはご理解いただけているようですが、この場合のアタリは、正しく言語化して理解できているでしょうか?

ビンゴ判定におけるアタリとは、今回も含む、過去の抽選のいずれかで、該当のマスが、アタリ判定でアタリとなったことがある、となります。

アタリ判定後、その結果を保持するように変更されたほうが良いかと思います。

C

1 /* main()の変数宣言部に追加 */ 2 int cardAtariFlag[5][5]; 3 4 /* アタリ判定を修正 */ 5 if (gara == b[r][c]) 6 { 7 printf(" アタリ\n"); 8 cardAtariFlag[r][c] = 1; 9 } 10 11 /* ビンゴ判定各所 */ 12 if (cardAtariFlag[r][c] != 1) bingo = 0; 13

また、今後の為、変数名は意味が分かるように命名するように意識されてはいかがでしょう。

今回の場合なら、aをcardSeeds、bをcardNumberなどでしょうか。
実際、1文字変数で見分けづらいため、dの扱いがおかしくなっています。

あわせて、整数値と論理値(真偽値)も、見分けられるような命名をお勧めします。

今回の元ソースなら、atariやbingoが論理値なので、atariFlagやbingoFなどにされたほうが、誤読が減るかと思います。

可能であれば、1をTRUE、0をFALSEと#defineで定義し、代入時は、どちらかのみを代入するようにすれば、より可読性が上がると思います。

投稿2020/11/09 04:22

YT0014

総合スコア1750

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

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

kurira

2020/11/09 04:52

ご回答ありがとうございます。いただいたソースを元に、自分のソースを直してみました。 最後、『おめでとう!~~がビンゴしました!』という文が何個も表示されてしまいました。確認した感じでは、すべての『おめでとう!~~がビンゴしました!』が表示されてしまっているようなのです(0行目、1行目・・・といった形ですべてです)。ループの範囲のミスかと思い、色々試してみたのですが、どうも上手くいきません。度々申し訳ないのですが、どこを直せば良いでしょうか? また、要素名に関するご指摘ありがとうございます。以後、人に見せてもすぐに理解してもらえるような変数名にするよう心がけます。
YT0014

2020/11/09 05:07 編集

指摘はしておりませんでしたが、現在ご提示いただいたコードでは、100回の抽選終了後、ビンゴ判定を行うようになっておられますので、それが原因かと思います。 抽選1回の処理が、どこからどこまでなのか、ご確認ください。 なお、これは、 JJJutoさんすら、ご自分のコードをご理解されていないことを意味します。 今一度、コードを確認すると共に、デバッカなどで、実際の処理を追ってみることをお勧めします。
guest

0

  • atariという変数は最初は0であり,何らかのタイミングで1になる模様です.
  • bなる配列の要素の値は,おそらく1~25の値かと思われます.

…であれば,

if (b[r][c] != atari) bingo = 0;

のようにして,bの要素とatariとを比較することの意味(どのような判定を意図しているのか?)がわかりません.


どう直したら良いか

  1. 各変数の{意味,役割}を明確にする.(例えば,atariとはこのプログラムにおいて何のために存在しているのか?)
  2. ビンゴの判定とは何をどう判断すれば良いのか?という話を明確にする(日本語で説明できる必要がある)
  3. 1.を鑑みた結果,今現在存在する変数だけで2.の話を達成できるのか?等を考えてみる
  4. 以上から必要と思われる修正を行う

投稿2020/11/09 03:54

fana

総合スコア11996

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

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

kurira

2020/11/09 04:29

b配列には、1~25ではなく、Fisher–Yatesを用いて作成した1~100の重複しない乱数のうち、先頭25個が格納されています。bingo=1で、行や列、斜めがすべてatariか? if (b[r][c] != atari) bingo = 0; で、行や列、斜めにatariじゃない要素があるか? なかった場合、bingo という意図です。 自分なりに色々試行錯誤したのですが、これ以上どうしたら良いのか完全に手詰まりなので、具体的なソースを簡単なもので良いので教えていただけるとありがたいです
fana

2020/11/10 04:49

物事を順序立てて考えて見てはどうでしょうか. 現実世界において(1人で寂しく)ビンゴをやる様子を考えれば, 1. 番号を抽選する 2. 手元のカードに抽選された番号があったら,その箇所に穴をあける 3. 穴をあけた場合,カードの穴の並び状況によって「リーチ!」だとか「ビンゴ!」とか叫ぶ 4. ビンゴにならなかった場合,1.に戻って繰り返す といった感じになるでしょう. これをプログラムでやるのあれば,(既に他者が回答済みですが) ・「カードに穴をあける」に相当する何らかの「カードの状態を記憶する手段」が必要 ・「穴をあけるごとにビンゴの判定を行う」ことが必要 …となるでしょう.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問