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

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

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

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

Q&A

解決済

1回答

1745閲覧

列挙体、関数を用いたじゃんけんゲームについて

vanpy

総合スコア2

Visual Studio

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

0グッド

0クリップ

投稿2021/05/01 14:32

質問内容

列挙体、関数を用いたじゃんけんゲームを以下の仕様で作成しています。
(1)じゃんけんを1回した後に「続けますか?」というメッセージを画面に表示し、続ける場合は数字の1を、やめる場合は1以外の数を入力させ、続ける場合は初回に戻ってじゃんけんをし、続かない場合は終了する。
(2)じゃんけんを1回するたびにそれまでの累積の勝敗を表示する。
1.1~1.7の解とメイン関数を統合してじゃんけんゲームを作成しています。
1.1 じゃんけんゲームで列挙体Gu(グー)に値0、Chki(チョキ)に値2、Pa(パー)に値5を割り当てるenum janken型列挙体を宣言し、これをJPON型と再定義せよ。

1.2 乱数の種に時刻を使用し、1~6の乱数(整数型)を発生する関数saikoroを作成せよ。

1.3 1~6のサイの目を引数で受け取り、目が1,2ならグーを、3,4ならチョキを、5,6ならパーを発生させる関数sysjanを作成せよ。(sysjanはコンピュータが出す拳)

1.4 コンピュータが出した拳を表示する関数watashinokenを以下の仕様で作成せよ
・引数で受け取る変数名をkenとし、その型はJPON型とする。
・引数で受け取った拳の値によって「あなたは○○を出しました。」と表示する。ここで、引数値がGuならグー、Chokiならチョキ、Paならパーの文字が表示されたものとする。
・表示の場合分けにはswitch-case文を用いる。
・この関数に戻り値はない。

1.5 挑戦者が出した拳を表示する関数anatanokenを以下の仕様で作成せよ
1.4と同じ

1.6 コンピュータが出した拳と挑戦者が出した拳を比較し、勝負結果を戻り値として返す関数shoubuを以下の仕様で作成せよ。
・引数で挑戦者の拳をkenin、コンピュータの拳をkenoutとし、その型はどちらもJPON型とする。
・勝負結果を整数型変数shoubukekkaにセットしてretrunする。なお、勝負結果と戻り値の対応関係は下記の通りとする。
・挑戦者の勝ち shoubukekka=1
・コンピュータの勝ち shoubukekka=-1
・あいこ shoubukekka=0

1.7 勝負結果を表示する関数kekkaを以下の仕様で作成せよ。
・引数が-1のとき、「あなたの負けです」と表示する。
・引数が+1のとき、「あなたの勝ちです」と表示する。
・引数が0のとき、「あいこです」と表示する。
・この関数に戻り値はない。

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(0);
}
int 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 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)
{
switch (r) {
case -1: printf("あなたの負けです\n"); break;
case 1: printf("あなたの勝ちです\n"); break;
case 0: printf("あいこです\n"); break;
}
}
int main(void) {
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);
printf("\n終わります。おつかれさまでした。\n\n");
return(0);
}
この仕様で作成してみたのですが、エラーが1つだけ出てきてしまいます。
どうしたら解消されるのでしょうか?

###エラー名

'=': 'int' から 'JPON' に変換できません。
コード:C2440

補足情報(FW/ツールのバージョンなど)

Visual Studioを使用してます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1int sysjan(int sai)

sysjanはintを返すので、JPON型の変数に代入する場合は明示的な型変換をしてください。

投稿2021/05/01 15:03

yudedako67

総合スコア2047

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

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

vanpy

2021/05/02 03:36

回答ありがとうございます。 修正してみてコンパイラ出来たのですが、ゲームの継続が出来ません。 #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(0); } 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)0); } 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) { switch (r) { case -1: printf("あなたの負けです\n"); break; case 1: printf("あなたの勝ちです\n"); break; case 0: printf("あいこです\n"); break; } } int main(void) { 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); printf("\n終わります。おつかれさまでした。\n\n"); return(0); } C26812 列挙型 'janken' は対象範囲外です。'enum' (Enum.3) より 'enum class' を優先します。 C6001 初期化されていないメモリ 'shoubukekka' を使用しています。 Project2 C6031 戻り値が無視されました: 'scanf' Project2
yudedako67

2021/05/02 03:58

「じゃんけんを1回した後に「続けますか?」というメッセージを画面に表示し、続ける場合は数字の1を、やめる場合は1以外の数を入力させ、続ける場合は初回に戻ってじゃんけんをし、続かない場合は終了する。」この部分ですか? それは単純に対応するコードがないのでできてないだけです。
vanpy

2021/05/02 07:48

回答ありがとうございます。 少し考えてみます。 また、この3つの警告が表示されてもじゃんけんゲームは問題なく実行されたのですが、警告は表示されても良いものなのでしょうか?
vanpy

2021/05/02 08:01

何度もすみません。 何回か実行してみて気づいたのですが、コンピュータ側はグーしか出してくれません。 やはりこのエラーのせいでしょうか?
yudedako67

2021/05/02 09:02

今出てる警告3つは無視しても問題ありません。グーしか出さないのはそう書いてるからです。ちゃんとsaikoroが乱数を返すのか?ちゃんとsysjanが数字に対応する手を返すのか? 個別に検証していけば原因にたどり着けるはずです。
vanpy

2021/05/02 10:37

アドバイスありがとうございます。 無事、ほかの手も出すようになりました。 #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) { switch (r) { case -1: printf("あなたの負けです\n"); break; case 1: printf("あなたの勝ちです\n"); break; case 0: printf("あいこです\n"); break; } } int main(void) { 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); printf("\n終わります。おつかれさまでした。\n\n"); return(0); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問