• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 じゃんけんswicth case 関数化)

C言語 じゃんけんswicth case 関数化

このQ&Aのポイント
  • C言語でじゃんけんゲームを作成する際に、コンピュータの出す手の5つのパターンを関数化し、呼び出せるようにしたい。
  • プログラムの中でswitch caseを使用し、各パターンを抽選してコンピュータの手を決定する。
  • プレイヤーとの対戦結果を表示し、引き分け・勝利・敗北の数をカウントし、最終的な結果を表示する。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.7

> computer = computerSide(player, 3); > をint main(void)の外に出して動かすことは可能でしょうか? はい,可能です。

nanashi011
質問者

お礼

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

その他の回答 (6)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.6

> switch (tactics) { > の()の中を1から4のどれかに変えて > それぞれのcase1~case4を呼び出すことは可能ですか? じゃんけんゲームが続くあいだずっと コンピュータの戦法を1~4のどれかに決めたいというのであれば, 私の回答ANo.3の computer = computerSide(player, 3); で回答済。 あなたが一手打つたびに コンピュータの戦法を0~4のどれかにランダムに変えたいというのであれば, chie65535さんの回答ANo.4の computer = func(player, rand()%5); で回答済。 質問者のニーズがどちらでもないのなら, 何がしたいのか詳しく説明してください。

nanashi011
質問者

補足

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

回答No.5

因みに、func関数は int func(int player,int mode) { return (player*(mode!=0)+(rand()%(3-(mode==4)))*!(mode%4)+(mode%3))%3; } のように、switch~case文を使わなくても書ける。

回答No.4

#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; }

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

次の関数を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);

nanashi011
質問者

補足

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

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

コードの処理内容をちゃんと理解していないから、関数に切り出す。 とかも出来ないのではないですか? #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のところしか通りませんけどね。

nanashi011
質問者

補足

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

で何がどう分からないのですか? 前の質問に対する回答は理解できてるんでしょ?

参考URL:
http://okwave.jp/qa/q7833812.html
nanashi011
質問者

補足

swicth caseの部分を関数化して int mainの上、つまり #include <time.h> ★ここ char *table[]={"グー","パー","チョキ"}; ★あるいはここです int main(void) …(省略) の間に記述し、動作させたいです… なのでint main内で動作していた前回とは違います…

関連するQ&A