![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
急いでいて大変困っています
じゃんけんゲームを作成したのですが
コンピュータの出す手、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 ここまで
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); で回答済。
質問者のニーズがどちらでもないのなら,
何がしたいのか詳しく説明してください。
この回答への補足
ご指摘有難うございます、解決しました。
最後になりますが
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;
}
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);
この回答への補足
ご回答有難うございます
switch (tactics) {
の()の中を1から4のどれかに変えて
それぞれのcase1~case4を呼び出すことは可能ですか?
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のところしか通りませんけどね。
この回答への補足
ご回答有難うございます
swicth(0)をswicth(1)に変えると
case1 の処理をしますか?
今、動作確認ができないもので…すみません
No.1
- 回答日時:
この回答への補足
swicth caseの部分を関数化して
int mainの上、つまり
#include <time.h>
★ここ
char *table[]={"グー","パー","チョキ"};
★あるいはここです
int main(void)
…(省略)
の間に記述し、動作させたいです…
なのでint main内で動作していた前回とは違います…
お探しの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言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
%P と %X の違い
-
C言語で四則演算を使って結果が...
-
入力したお金の金額からお札の...
-
8人分のテストの点数を入力し、...
-
円の面積を求めるプログラミン...
-
コンパイルエラーについて
-
C言語のプログラミングについて...
-
ビット演算で!?
-
3つの整数を画面から入力して...
-
文字を動かしたい
-
defineで定数が置き換えられな...
-
ヌメロンの対戦相手
-
既約分数の表示プログラム
-
C言語 プログラミング
-
ブラックジャック
-
strcmp
-
switch分のケースを範囲数?に...
-
万年カレンダーのC言語プログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報