
初めてですよろしくお願いします。
現在とあるサイトを参考にさせていただいて、
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
初心者です。for文、if文を使っ...
-
for文の中にswitch文はいれられ...
-
C言語 入力した数値の平均値の...
-
C言語 エラー表示 break の位...
-
このプログラミングで。
-
並べ替えのプログラム
-
#if 1 #elseの意味について
-
C言語で勉強中(max,min)の出し方
-
C言語の問題-配列について
-
c言語プログラミングで1から100...
-
わかりません!!
-
乱数について
-
C言語で、条件をつけて総和を求...
-
プログラミングの配列で
-
直角三角形
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
ラップ関数とはどんなものですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
getcの改行判定
-
C言語の二分法のプログラムにつ...
-
C言語 マスターマインドゲーム...
-
全角文字の判定
-
計算結果がlong型以上になる場...
-
while文を使った問題なのですが...
-
C言語初心者です。次の問題で質...
-
C言語 数字以外を入力させない...
-
初心者です。
-
C++での乱射ショットについて教...
-
if文
-
raspberrypiでロータリエンコーダ
-
C言語で電卓を作成する。
-
双方向リスト
-
入力した数値を0~3乗するプロ...
-
scanfが実行されません
おすすめ情報
返信ありがとうございます。
プログラム提示します
#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));
に上のプログラムが続く感じです。
文字数の関係でここまでです。
下にも続きますが
こことは関係のないものです。