初めてですよろしくお願いします。
現在とあるサイトを参考にさせていただいて、
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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
和を求める問題
-
プログラミングで二番目に大き...
-
c言語で平均をだす
-
C言語 マスターマインドゲーム...
-
C言語 入力した数値の平均値の...
-
構文エラー";"が型の前にあり...
-
c言語の問題
-
C言語初心者です。次の問題で質...
-
C言語のwhile文を使った素数判...
-
素因数分解のプログラムを作成...
-
C言語の二分法のプログラムにつ...
-
配列を使って魔方陣
-
getcの改行判定
-
C言語で電卓を作成する。
-
while文について、c言語...
-
for文の中にswitch文はいれられ...
-
C言語 数字以外を入力させない...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
プログラム
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
getcの改行判定
-
配列を関数に渡す方法
-
プログラミングで二番目に大き...
-
C言語階乗の総和を求める
-
scanf関数を用いての加減乗除%...
-
C言語で電卓を作成する。
-
C言語 プログラム
-
C言語の二分法のプログラムにつ...
-
C言語のwhile文を使った素数判...
-
while文について、c言語...
-
10進数からN進数に変換するプロ...
-
C言語です
-
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));
に上のプログラムが続く感じです。
文字数の関係でここまでです。
下にも続きますが
こことは関係のないものです。