初めてですよろしくお願いします。
現在とあるサイトを参考にさせていただいて、
4人のプレイヤーのトランプを配るプログラムを作成しています。
これがプレイヤーの手札を決める部分です。
for (pn = 0; pn < 4; pn++) {
for (cn = 0; cn < 13; cn++) {
do{
mk = rand() % 4;
num = rand() % 13;
}while(ck[mk][num] == 1);
pl[pn].mark[cn] = mk; //スート
pl[pn].no[cn] = num+1; //見やすいように1足す
ck[mk][num] = 1;
printf("%d %d\n",pl[pn].mark[cn],pl[pn].no[cn]); //確認用
}
}
確認用のprintfでは、しっかりとバラバラの手札は表示されますが、
上の処理の後に、下で手札を表示すると・・・
for (pn = 0; pn < 4; pn++) {
for(cn=0;cn<13;cn++){
printf("%d mark %d number\n",pl[pn].mark[cn],pl[pn].no[cn]);
}
printf("\n"); //一行空白用
}
かなりの確立で前者とは違う表示がされます。
特に
pl[0].no[0] //プレイヤー1の一番目の手札の数字
pl[1].no[0] //プレイヤー2の一番目の手札の数字
pl[2].no[0] //プレイヤー3の一番目の手札の数字
pl[3].no[0] //プレイヤー4の一番目の手札の数字
の部分が変わってしまいます。(markは問題なし)
なぜこのようなことが起きるのでしょうか?
ご教授お願いします。
No.3ベストアンサー
- 回答日時:
> struct {
> int num;
> int mark[12];
> int no[12];
> } pl[4];
あ、やっぱりそうだ。
C言語で意図しない書き換えがあったときに、まっさきに疑うべきなのが
「配列の確保」と「添字」の関係です。
int mark[12];
としたら、どこまでが「正しく使える範囲」か、よく考えてみましょう。
ありがとうございます。
13枚配るのに、[12]はおかしいですね。
こんなしょーもないミスだったとは・・・
丁寧にありがとうございました。
No.1
- 回答日時:
適切に宣言してあれば、そのようなことは発生しないと思います。
少なくとも、書いてない部分を補完して手許で実行した限りでは発生していません。
○配る部分と表示する部分との間で、変更されるような何かをしている
○変数や配列の宣言が不適切なため、別の領域に読み書きされている
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83 …
plの宣言って、どうなってますか?
余談ですが。
○この選択方法では、全部配れる保証はありません。
コンピュータで使われる疑似乱数の特性上、「何度やっても最後の1枚が出ない」ということが起こりえます。
別のやり方を使いましょう。
・トランプと同じように、全部並べて、ランダムに入れ替えて、最初から順番に取り出す
・ck[mk][num]==1だったら、ck[mk][num+1],ck[mk][num+2]..と、==0になってい箇所を探す
○カードは、マークと数字がセットです。これをまとめて扱った方がよいのでは。
カード用構造体を作るとか、 cardNo = mark * 13 + num 等と一つの数値にするとか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- 数学 確率の最大値を求める方法について 確率 Pn<P(n+1)⇄Pn/P(n+1)<1のときと Pn>P 2 2022/07/29 20:15
- 数学 上三角行列のn乗の証明 2 2023/07/23 21:45
- 数学 環論の素元について 6 2022/05/09 04:04
- 数学 数学A 確率 白玉5個、赤玉n個の入っている袋がある。 この袋の中から、2個の玉をとりだすとき、白玉 4 2023/04/22 15:18
- 数学 至急お願いします‼️今日私立大学入試で数学を受けてきたのですが、問題に納得できません。この問題、数列 9 2023/02/07 00:45
- 数学 どういう意味ですか? 1 2022/12/07 22:39
- 数学 cos^2(x+π/4)=Σ(n=-∞から∞)Cn・e^(inx)が全てのxに対して成り立つように定 2 2023/02/09 17:56
- 数学 cos^2(x+π/4)=Σ(n=-∞から∞)Cn・e^(inx)が全てのxに対して成り立つように定 1 2023/02/06 18:17
- 数学 高一数学 確率 画像あり 〔 チャート 302ページ 問題練習57番 〕 n=12のときにPn=Pn 2 2023/08/15 13:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
計算結果がlong型以上になる場...
-
プログラミングで二番目に大き...
-
scanf関数を用いての加減乗除%...
-
getcの改行判定
-
C言語で電卓を作成する。
-
配列を使って魔方陣
-
C言語で勉強中(max,min)の出し方
-
C言語階乗の総和を求める
-
VHDLで、case文とwhen文のどち...
-
C言語でのトランプシャッフルに...
-
プログラム
-
while文について、c言語...
-
OpenCVを用いて任意の時間で静...
-
scanfが実行されません
-
C言語 数字以外を入力させない...
-
C言語です
おすすめ情報
返信ありがとうございます。
プログラム提示します
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
struct {
int num;
int mark[12];
int no[12];
} pl[4];
int main(void){
int mk = 0, num = 0, cn, pn;
int ck[4][13] = {0};
srand((unsigned)time(NULL));
に上のプログラムが続く感じです。
文字数の関係でここまでです。
下にも続きますが
こことは関係のないものです。