本ブログでは、「じゃんけんゲーム」をご紹介している。
プログラムの規模が大きくなると、すべての処理をmain関数で行うのでなく、機能別に関数で行うように改良しよう。
また、ゲームが終了したら、最終的な成績を表示するようにしよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、Visual Studio Code(1.93.1)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//じゃんけんゲーム(その4)
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human; //人間
int comp; //コンピューター
int win_no; //勝った回数
int lose_no; //負けた回数
int draw_no; //引き分けた回数
char *hd[] = {"グー","チョキ","パー"}; //手
//初期化設定
void initialize(void)
{
win_no = 0;
lose_no = 0;
draw_no = 0;
srand(time(NULL)); //乱数の種を設定
printf("じゃんけんゲームを始めましょう!\n");
}
//じゃんけん実行
int jyanken(void)
{
int i;
comp = rand() % 3; // コンピューターの手を生成
do
{
printf("\nじゃんけんポン!--->(0)グー(1)チョキ(2)パー:");
scanf("%d",&human);
} while (human < 0 || human > 2);
}
//勝ち・負け・引き分けた回数
void count_no(int result)
{
switch (result)
{
case 0: draw_no++;
break;
case 1: lose_no++;
break;
case 2: win_no++;
break;
}
}
//判定結果
void disp_result(int result)
{
switch (result)
{
case 0: puts("引き分けです。");
break;
case 1: puts("あなたの負けです。");
break;
case 2: puts("あなたの勝ちです。");
break;
}
}
//再挑戦するかを確認
int confirm_retry(void)
{
int x;
printf("もう一度しますか?(0)いいえ(1)はい:");
scanf("%d",&x);
return x;
}
int main(void)
{
int judge; //勝敗
int retry; //もう一度
initialize();
do {
jyanken();
printf("私は%sで、あなたは%sです。\n",hd[comp],hd[human]);
judge = (human - comp + 3) % 3; //勝敗を判定
count_no(judge);
disp_result(judge);
retry = confirm_retry();
} while (retry == 1);
printf("%d勝%d敗%d分けでした\n",win_no,lose_no,draw_no);
return 0;
}
実行結果
じゃんけんゲームを始めましょう!
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:0
私はパーで、あなたはグーです。
あなたの負けです。
もう一度しますか?(0)いいえ(1)はい:1
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:2
私はグーで、あなたはパーです。
あなたの勝ちです。
もう一度しますか?(0)いいえ(1)はい:1
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:0
私はパーで、あなたはグーです。
あなたの負けです。
もう一度しますか?(0)いいえ(1)はい:1
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:1
私はパーで、あなたはチョキです。
あなたの勝ちです。
もう一度しますか?(0)いいえ(1)はい:0
2勝2敗0分けでした
コードを追って、プログラムの大まかな流れを把握してみよう。
(参考)新・明解C言語 中級編 柴田 望洋(著)
コメント