- ベストアンサー
C言語 じゃんけんswicth case 関数化
- C言語でじゃんけんゲームを作成する際に、コンピュータの出す手の5つのパターンを関数化し、呼び出せるようにしたい。
- プログラムの中でswitch caseを使用し、各パターンを抽選してコンピュータの手を決定する。
- プレイヤーとの対戦結果を表示し、引き分け・勝利・敗北の数をカウントし、最終的な結果を表示する。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> computer = computerSide(player, 3); > をint main(void)の外に出して動かすことは可能でしょうか? はい,可能です。
その他の回答 (6)
- jjon-com
- ベストアンサー率61% (1599/2592)
> 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)の外に出して動かすことは可能でしょうか? 今回の質問内容は解決したのであくまでこれは疑問に思ったことです…
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
因みに、func関数は int func(int player,int mode) { return (player*(mode!=0)+(rand()%(3-(mode==4)))*!(mode%4)+(mode%3))%3; } のように、switch~case文を使わなくても書ける。
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
#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)
次の関数を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を呼び出すことは可能ですか?
- Wr5
- ベストアンサー率53% (2173/4061)
コードの処理内容をちゃんと理解していないから、関数に切り出す。 とかも出来ないのではないですか? #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 の処理をしますか? 今、動作確認ができないもので…すみません
- Tacosan
- ベストアンサー率23% (3656/15482)
で何がどう分からないのですか? 前の質問に対する回答は理解できてるんでしょ?
補足
swicth caseの部分を関数化して int mainの上、つまり #include <time.h> ★ここ char *table[]={"グー","パー","チョキ"}; ★あるいはここです int main(void) …(省略) の間に記述し、動作させたいです… なのでint main内で動作していた前回とは違います…
お礼
前回に続き、有難うございました。 本当に助かりました、とてもわかり易かったです^^