じゃんけん実行例とヒント

実行例

プログラムを起動すると、以下のようになるものを想定している。

% ./janken
じゃんけん…(グー=g チョキ=c、パー=p、やめる=q): g
私 グー  :  グー あなた
あいこです!
じゃんけん…(グー=g チョキ=c、パー=p、やめる=q): c
私 パー  :  チョキ あなた
負けちった!
じゃんけん…(グー=g チョキ=c、パー=p、やめる=q): p
私 チョキ  :  パー あなた
いえ〜い、勝ったぜ
じゃんけん…(グー=g チョキ=c、パー=p、やめる=q): q
えー、もうやめちゃうの? また遊んでね。バイバイ。

メッセージは適当に変えて良い。余裕があれば、

などの拡張を加えると良い。

ヒント

グー・チョキ・パーの乱数の作り方については、 数当てゲームのヒントを参考にすること。 じゃんけんの場合は、手が3つなので

グー0
チョキ1
パー2

のように0〜2の数値を利用すれば良い。

コンピュータの手を決めるときは、0〜2の乱数をグー(g)、チョキ(c)、 パー(p)に対応付ける。たとえば以下のようにする。

char janken[] = "gcp";	/* 'g', 'c', 'p', '\0' という配列ができる */
char com_hand;        	/* コンピュータの手を保存(8bitのcharで足りる) */
int x;
  :
  :
x = random()%3		/* 0〜2の乱数 */
com_hand = janken[x];	/* janken[0], janken[1], janken[2] のどれかになる */
			/* つまり 'g', 'c', 'p' のどれかになる */

ユーザが読み込んだ文字列が、グー、チョキ、パーのどれかを判別するには 先頭の一文字を比較すれば良い。たとえば、

char hand[3];			/* g,c,p,q のどれか + 改行 + \0 */
  :
  :
printf("じゃんけん…(グー=g チョキ=c、パー=p、やめる=q): ");
fgets(hand, sizeof hand, stdin); /* キーボードから入力 */

として読み込むと、ユーザが入力したものが hand 配列に 格納される様子は、以下のようになる。

となるから、先頭、つまりhand[0]'g', 'c', 'p', 'q' のどれかで場合分けすれば良い。

  :
  :
if (hand[0] == 'g') {		/* グー を入力したのね */
  /* グーの場合の処理 */
} else if (hand[0] == 'c') {	/* チョキ を入力したのね */
  /* チョキの場合の処理 */
} else if (hand[0] == 'p') {	/* パー を入力したのね */
  /* パーの場合の処理 */
} else if (hand[0] == 'q') {	/* やめる を入力したのね */
  /* やめる場合の処理 */
} else {			/* どれでもない */
  /* エラーメッセージでも表示しとこか */
}

のようにすると勝負判定とやめる場合の判定ができるだろう。


本日の課題