アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cプログラムについて質問です。
問題1.1~1.7の解とメイン関数を統合してじゃんけんゲームを作成しています。
(1)じゃんけんを1回した後に「続けますか?」というメッセージを画面に表示し、続ける場合は数字の1を、やめる場合は1以外の数を入力させ、続ける場合は初回に戻ってじゃんけんをし、続かない場合は終了する。
(2)じゃんけんを1回するたびにそれまでの累積の勝敗を表示する。

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か所出てきてしまいます。
どうしたら解消されるのでしょうか?
他におかしい箇所があればご指摘お願いします。
長文すみません。

質問者からの補足コメント

  • VisualStudioを使用しています。
    デバックなしで開始すると、'int'から'JPON'に変換できません。とエラーが出てしまいます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/05/01 14:34

A 回答 (2件)

1.1から1.7を読んで理解し、その後ソースコードを読んで1.1から1.7までを実現しているか解読し、どういうエラーが起きているかわからないのを知らずにその点も解読して指摘する・・・ということを依頼しているわけですか???


それはちょっとどうなのかなぁ。。。

とりあえずコンパイル・エラーやリンク・エラーは無くて実行プログラムが完成して動かせているのですか?
その場合、何をすると何というエラーになるのですか?
せめてそれくらいは具体的に書かないと。。。
この回答への補足あり
    • good
    • 0

Messyだなぁ・・・・・・。



取り敢えず、分かったトコは。

> sysken = sysjan(sai); ←エラー

まず、syskenは

JPON sysken;

としてJPON型として定義されてるんだけど、sysjanは

> int sysjan(int sai)

と定義されてて、JPON型の変数にintを代入しようとしていて、「型の不整合」が起きています。
コンパイラによってはスルーしてくれるけど、多分今のVisual Studio付属のMicrosoftのコンパイラは厳しいんで、「型の不整合」を許してないんじゃないかな。
それが、

> 'int'から'JPON'に変換できません。

と言う意味です。
だからsysjanと言う関数はJPON型を返す関数として書くべきなんじゃないかしらん。

ちなみに、clangだと問題なくコンパイル出来て、でも「ゲームの継続」は出来ないみたいなんで、他にもロジックミスがある気がするんで、覚悟しておいて下さい(笑)。
「Cプログラムについて」の回答画像2
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!