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

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

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

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

Q&A

2回答

2433閲覧

掛け金をするゲームを作りたい

h_proc

総合スコア68

C

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

0グッド

0クリップ

投稿2018/12/31 04:41

c言語でじゃんけんゲームを作っています。最初に500円所持していて、じゃんけんに勝つと300円もらえて、負けると200円払い、所持金が1000円または0円になるまで続けるというルールにしたいです。以下のようなコードを書いたのですが、勝つ度、負ける度に、所持金が変化していきません。対処法を教えていただきたいです。(可能でしたら、どこが間違っているかも指摘していただきたいです。)よろしくお願いいたします。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int get_number(void); 5int money(int a); 6 7int get_number(void) { 8 return (int)(((((double)rand()) / (double)(RAND_MAX + 1)) * 3) + 1); 9} 10 11int money(int a) { 12 13 14 if (a = 1) { 15 int m = 0; 16 return m = m + 300; 17 18 } 19 else if (a = 2) { 20 int m = 0; 21 return m = m - 200; 22 23 24 } 25 else if (a = 0) { 26 return 500; 27 } 28 29 30} 31int main(void) { 32 printf("Let's play rock,paper,sissors!!\n"); 33 printf("This is the rule.\n"); 34 printf("You have 500 yen.\n"); 35 printf("You have to pay 200 yen for one play.\n"); 36 printf("If you loose, you lost 200yen.\n"); 37 printf("If you win, you can get 300 yen.\n"); 38 printf("If you have no money or you get 1,000 yen, this game is end.\n"); 39 printf("Let's begin!\n"); 40 41 printf("You have 500 yen.\n"); 42 int num = 0; 43 //所持金が0円または1000円になるまで繰り返します。 44 for (int i = 1; 0 < money(num) < 1000; i++) { 45 printf("Please choose your hand from 1 to 3\n"); 46 printf("1 rock\n"); 47 printf("2 paper\n"); 48 printf("3 sissors\n"); 49 50 int h = 0; 51 scanf("%d", &h); 52 //もしもユーザーが1~3以外を選んでしまった時の対応。 53 if (h < 1 || h>3) { 54 printf("Error! Please choose from 1 to 3\n"); 55 } 56 //正常に1~3をえらんだ時のゲームの進み。 57 else { 58 int com = 0; 59 com = get_number(); 60 //あいこ。 61 for (; com == h;) { 62 printf("You are Even!!\n"); 63 printf("Please choose your hand from 1 to 3\n"); 64 printf("1 rock\n"); 65 printf("2 paper\n"); 66 printf("3 sissors\n"); 67 68 int h = 0; 69 scanf("%d", &h); 70 //勝敗がつく。 71 int com = 0; 72 com = get_number(); 73 if (com != h) { 74 if (h == 1 && com == 2) { 75 printf("You are loose!\n"); 76 } 77 else if (h == 1 && com == 3) { 78 printf("You are win!!\n"); 79 } 80 else if (h == 2 && com == 1) { 81 printf("You are win!!\n"); 82 } 83 else if (h == 2 && com == 3) { 84 printf("You are loose!\n"); 85 } 86 else if (h == 3 && com == 1) { 87 printf("You are loose!\n"); 88 } 89 else if (h == 3 && com == 2) { 90 printf("You are win!!\n"); 91 } 92 break; 93 } 94 else { 95 //NR 96 } 97 } 98 99 if (h == 1 && com == 2) { 100 printf("You are loose!\n"); 101 } 102 else if (h == 1 && com == 3) { 103 printf("You are win!!\n"); 104 } 105 else if (h == 2 && com == 1) { 106 printf("You are win!!\n"); 107 } 108 else if (h == 2 && com == 3) { 109 printf("You are loose!\n"); 110 } 111 else if (h == 3 && com == 1) { 112 printf("You are loose!\n"); 113 } 114 else if (h == 3 && com == 2) { 115 printf("You are win!!\n"); 116 } 117 118 } 119 //ゲーム終了後の所持金の計算。 120 printf("If you win,please input 1.And if you loose, please input 2.\n"); 121 int num = 0; 122 scanf("%d", &num); 123 printf("As of %d stage end, you have %d yen.\n", i, money(num)); 124 if ( money(num) > 0 && money(num) < 1000) { 125 printf("Continue your game.\n"); 126 127 } 128 else { 129 printf("GAME IS END! See You!\n"); 130 break; 131 } 132 } 133 134 return 0; 135}

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

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

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

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

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

guest

回答2

0

money関数

if (a = 1) {

int m = 0; return m = m + 300; }

これではa が1の場合のこの関数の戻り値は常に300になってしまいますね

  1. 所持金を表す変数をグローバル変数で定義する
  2. プログラムの最初で、所持金変数に500を入れる
  3. 勝負ごとに所持金変数をどうにかする

というとこらへんでプログラムを組み直してみましょう

投稿2018/12/31 04:58

y_waiwai

総合スコア87749

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

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

h_proc

2018/12/31 10:34

回答ありがとうございます。 int money = 500; int get_number(void) { return (int)(((((double)rand()) / (double)(RAND_MAX + 1)) * 3) + 1); } int get_money(int a) { if (a == 1) { return money == money + 300; } else if (a == 2) { return money == money - 200; } else if (a == 0) { return 500; } } のようにコードを書き直したのですが、+と-部分に左オペラントには型intが指定されています。というエラーが表示されてしまいます。グローバル関数の定義の仕方が間違っているのでしょうか。
y_waiwai

2018/12/31 10:49

> return money == money + 300; == は比較演算子です ここは = 代入の方でしょう Windows使ってるなら、VisualStudioを使えば、Cのコードを途中で止めて変数の内容を見たり1行づつ実行させたりとかして動作が見れます。 そゆのを入れてやってみればどうでしょう
h_proc

2018/12/31 14:28

ありがとうございます。やってみたいと思います。
guest

0

money関数のif文の条件が代入=になっていますが等値比較==ではないでしょうか

c

1 2 3 if (a = 1) { //a == 1では? 4 int m = 0; 5 return m = m + 300; 6 7 } 8 else if (a = 2) {//a == 2では? 9 int m = 0; 10 return m = m - 200; 11 12 13 } 14 else if (a = 0) { //a == 0では? 15 return 500; 16 }

また同じ変数の値複数回チェックする場合、switch文の方がよいような気がします。ご検討ください。

投稿2018/12/31 05:19

fu7mu4

総合スコア1088

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問