dポイントプレゼントキャンペーン実施中!

急いでいて大変困っています
じゃんけんゲームを作成したのですが

コンピュータの出す手、5つのパターン
(完全ランダム
コンピュータが絶対勝つ
コンピュータが絶対負け
絶対引き分け
絶対引き分け無い)
を作成して
その5つのパターンを関数化して呼び出すようにする。

というのを作成したいのですが
一応下記のプログラムまでは進められましたが
switch() case を関数化してint main(void)の外に書き込み
それぞれ呼び出せるようにしたいです。
PCの調子が悪く調べてもあまり出ず本当に困っています
私ならこう、というプログラムをご教授お願いします


作成したプログラム
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *table[]={"グー","パー","チョキ"};

int main(void) ★int mainここから
{
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(0){//()の中を変更して下記のcaseを呼び出す★switch caseここから
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;
}               ★swicth caseここまで
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;
}    ★int main ここまで

A 回答 (7件)

> computer = computerSide(player, 3);


> をint main(void)の外に出して動かすことは可能でしょうか?

はい,可能です。
    • good
    • 0
この回答へのお礼

前回に続き、有難うございました。
本当に助かりました、とてもわかり易かったです^^

お礼日時:2012/12/10 21:33

> switch (tactics) {


> の()の中を1から4のどれかに変えて
> それぞれのcase1~case4を呼び出すことは可能ですか?


じゃんけんゲームが続くあいだずっと
コンピュータの戦法を1~4のどれかに決めたいというのであれば,
私の回答ANo.3の computer = computerSide(player, 3); で回答済。

あなたが一手打つたびに
コンピュータの戦法を0~4のどれかにランダムに変えたいというのであれば,
chie65535さんの回答ANo.4の computer = func(player, rand()%5); で回答済。

質問者のニーズがどちらでもないのなら,
何がしたいのか詳しく説明してください。

この回答への補足

ご指摘有難うございます、解決しました。
最後になりますが
computer = computerSide(player, 3);
をint main(void)の外に出して動かすことは可能でしょうか?
今回の質問内容は解決したのであくまでこれは疑問に思ったことです…

補足日時:2012/12/10 20:02
    • good
    • 0

因みに、func関数は



int func(int player,int mode)
{
return (player*(mode!=0)+(rand()%(3-(mode==4)))*!(mode%4)+(mode%3))%3;
}

のように、switch~case文を使わなくても書ける。
    • good
    • 0

#include <stdio.h>


#include <stdlib.h>
#include <time.h>

char *table[]={"グー","パー","チョキ"};

int func(int player,int mode)
{
 switch(mode){
 case 0:
  return rand()%3;
 case 1:
  return (player+1)%3;
 case 2:
  return (player+2)%3;
 case 3:
  return player;
 }
 return (player+rand()%2+1)%3;
}

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");
    }
   }
   computer=func(player,rand()%5);
   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;
}
    • good
    • 0

次の関数をmain()関数の外に書き込み,


int computerSide(int player, int tactics) {
int computer;
switch (tactics) {
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()%3;
}while(computer==player);
break;
}
return computer;
}

次の形でmain()関数の中から呼び出す。
computer = computerSide(player, 3);

この回答への補足

ご回答有難うございます
switch (tactics) {
の()の中を1から4のどれかに変えて
それぞれのcase1~case4を呼び出すことは可能ですか?

補足日時:2012/12/10 15:44
    • good
    • 0

コードの処理内容をちゃんと理解していないから、関数に切り出す。


とかも出来ないのではないですか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *table[]={"グー","パー","チョキ"};
int player,computer;

void func()
{
 switch(0){
  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;
 }
}

int main(void)
{
 int i,j;
 int continue_f;
 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");
    }
   }
   func();
   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;
}

「switch() case を関数化してint main(void)の外に書き込みそれぞれ呼び出せるようにしたいです。」
という要求仕様には沿っていますよ。
グローバル変数にしてみたり引数や戻り値も使っていませんから課題なら高確率でNGですけどね。
# switch(0)はそのまま。このままじゃcase 0のところしか通りませんけどね。

この回答への補足

ご回答有難うございます
swicth(0)をswicth(1)に変えると
case1 の処理をしますか?
今、動作確認ができないもので…すみません

補足日時:2012/12/10 15:46
    • good
    • 0

で何がどう分からないのですか?



前の質問に対する回答は理解できてるんでしょ?

参考URL:http://oshiete.goo.ne.jp/qa/7833812.html

この回答への補足

swicth caseの部分を関数化して
int mainの上、つまり

#include <time.h>
★ここ
char *table[]={"グー","パー","チョキ"};
★あるいはここです
int main(void)
…(省略)

の間に記述し、動作させたいです…
なのでint main内で動作していた前回とは違います…

補足日時:2012/12/10 12:37
    • good
    • 0

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