プログラマの隠れ里 〜プログラミング初心者のサイト〜
[Contents]

- トップページ
- 自己紹介
- ダウンロード
- プログラマ度診断
- リンク

- ゲストブック
- 質問BBS

[Programming]

- VB 2005
- C 言語
- アセンブラ
- Windows
- Win2K Apache
- Java3D
- ヒント
- 書籍紹介

- じゃんけんゲーム概要

さて、それでは、いままでの知識を使ってジャンケンゲームを作ってみましょう。ジャンケンゲームを作るにあたってとりあえずは、処理の流れをまとめてみましょうか。以下のようにジャンケンゲームは構成されます。

  1. プレイヤーの手を入力
  2. コンピュータの手を計算によって求める
  3. 勝ち負け判定
  4. 続けるかどうかの入力
  5. 続ける場合@へ、続けない場合終了

大雑把につくると、このようにプログラムが構成されます。このように、1つのプログラムを部分に分けていくと、プログラミングが楽になります。

上の手順を元にして、プログラムを作って見ますと、以下のようになるでしょう。

01: #include <stdio.h>
02: 
03: int main()
04: {
05:   int n;
06:
07:  do
08:   {
09:     // @ プレイヤーの入力を求める部分
10: 
11:     // A コンピュータの手を計算する部分
12: 
13:     // B 勝ち負け判定
14:
15:     // C 続けるかどうかの入力
16:     printf("このまま続けますか?続けない場合は 0 を入力してください > ");
17:     scanf("%d", &n);
18: 
19:     // n が 0 以外だったら続ける
20:   }while(n != 0);
21:
22:   return 0;
23: }

Cの部分だけ作ってあります。他の部分は、順次作っていきましょう。とりあえず、Cの解説だけをしておきましょう。

Cの部分はまず、プレイヤーの入力を促すように printf 関数でメッセージを表示しています。つぎに scanf でプレイヤーからの入力を受け取ります。

目次へ


- プレイヤーの手をキーボードから入力

まず、プレイヤーの手の入力部分を作ってみましょう。ジャンケンには、グー、チョキ、パーの3つの手がありますが、コンピュータの内部的な情報にこれを変換しなければなりません。プレイヤーの手を整数値として、グーを 1、チョキを 2、パーを 3 に対応させましょう。

さてそこで、入力部のプログラミングですが、プレイヤーの手を保存するために変数がひとつ必要になります。なので、整数の変数を取りましょう。この変数名を player としておきましょうか。

次に、プレイヤーの手の入力ですが、まず、printf でプロンプトを表示し入力を促します。つぎに、scanf でプレイヤーからの入力を取得します。

これらを総合して以下のようになるでしょう。

int player; // プレイヤーの手を保存

...

printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > ");
scanf("%d", &player);

これを、前のプログラムに付け加えると以下のようになります。

01: #include <stdio.h>
02: 
03: int main()
04: {
05:   int n;
06:   int player; // プレイヤーの手の保存
07:
08:  do
09:   {
10:     // @ プレイヤーの入力を求める部分
11:     printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > ");
12:     scanf("%d", &player);
13: 
14:     // A コンピュータの手を計算する部分
15: 
16:     // B 勝ち負け判定
17:
18:     // C 続けるかどうかの入力
19:     printf("このまま続けますか?続けない場合は 0 を入力してください > ");
20:     scanf("%d", &n);
21: 
22:     // n が 0 以外だったら続ける
23:   }while(n != 0);
24:
25:   return 0;
26: }

赤色の行の部分が変更点です。

目次へ


- コンピュータの戦略を決定しよう

コンピュータの手の計算は、乱数を使って入力を行います。乱数を使うには、stdlib.h ヘッダーをインクルードすると、srand 関数と rand 関数が使えるようになります。srand 関数は、乱数のシード値(種値)を与えるのに使います。rand 関数は呼び出すと乱数値を1つ返します。 rand 関数は int 型の整数でとりうる値のうちの乱数値を返します。

実際に、コンピュータの手の計算は、以下のように構成されます。

#include <stdlib.h>

...

int computer; // コンピュータの手の保存

...

srand(0); // 乱数列の初期化

...

computer = rand() % 3 + 1;

上の計算の % 演算子は、剰余演算子です。簡単にいうと、割り算をして余りを求めます。なので、上の例では 3 で割った余りを求めるので、答えとしては 0 か 1 か 2 が取得できます。しかし、グー、チョキ、パーはそれぞれ 1、2、3 なので、最後に 1 を足しています。

