質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

816閲覧

cでのトランプゲームについて

yamada3358

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/09/17 05:54

編集2022/09/17 13:08

前提

プログラムの練習をするため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引けましたが、カードが重複する問題が発生しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/09/17 10:26 編集

c でしょうか、 c# でしょうか。 teratail のコードのマークダウン内ではインデントにスペースとタブが混在しているとガタガタになりますので、どちらかに統一してインデントがちゃんと付くようにして頂くと見易くなります。 また、繰り返さない処理でも関数に分けたほうがコードの見通しが良くなります。 プレイヤー名の入力時点からバグがあります。if 文の数値の比較に == では無く = としてしまっていたりもあります。 変数の宣言・初期化等もテキトウですし、コードの質が悪く感じます。
BeatStar

2022/09/17 10:57

CとC#って別もんっすよ。
BeatStar

2022/09/17 12:42

質問は編集できるので編集してください。お願いします。
BeatStar

2022/09/17 12:47

後、多分ミスだと思うのですが、31行目辺りの『クローバーの札を表示する』の部分ですね。 この部分、D[...] じゃなくて C[...] では? (一部省略しています)
guest

回答1

0

ベストアンサー

例えば、以下のような構造・関数を用いると 13*4 枚のカードを無くなるまで
ドローできます。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <unistd.h> 5 6char *SUITS[] = { "♥", "♠", "♣", "♦" }; 7 8typedef struct { 9 int n; 10 char *suit; 11} CARD; 12 13typedef struct { 14 int left; 15 CARD cards[13 * 4]; 16} STOCK; 17 18void initStock(STOCK *stock) { 19 stock->left = 13 * 4; 20 for(int i = 0; i < stock->left; i++) { 21 stock->cards[i].n = i % 13 + 1; 22 stock->cards[i].suit = SUITS[i / 13]; 23 } 24 for(int i = stock->left - 1; i > 0; i--) { 25 int j = rand() % i; 26 CARD t = stock->cards[i]; 27 stock->cards[i] = stock->cards[j]; 28 stock->cards[j] = t; 29 } 30} 31 32CARD *drawFromStock(STOCK *stock) { 33 if(stock->left == 0) return NULL; 34 return &stock->cards[--stock->left]; 35} 36 37int main(void) { 38 STOCK stock; 39 40 srand(time(NULL)); 41 initStock(&stock); 42 printf("left=%d\n", stock.left); 43 44 for(int i=0; i<10; i++) { 45 CARD *card = drawFromStock(&stock); 46 printf("%s %d\n", card->suit, card->n); 47 } 48 printf("left=%d\n", stock.left); 49}

実行結果

plain

1left=52 2♦ 4 3♠ 3 4♣ 9 5♠ 7 6♣ 12 7♥ 7 8♣ 13 9♠ 12 10♦ 6 11♣ 11 12left=42

投稿2022/09/17 15:18

編集2022/09/17 17:26
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamada3358

2022/09/17 22:23

的確なアドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問