じゃんけんゲームを作成したのですが
コンピュータの出す手を5つのパターンを作成して
その5つのパターンを関数化して呼び出すようにする。
というのを作成したいのですが検索などしましたが
コンピュータの調子が悪く、それらしい物が見つからず、
何方か無礼ですが自分ならこうするという模範解答お願いします…
一応下記のプログラムまでは進められましたが
switch()case を関数化してゲーム前に入力して5つのパターンを
それぞれ呼び出せるようにしたいです…
(例:ゲーム前に「パターンを選択:5でランダム、6でコンピュータ絶対勝つ…(省略)」
を表示させて入力数字でパターンを呼び出し、開始する)
5つのパターン(コンピュータの手)
完全ランダム
コンピュータが絶対勝つ
コンピュータが絶対負け
絶対引き分け
絶対引き分け無い
作成したプログラム
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char *table[]={"グー","パー","チョキ"};
int main(void)
{
int i,j;
int continue_f;
int player,computer;
int p_win,p_lose,p_draw;
int t_win,t_lose,t_draw;
t_win=t_lose=t_draw=0;
srand(time(NULL));
do{
p_win=p_lose=p_draw=0;
for(i=0;i<5;i++){
while(1){
printf("あなたが出した手は・・・\n");
printf("グー:0 パー:1 チョキ:2\n");
scanf("%d",&player);
if(0<=player&&player<=2){
break;
}else{
printf("もう一度入力してください。\n");
}
}
switch(i){
case 0:
computer=rand()%3;
break;
case 1:
computer=(player+1)%3;
break;
case 2:
computer=(player+2)%3;
break;
case 3:
computer=player;
break;
case 4:
do{
computer=rand()%2;
}while(computer==player);
break;
}
if((player+1)%3==computer){
printf("あなたは%sでわたしは%sです・・・わたしの勝利です。\n",
table[player],table[computer]);
p_lose++;
}else if(player==computer){
printf("あなたもわたしも%sです・・・引き分けです。\n",table[player]);
p_draw++;
}else{
printf("あなたは%sでわたしは%sです・・・あなたの勝利です。\n",
table[player],table[computer]);
p_win++;
}
}
printf("%d勝 %d敗 %d引き分けでした。\n",p_win,p_lose,p_draw);
printf("このまま続けますか?続ける場合は何か数字を入力し、"
"続けない場合は-1を入力してください。\n");
scanf("%d",&continue_f);
t_win+=p_win;
t_lose+=p_lose;
t_draw+=p_draw;
}while(continue_f!=-1);
printf("トータルで %d勝 %d敗 %d引き分けでした。\n",t_win,t_lose,t_draw);
return 0;
}
No.2ベストアンサー
- 回答日時:
突貫で考えたので粗悪ですが、とりあえずのコードを挙げます。
<仮定>
●ゲームモードは毎回選択する
⇔合計を取る意味が薄くなった。
●「じゃんけん処理関数」について
・引数は「プレイヤーの出した手」。戻り値は難易度にしたがい処理した「勝ち敗け結果」。
<簡単解説>
●主な変更点
・じゃんけん処理に使っていたswitch文を「ゲームモード毎のじゃんけん処理関数呼び出し」に変更。
・scanfが増えたので、エラー対策追加。
●変更コンセプトと反省点
・なるべく提示された原型を壊さずに改良してみた。
結果として、あまりよろしくない処理になっている。以下の点を改良すると、もう少しよくなると思う。
・「ゲームモードの決定処理」が「プレイヤーの手処理」の前後に存在するので可読性・移植性が悪い
「プレイヤーの手処理」も関数化して、「じゃんけん処理関数」の中から呼ぶべき
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "main.h"/* 関数の宣言などをまとめたヘッダファイル */
char *table[]={"グー","パー","チョキ"};
int main(void)
{
int i,j;
int continue_f;
int player,computer;
int p_win,p_lose,p_draw;
int t_win,t_lose,t_draw;
unsigned int gamemode;/* ゲームモードを覚えておく変数 */
t_win=t_lose=t_draw=0;
gamemode = 0;/* ちゃんと初期化します */
srand(time(NULL));
do{
/* ゲームモード選択 */
printf("ゲームモードを選択してください\n");
printf("0:楽勝\t 1:簡単\t 2:適当\n");
printf("3:いじめ\t 4:チート \n");
scanf("%d", &gamemode);
if(gamemode > 5)
{
/* エラー対策。本来は再入力を求めるべきだが、そのためには全体のロジック変更が望ましい */
/* なので、最低限の手抜き対策です */
printf("そんなモードはない。めんどいからチートモードにご案内\n");
gamemode = 4;
}
p_win=p_lose=p_draw=0;
for(i=0;i<5;i++){
while(1){
printf("あなたが出した手は・・・\n");
printf("グー:0 パー:1 チョキ:2\n");
scanf("%d",&player);
if(0<=player&&player<=2){
break;
}else{
printf("もう一度入力してください。\n");
}
}
switch(gamemode){
case 0:
/* 関数「楽勝」をコール (コンピュータが絶対負け)*/
computer = Veryeasy_mode(player);/*関数の中身は御自分でお願いします*/
break;
case 1:
/* 関数「簡単」をコール */
computer = Easymode(player);/*関数の中身は御自分でお願いします*/
break;
case 2:
/* 関数「適当」をコール */
computer = Normalmode(player);/*関数の中身は御自分でお願いします*/
break;
case 3:
/* 関数「いじめ」をコール */
computer = Hardmode(player);/*関数の中身は御自分でお願いします*/
break;
case 4:
/* 関数「チート」をコール (コンピュータが絶対勝つ)*/
computer = Cheetmode(player);/*関数の中身は御自分でお願いします*/
break;
default:
/* エラー対処済みなので何もしない */
/* めんどいのでやってないが、本来はゲームモードのスイッチ処理⇒プレイヤーの手処理とするべき */
break;
}
//以下、「勝敗処理」は提示頂いたコードと同じなので省略
この回答への補足
私のミスだと思うのですが実行できません…
多分swicth caseの関数の中身を間違えているみたいで…
お手数をお掛けしますが書いて頂けると助かります…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パスカルの三角形についてのCプ...
-
【C言語教えてください】sin波...
-
配列データをExcelファイルとし...
-
プログラム(C言語)
-
C言語初心者です。次の問題で質...
-
%P と %X の違い
-
10進数を2進数に変換するには・...
-
複素数の四則計算
-
LU分解法のピボット選択機能実...
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
すごろくに使用するサイコロ
-
三角形の判別
-
int型 00 を表示するのに0とな...
-
C言語 プログラミング
-
なぜgccはstdio.hをインクルー...
-
ピラミッド表示プログラム。
-
コマンドラインに出力した文字...
-
C言語に関する質問です
-
コンパイルエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
strcmp
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
cshの文字列操作(0埋め)
-
4の倍数を論理演算で表す。。
-
C言語 プログラミング
-
%P と %X の違い
-
8人分のテストの点数を入力し、...
-
C言語での、年複利の計算方法...
-
printf( " %2d", p * q );
-
hit&bolwのプログラミングがで...
-
scanfに文字が入力されたときに...
-
error C2143: 構文エラー : ';'...
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
unsigned int型について
おすすめ情報