先回は、「じゃんけんゲーム」のプログラムをコンピューターの手だけでなく、人の手も表示するように変更してみた。
ただし、手の文字列、「グー」、「チョキ」、「パー」が独立した文字リテラルとして何度も現れる。
そこで、これらを「ポインタへの配列」によって実現するように変更してみよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、Visual Studio Code(1.93.1)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//じゃんけんゲーム(その3)
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int human; //人間
int comp; //コンピューター
int judge; //勝敗
int retry; //もう一度
char *hd[] = {"グー","チョキ","パー"}; //手
srand(time(NULL)); //乱数の種を設定
printf("じゃんけんをゲーム始めましょう!\n");
do
{
comp = rand() % 3; // コンピューターの手を生成
do
{
printf("\nじゃんけんポン!--->(0)グー(1)チョキ(2)パー:");
scanf("%d",&human);
} while (human < 0 || human > 2);
printf("私は%sで、あなたは%sです。\n",hd[comp],hd[human]);
judge = (human - comp + 3) % 3; //勝敗を判定
switch (judge)
{
case 0: puts("引き分けです。");
break;
case 1: puts("あなたの負けです。");
break;
case 2: puts("あなたの勝ちです。");
break;
}
printf("もう一度しますか?(0)いいえ(1)はい:");
scanf("%d",&retry);
} while (retry == 1);
return 0;
}
実行結果
じゃんけんをゲーム始めましょう!
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:0
私はチョキで、あなたはグーです。
あなたの勝ちです。
もう一度しますか?(0)いいえ(1)はい:1
じゃんけんポン!--->(0)グー(1)チョキ(2)パー:2
私はチョキで、あなたはパーです。
あなたの負けです。
もう一度しますか?(0)いいえ(1)はい:0
文字列の集合は、「2次元配列」や「ポインタの配列」で表現できる。
なお、文字列の長さが異なる場合は、「ポインタの配列」を使うと都合がよい。
「ポインタの配列」には、個々の文字列用の領域と、ポインタの配列用の領域が必要である。
前回のプログラムと比べると、とても簡潔になっている。
(参考)新・明解C言語 中級編 柴田 望洋(著)
コメント