10代と話して驚いたこと

初めてですよろしくお願いします。

現在とあるサイトを参考にさせていただいて、
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は問題なし)

なぜこのようなことが起きるのでしょうか?
ご教授お願いします。

質問者からの補足コメント

  • うーん・・・

    返信ありがとうございます。
    プログラム提示します
    #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));

    に上のプログラムが続く感じです。
    文字数の関係でここまでです。
    下にも続きますが
    こことは関係のないものです。

      補足日時:2015/12/01 22:00

A 回答 (3件)

> struct {


> int num;
> int mark[12];
> int no[12];
> } pl[4];

あ、やっぱりそうだ。

C言語で意図しない書き換えがあったときに、まっさきに疑うべきなのが
「配列の確保」と「添字」の関係です。

int mark[12];

としたら、どこまでが「正しく使える範囲」か、よく考えてみましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
13枚配るのに、[12]はおかしいですね。
こんなしょーもないミスだったとは・・・
丁寧にありがとうございました。

お礼日時:2015/12/01 22:53

#1 に同意. この部分だけから理由を推測することはできません. 完全なプログラムの提示をお願いします.

    • good
    • 0

適切に宣言してあれば、そのようなことは発生しないと思います。


少なくとも、書いてない部分を補完して手許で実行した限りでは発生していません。

○配る部分と表示する部分との間で、変更されるような何かをしている
○変数や配列の宣言が不適切なため、別の領域に読み書きされている
  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 等と一つの数値にするとか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報