上の部分をプログラムに加えると以下のようになります。

01: #include <stdio.h>
02: #include <stdlib.h>
03: 
04: int main()
05: {
06:   int n;
07:   int player; // プレイヤーの手の保存
08:   int computer; // コンピュータの手を保存
09:
10:   srand(0); // 乱数列を初期化
11:
12:   do
13:   {
14:     // @ プレイヤーの入力を求める部分
15:     printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > ");
16:     scanf("%d", &player);
17: 
18:     // A コンピュータの手を計算する部分
19:     computer = rand() % 3 + 1;
20: 
21:     // B 勝ち負け判定
22:
23:     // C 続けるかどうかの入力
24:     printf("このまま続けますか?続けない場合は 0 を入力してください > ");
25:     scanf("%d", &n);
26: 
27:     // n が 0 以外だったら続ける
28:   }while(n != 0);
29:
30:   return 0;
31: }

これで、プレイヤーの手とコンピュータの手の入力までが終了しました。赤い部分の行が変更点です。

目次へ


- 勝ち負け判定処理の作成

さて、ここまでで変数 player と computer にそれぞれの手が入力されました。この 2 つの変数を使って勝ち負けの判定を行います。

まず、「あいこ」になる場合を考えてみましょう。「あいこ」になる場合は、プレイヤーとコンピュータの手が同じ時です。すなわち、player == computer となるときでしょう。( == は両者が一致するかどうか判定する演算子 ) なので、この場合に「あいこ」になるように処理を行います。

つぎに、プレイヤーが勝つ場合を考えてみましょう。プレイヤーが勝つ場合は、(player, computer) = (グー, チョキ) , (チョキ, パー) , (パー , グー)すなわち、(player, computer) = (1, 2), (2, 3), (3, 1) のときです。よって、このときにプレイヤーが勝つように処理を行います。

それ以外の場合は、コンピュータが勝ちます。よって、そのように処理をします。これらをすべて考慮にいれると次のようにプログラムできるでしょう。

// 勝ち負けの判定
if(computer == player){
  printf("あいこです\n");
}else if(player == 1 && computer == 2){
  printf("プレイヤーの勝ちです\n");
}else if(player == 2 && computer == 3){
  printf("プレイヤーの勝ちです\n");
}else if(player == 3 && computer == 1){
  printf("プレイヤーの勝ちです\n");
}else{
  printf("コンピュータの勝ちです\n");
}

&& 演算子は、両隣の条件が成り立つ場合にのみ成り立ちます。つまり、言葉でいうと「かつ」をあらわします。上の例でいえば、player == 1 && computer == 2 は、「プレイヤーが 1 で、かつ、コンピュータが 2 の場合」と読めます。

プログラムに書き込むと以下のようになります。

01: #include <stdio.h>
02: #include <stdlib.h>
03: 
04: int main()
05: {
06:   int n;
07:   int player; // プレイヤーの手の保存
08:   int computer; // コンピュータの手を保存
09:
10:   srand(0); // 乱数列を初期化
11:
12:   do
13:   {
14:     // @ プレイヤーの入力を求める部分
15:     printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > ");
16:     scanf("%d", &player);
17: 
18:     // A コンピュータの手を計算する部分
19:     computer = rand() % 3 + 1;
20: 
21:     // B 勝ち負け判定
22:     if(computer == player){
23:       printf("あいこです\n");
24:     }else if(player == 1 && computer == 2){
25:       printf("プレイヤーの勝ちです\n");
26:     }else if(player == 2 && computer == 3){
27:       printf("プレイヤーの勝ちです\n");
28:     }else if(player == 3 && computer == 1){
29:       printf("プレイヤーの勝ちです\n");
30:     }else{
31:       printf("コンピュータの勝ちです\n");
32:     }
33:
34:     // C 続けるかどうかの入力
35:     printf("このまま続けますか?続けない場合は 0 を入力してください > ");
36:     scanf("%d", &n);
37: 
38:     // n が 0 以外だったら続ける
39:   }while(n != 0);
40:
41:   return 0;
42: }

これで、ひととおりプログラムが出来ました。赤い部分の行が変更点です。

プログラムを動かして見ましょう。きちんと動いたでしょうか?このようにしてプログラミングを行っていきますが、もっとうまいプログラミング法はもちろんあります。

目次へ

Copyright 1999-2005 けんいち All Right Reserved. V6PJ.