前提
プログラムの練習をするためcで10以下のカードを引いたらその数字がポイントになり、
11以上のカードを引いたらポイントを0にするトランプゲーム作成しようとしています。
ただ、途中でカードが引けなくなるというバグが発生してしまいました。
実現したいこと
- カードの重複をなくす。
- 52枚すべて引けるようにする。
発生している問題・エラーメッセージ
♦5
<プレイヤー1>'s points:13
There are 7 turns remaining.
Tarn is <プレイヤー2>.
Drow card?,Yes:1 No:2.
1
❤9
<プレイヤー2>'s points:17
There are 6 turn remaining.
Tarn is <プレイヤー1>
Drow card?,Yes:1 No:2.
1
1
1
該当のソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <unistd.h> 5int main(void) 6{ 7 int H[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 8 int S[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 9 int C[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 10 int D[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; 11 12 int j,k,q,g; 13 int d,t; 14 char na1[10]; 15 char na2[10]; 16 17 for (j=0; j<13; j++){ 18 H[j]=0; 19 printf("%d",H[j]); 20 } 21 for (k=0; k<13; k++){ 22 S[k]=0; 23 printf("%d",S[k]); 24 } 25 for (q=0; q<13; q++){ 26 D[q]=0; 27 printf("%d",D[q]); 28 } 29 for (g=0; g<13; g++){ 30 C[g]=0; 31 printf("%d",D[g]); 32 } 33 printf("\x1b[0m"); 34 printf("\n"); 35 printf("Initialization complete.\n"); 36 int s; //マーク出力用変数 37 int n; //数字出力用変数 38 int play; 39 play=1; 40 int pln; 41 printf("Please input your name use 10 characters max.\n"); 42 printf("First, enter the name of the first player.\n"); 43 printf(" player_1's name: "); 44 scanf("%s", &na1); 45 printf("Next, enter the name of the second player.\n"); 46 printf(" player_2's name: "); 47 scanf("%s", &na2); 48 srand(( unsigned int ) time (NULL)); 49 int i; 50 for (i=0; i<1; i++){ 51 //最小値:1 取得個数:2 52 d=1+ rand () % 2; 53 printf("%d\n",d); 54 if(d==1){pln=1;} 55 else{pln=2;} 56 } 57 do{ 58 if(play=1){ 59 printf(" Game start!\n"); 60 if (d==1){ printf("Start with %s.\n",na1);} 61 else {printf(" Start with %s.\n",na2);} 62 //n1p:na1の点数 n2p:na2の点数 63 //hmc:場に出されたカードの枚数 64 //pln:プレイヤー 65//ter:残りターン数 66 int n1p; 67 n1p=0; 68 int n2p; 69 n2p=0; 70 int hmc; 71 hmc=0; 72 n=0; 73 int ter=52; 74 //mai 引く:1 引かない:2 75 int mai; 76 do{ 77 if(pln==1){printf("Tarn is "),printf("\x1b[33m"),printf("%s.",&na1);} 78 else{printf("Tarn is "),printf("\x1b[32m"),printf("%s.",&na2);} 79 printf("\x1b[0m"); 80 printf("\n"); 81 printf("Drow card?,Yes:1 No:2.\n"); 82 scanf("%d",&mai); 83 if(mai==1){srand(( unsigned int ) time (NULL)),hmc=hmc+1; 84 /*if(pln==1){n1p=n1p+1;} 85 else{n2p=n2p+1;}*/ 86 ter = ter-1; 87 88 89 int i; 90 for (i=0; i<1; i++){ 91 //最小値:1 取得個数:2 92 d=1+ rand () % 2; 93 } 94 95 96 /*int q1; 97 srand(( unsigned int ) time (NULL)); 98 for (q1=0; q1<1; q1++){ 99 //最小値:1 取得個数:4 100 s=1+ rand () % 4; 101 } 102 int w; 103 srand(( unsigned int ) time (NULL)); 104 for (w=0; w<1; w++){ 105 //最小値:1 取得個数:13 106 n=1+ rand () % 13; 107 }*/ 108 109 int kado[5][14]; 110 int A2; 111 srand(( unsigned int ) time (NULL)); 112 do{ 113 A2=0; 114 int w; 115 s=1+ rand ()%4; 116 n=1+ rand()% 13; 117 if (kado[s][n]==0){kado[s][n]=1;} 118 else {A2=1;} 119 }while(A2==1); 120 121 if(n>10){printf("\x1b[43m");} 122 if(s==1){printf("\x1b[31m"),printf("%s%d\n","♥ ",n);} 123 else if(s==2){printf("\x1b[34m"),printf("%s%d\n","♠ ",n);} 124 else if(s==3){printf("\x1b[34m"),printf("%s%d\n","♣ ",n);} 125 else{printf("\x1b[31m"),printf("%s%d\n","♦ ",n);} 126 printf("\x1b[0m"); 127 if(s==1){if (H[n]==0){H[n]=H[n]+1; t=t+1;};} 128 else if(s==2){if (S[n]==0){S[n]=S[n]+1; t=t+1; };} 129 else if(s==3){if (C[n]==0){C[n]=C[n]+1; t=t+1; };} 130 else {if (D[n]==0){D[n]=D[n]+1; t=t+1; };};} 131 else{n=0;} 132 if(n>10){printf("The score is set to 0 because of 11 or more.\n");if(pln==1){n1p=0;} else{n2p=0;};} 133 else if(1<=n<=10||n==0){ 134 if(pln==1){n1p=n1p+n;printf("\x1b[33m"),printf("%s",&na1),printf("\x1b[0m"),printf("'s points:%d\n",n1p);} 135 else{n2p=n2p+n;printf("\x1b[32m"),printf("%s",&na2),printf("\x1b[0m"),printf("'s points:%d\n",n2p);};} 136 else{printf(" \n");} 137 if(pln==1){pln=2;}else{pln=1;} 138 printf("There are %d turns remaining.\n",ter); 139 140}while(hmc<52); 141printf("Game set."); 142int second =5; 143 printf("Stops for %d seconds. For tallying.\n",second); 144 printf("-----------------------------------------\n"); 145 sleep(second); 146 printf("The tally is complete.(use %d seconds)\n",second); 147second =0; 148 149printf("\x1b[33m"),printf("%s",&na1),printf("\x1b[0m"),printf("'s score is %d\n",n1p); 150printf("\x1b[32m"),printf("%s",&na2),printf("\x1b[0m"),printf("player_2's score is %d\n",n2p); 151 152if(n1p>n2p){printf("\x1b[33m"),printf("%s",&na1),printf("\x1b[0m"),printf(" is win.");} 153else if(n1p<n2p){printf("\x1b[32m"),printf("%s",&na2),printf("\x1b[0m"),printf(" is win.");} 154else{printf("\x1b[34m"),printf("DRAW."); 155 printf("\x1b[0m");} 156 157second =10; 158printf("--------------------------------------------\n"); 159sleep(second); 160 161printf("Enter 1 if you want to continue the game or 2 if you want to exit.\n"); 162printf("Enter___ "); 163scanf("%d",&play);} 164}while(play==1); 165} 166 167### 試したこと 168プログラムの96行目から107行目のほうでプログラムを実行するとカードは52引けましたが、カードが重複する問題が発生しました。
c でしょうか、 c# でしょうか。
teratail のコードのマークダウン内ではインデントにスペースとタブが混在しているとガタガタになりますので、どちらかに統一してインデントがちゃんと付くようにして頂くと見易くなります。
また、繰り返さない処理でも関数に分けたほうがコードの見通しが良くなります。
プレイヤー名の入力時点からバグがあります。if 文の数値の比較に == では無く = としてしまっていたりもあります。
変数の宣言・初期化等もテキトウですし、コードの質が悪く感じます。
CとC#って別もんっすよ。
cです。
質問は編集できるので編集してください。お願いします。
後、多分ミスだと思うのですが、31行目辺りの『クローバーの札を表示する』の部分ですね。
この部分、D[...] じゃなくて C[...] では? (一部省略しています)
回答1件