じゃんけんプログラムを作成しよう!

 

●開発項目

(1)勝負の判定

(2)ランダムな手

(3)結果の集計

(4)表示の体裁

(5)入力ミスへの対応

 

(1)勝負の判定

二人のプレイヤーが、じゃんけんの勝負をした場合の勝負の判定を考えましょう。

 

○変数の説明

  A   -> Aさんのじゃんけんの手

  B   -> Bさんのじゃんけんの手

               じゃんけんの手:グー(0)、チョキ(1)、パー(2)

 hantei  -> Aさんにとっての勝ち負けの判定

        0:引き分け、1:勝ち、2:負け

 

判定処理

x = ((A==0)&&(B==1))||((A==1)&&(B==2))||((A==2)&&(B==0));

y = ((A==0)&&(B==2))||((A==1)&&(B==0))||((A==2)&&(B==1));

hantei = x ? 1 : (y ? 2 : 0);

 

○補足

xは、Aさんが勝つ判定で、yは、Aさんが負ける判定です。それぞれ、真であれば、1の値を、偽であれば、0の値をとります。

 

☆ステップ@

勝負の判定を行う関数を作成しましょう。

 

#include<stdio.h>

 

int judge(int,int);

 

main()

{

        int a,b,c;

 

        printf("*** じゃんけんの手 ***\n  0:グー\n  1:チョキ\n  2:パー\n\n");

        printf("Aさんの手: ");

        scanf("%d",&a);

        printf("Bさんの手: ");

        scanf("%d",&b);

 

        c = judge(a,b);

 

        printf("\nA:%d vs B:%d -> [%d]\n",a,b,c);

        printf("[0]:引き分け, [1]:Aさんの勝ち, [2]:Aさんの負け\n\n");

}

 

int judge(【???】)

{

        【???】

}

 

(2)ランダムな手

AさんとBさんの二人の手を自分がキーボードから入力していたのでは、面白くありません。Bさんの手を自動的にランダムに選択できるようにしましょう。

コンピュータとの勝負です。

 

rand関数

乱数を発生させる関数として、rand関数が用意されています。例えば、0から9までの整数をランダムに5回発生させるプログラムは、次のようになります。

 

#include<stdio.h>

#include<stdlib.h>

 

main()

{

        int i;

 

        for(i=0;i<5;i++)

                printf("[%d] : %d\n",i+1,rand()%10);

}

 

○擬似乱数

上記のプログラムを何度も実行してみて下さい。何か気付きましたか?

全く同じパターンで数が表示されていると思います。つまり、計算機の中で作られる乱数は、擬似乱数と呼ばれ、常に、同じパターンで数が表示されます。

これでは本当の意味で、ランダムとはいえません。この発生パターンを変えるのに、srand関数が用意されています。このsrand関数の引数の値を変えることによって、パターンを変える事ができます。

 

#include<stdio.h>

#include<stdlib.h>

 

main()

{

        int i,r;

 

        scanf("%d",&r);

        srand(r);

        for(i=0;i<5;i++)

                printf("[%d]:%d\n",i+1,rand()%10);

}

 

実際のプログラムでは、srand関数の引数を計算機内部の時計の秒等の値を利用して、与えています。

 

#include<stdio.h>

#include<stdlib.h>

#include <time.h>

 

main()

{

        int i,r;

        struct tm *newtime;

        time_t long_time;

 

        time( &long_time );

        newtime = localtime( &long_time );

        r = newtime->tm_sec;

        srand(r);

        for(i=0;i<5;i++)

                printf("r:%d,[%d]:%d\n",r,i+1,rand()%10);

}

 

☆ステップA

Bさんの手をrand関数を使用して、ランダムに手が選ばれるようにしましょう。

 

#include<stdio.h>

???】

 

int judge(int,int);

 

main()

{

        int a,b,c;

        int r;

        struct tm *newtime;

        time_t long_time;

 

        time( &long_time );

        newtime = localtime( &long_time );

        r = newtime->tm_sec;

        【???】

 

        printf("*** じゃんけんの手 ***\n  0:グー\n  1:チョキ\n  2:パー\n\n");

        printf("Aさんの手: ");

        scanf("%d",&a);

 

        b = 【???】

        printf("Bさんの手: %d\n",b);

 

        c = judge(a,b);

 

        printf("\nA:%d vs B:%d -> [%d]\n",a,b,c);

        printf("[0]:引き分け, [1]:Aさんの勝ち, [2]:Aさんの負け\n\n");

}

 

int judge(【???】)

{

        【???】

}

 

(3)結果の集計

1回限りのじゃんけん勝負では、あまり面白くありません。10回勝負とし、Aさん(自分)の勝ち、負けなどの回数を毎回表示するようにしましょう。

 

○集計方法

今回の場合、次のように配列を使用して、Aさんの勝ち、負けなどの回数を集計すると便利です。

 

main()

{

        int i,result[3];

 

        for(i=0;i<3;i++)

                result[i] = 0;

 

        【省略】

        c = judge(a,b);

 

        ++result[c];

        【省略】

 

        printf("勝ち:[%d]回, 負け:[%d]回, 引き分け:[%d]回\n",result[1],result[2],result[0]);

}

 

☆ステップB

コンピュータとじゃんけんを10回行い、勝負の結果を表示するプログラムを作成して下さい。

5回以上勝てば、あなたはかなり勝負強い人です。

 

●その他

以下、開発が必要な項目として、次の項目が残っています。

(4)表示の体裁

(5)入力ミスへの対応

 Aさんの手として、キーボードから0、1、2のいずれかの数値を入力してもらっていますが、もし、間違った数値が入力されたときプログラムは正常に動くのでしょうか?とても心配です。

そこで、通常は、プログラムで入力された値を確認し、必要に応じて再度、入力を求める処理が必要となります。