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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

741閲覧

じゃんけんゲームの改良

vanpy

総合スコア2

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/05/03 13:45

編集2021/05/03 14:34

じゃんけんゲームの改良版を作成しています。
(1)じゃんけんを1回した後に「続けますか?」というメッセージを画面に表示し、続ける場合は数字の1を、やめる場合は1以外の数を入力させ、続ける場合は初回に戻ってじゃんけんをし、続かない場合は終了する。
(2)じゃんけんを1回するたびにそれまでの累積の勝敗を表示する。
上記2つの仕様を加えたいのですが、
(1)printf("続けますか?\n\nはい:0 いいえ:1\n");
scanf("%d", &end);
をメイン関数に入れたところ、
実行結果
ジャンケンをしましょう。

グーは0 チョキは2 パーは5を入れます。

じゃんけんぽん!はいどうぞ:5
続けますか?

はい:0 いいえ:1
0
あなたはパーを出しました。
わたしはパーを出しました。
あいこです

終わります。おつかれさまでした。
となってしまいます。
何かほかにいい方法は無いのでしょうか?
そして(2)の仕様の作成方法がよく分かりません。

c

1include <stdio.h> 2include <stdlib.h> 3include <time.h> 4typedef enum janken { Gu = 0, Choki = 2, Pa = 5 } JPON; 5int saikoro(void) { 6 int sai; 7 srand((unsigned)time(NULL)); 8 sai =rand()%6+1; 9 return (rand() % 6 + 1); 10} 11JPON sysjan(int sai) 12{ 13 int pon; 14 15 switch (sai) { 16 case 1: pon = Gu; break; 17 case 2: pon = Gu; break; 18 case 3: pon = Choki; break; 19 case 4: pon = Choki; break; 20 case 5: pon = Pa; break; 21 case 6: pon = Pa; break; 22 } 23 return((JPON)pon); 24} 25int shoubu(JPON kenin, JPON kenout) 26{ 27 int shoubukekka; 28 29 switch (kenin) { 30 case Gu: 31 if (kenout == Gu) shoubukekka = 0; 32 else if (kenout == Choki) shoubukekka = 1; 33 else shoubukekka = -1; 34 break; 35 case Choki: 36 if (kenout == Gu) shoubukekka = -1; 37 else if (kenout == Choki) shoubukekka = 0; 38 else shoubukekka = 1; 39 break; 40 case Pa: 41 if (kenout == Gu) shoubukekka = 1; 42 else if (kenout == Choki) shoubukekka = -1; 43 else shoubukekka = 0; 44 break; 45 } 46 47 return (shoubukekka); 48} 49void watashinoken(JPON ken) 50{ 51 switch (ken) { 52 case Gu: printf("わたしはグーを出しました。\n"); break; 53 case Choki: printf("わたしはチョキを出しました。\n"); break; 54 case Pa: printf("わたしはパーを出しました。\n"); break; 55 } 56} 57void anatanoken(JPON ken) 58{ 59 switch (ken) { 60 case Gu: printf("あなたはグーを出しました。\n"); break; 61 case Choki: printf("あなたはチョキを出しました。\n"); break; 62 case Pa: printf("あなたはパーを出しました。\n"); break; 63 } 64} 65void kekka(int r) 66{ 67 switch (r) { 68 case -1: printf("あなたの負けです\n"); break; 69 case 1: printf("あなたの勝ちです\n"); break; 70 case 0: printf("あいこです\n"); break; 71 } 72} 73int main(void) { 74 JPON choken; 75 JPON sysken; 76 int ken_buf; 77 int sai; 78 int shoubukekka; 79 do { 80 printf("\nジャンケンをしましょう。\n"); 81 printf("\nグーは0 チョキは2 パーは5を入れます。\n"); 82 printf("\nじゃんけんぽん!はいどうぞ:\a"); 83 scanf("%d", &ken_buf); 84 choken = (JPON)ken_buf; 85 if ((choken != Gu) && (choken != Choki) && (choken != Pa)) 86 printf("\n@@@@正しく入れてください!@@@@\n"); 87 } while (!(choken == Gu || choken == Choki || choken == Pa)); 88 sai = saikoro(); 89 sysken = sysjan(sai); 90 shoubukekka = shoubu(choken, sysken); 91 printf("\a"); 92 anatanoken(choken); 93 watashinoken(sysken); 94 kekka(shoubukekka); 95 printf("\n終わります。おつかれさまでした。\n\n"); 96 return(0); 97}```

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

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

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

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

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

coolwind0202

2021/05/03 14:23

```c ``` でソースコードを囲んでください 例: ```c int main(void) { } ```
coolwind0202

2021/05/03 15:14

「```c」のあとに改行を入れてください。 終わりの「```」のまえにも改行を入れてください。
gentaro

2021/05/04 03:56

タグがいい加減すぎる Visual Studioと直接関係ないんで、もっと適切なタグを付けた方が良い。
guest

回答1

0

ベストアンサー

とりあえず、続ける機能だけ…

c

1void play() { 2 JPON choken; 3 4/* (略) */ 5 6 kekka(shoubukekka); 7} 8 9int main(void) { 10 int end = 1; 11 while (end == 1) { 12 play(); 13 printf("続けますか?\n\nはい:1 いいえ:0\n"); 14 scanf("%d", &end); 15 } 16 printf("\n終わります。おつかれさまでした。\n\n"); 17 return(0); 18}

main で動いてる部分を関数 play として切り出してみました。
--- 追記 ---
カウント機能は…

c

1int play() { 2 JPON choken; 3/* (略) */ 4 kekka(shoubukekka); 5 return shoubukekka; 6}

まず play から結果を返すようにして

c

1int main(void) { 2 int win = 0; 3 int lose = 0; 4 int draw = 0; 5 int kekka; 6 int end = 1; 7 while (end == 1) { 8 kekka = play(); 9 if (kekka == -1) lose++; 10 if (kekka == 1) win++; 11 if (kekka == 0) draw++; 12 printf("続けますか?\n\nはい:1 いいえ:0\n"); 13 scanf("%d", &end); 14 } 15 printf("%d勝%d分け%d負けでした。\n",win,draw,lose); 16 printf("\n終わります。おつかれさまでした。\n\n"); 17 return(0); 18}

main はこんなかんじでどうでしょうか。

投稿2021/05/04 04:22

編集2021/05/04 08:37
takasima20

総合スコア7458

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

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

vanpy

2021/05/04 05:33

回答ありがとうございます。 上手いこと動きました。 累積を表示するコードも考えてみましたが、win,lose,drawをどこに定義したらいいのかよく分かりません。 このコードだとデバックエラーが出てきてしまいます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> typedef enum janken { Gu = 0, Choki = 2, Pa = 5 } JPON; int saikoro(void) { int sai; srand((unsigned)time(NULL)); sai =rand()%6+1; return (rand() % 6 + 1); } JPON sysjan(int sai) { int pon; switch (sai) { case 1: pon = Gu; break; case 2: pon = Gu; break; case 3: pon = Choki; break; case 4: pon = Choki; break; case 5: pon = Pa; break; case 6: pon = Pa; break; } return((JPON)pon); } int shoubu(JPON kenin, JPON kenout) { int shoubukekka; switch (kenin) { case Gu: if (kenout == Gu) shoubukekka = 0; else if (kenout == Choki) shoubukekka = 1; else shoubukekka = -1; break; case Choki: if (kenout == Gu) shoubukekka = -1; else if (kenout == Choki) shoubukekka = 0; else shoubukekka = 1; break; case Pa: if (kenout == Gu) shoubukekka = 1; else if (kenout == Choki) shoubukekka = -1; else shoubukekka = 0; break; } return (shoubukekka); } void watashinoken(JPON ken) { switch (ken) { case Gu: printf("わたしはグーを出しました。\n"); break; case Choki: printf("わたしはチョキを出しました。\n"); break; case Pa: printf("わたしはパーを出しました。\n"); break; } } void anatanoken(JPON ken) { switch (ken) { case Gu: printf("あなたはグーを出しました。\n"); break; case Choki: printf("あなたはチョキを出しました。\n"); break; case Pa: printf("あなたはパーを出しました。\n"); break; } } void kekka(int r) { int win; int lose; int draw; win = 0; lose = 0; draw = 0; switch (r) { case -1: printf("あなたの負けです\n"); lose++; break; case 1: printf("あなたの勝ちです\n"); win++; break; case 0: printf("あいこです\n"); draw++; break; } } void play(){ JPON choken; JPON sysken; int ken_buf; int sai; int shoubukekka; do { printf("\nジャンケンをしましょう。\n"); printf("\nグーは0 チョキは2 パーは5を入れます。\n"); printf("\nじゃんけんぽん!はいどうぞ:\a"); scanf("%d", &ken_buf); choken = (JPON)ken_buf; if ((choken != Gu) && (choken != Choki) && (choken != Pa)) printf("\n@@@@正しく入れてください!@@@@\n"); } while (!(choken == Gu || choken == Choki || choken == Pa)); sai = saikoro(); sysken = sysjan(sai); shoubukekka = shoubu(choken, sysken); printf("\a"); anatanoken(choken); watashinoken(sysken); kekka(shoubukekka); } int main(void) { int end = 1; while (end == 1) { play(); printf("続けますか?\n\nはい:1 いいえ:0\n"); scanf("%d", &end); } int win; int lose; int draw; printf("%d勝%d分け%d負けでした。\n",win,draw,lose); printf("\n終わります。おつかれさまでした。\n\n"); return(0); }
vanpy

2021/05/04 09:05

回答ありがとうございます。 無事、累積も表示されました。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問