プロが教える店舗&オフィスのセキュリティ対策術

じゃんけんゲームを作成したのですが

コンピュータの出す手を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;
}

A 回答 (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の関数の中身を間違えているみたいで…
お手数をお掛けしますが書いて頂けると助かります…

補足日時:2012/12/07 23:48
    • good
    • 0
この回答へのお礼

自己解決しました。申し訳ありませんでした

お礼日時:2012/12/10 11:55

関数に「しない」なら作れますか?

    • good
    • 0

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