条件判定とループ課題:じゃんけんゲームを作る

目次

  1. 条件判定:if文, switch文
  2. 条件ループ:for文, while文
  3. 練習課題その4:じゃんけんゲームを作る

1. 条件判定:if文, switch文

 ある条件によりプログラムの流れを変えるためには、条件判定文を使います。条件判定文には、if文とswitch文の2種類があります。

条件判定文
    if文
    ‾‾
    if ( 条件式 )
      {
        条件式が真の時の動作       
      }
    else
      {
        条件式が偽の時の動作        
      }


    switch文
    ‾‾‾‾
    switch ( 整数値式 )
      {
         case n:
           整数値式 = n の時の動作
           break;
         ...

         default:
           上記のどのcaseにも洩れた場合の動作    
      }

条件式に使う比較演算子は「簡単な数値計算プログラム」のところに出てきましたね。

次に、if文、switch文の例を示します。分かりますか?

if文の例
    この例では整数変数aが100より大きいか、等しいか、それ以外かで
    動作を3通りに変えています。

    if ( a > 100 )
      {
         printf("aは100より大きい\n");
      }
    else if ( a == 100 )        /* "=="であることに注意! "="では代入になります */  
      {
         printf("aは100と等しい\n");
      }
    else
      {
         printf("aは100より小さい\n");
      }

switch文の例
    この例では整数変数aの値により画面への表示を3通りに変えています。

    switch( a )
      {
         case 1:
           printf("aは1だよ!\n");
	   break;
         case 2:
           printf("aは2だよ!\n");
	   break;
         case 3:
           printf("aは3だよ!\n");
	   break;
         default:
           printf("aは1でも2でも3でもないよ!\n");
      }




2. 条件ループ:for文, while文

 ある条件の下で繰り返し処理を行なうには、条件ループを使います。
条件ループの書き方は幾つかありますが、ここではfor文とwhile文の2つ
を説明します。

条件判定ループ
    for 文
    ‾‾‾
    for ( 初期化 ; 繰返し条件 ; 繰返し式 )
      {
        繰返したい動作       
      }

これだけでは分かりづらいですね。次の例を見て下さい。

for文の例
    この例では、iが0から9まで1ずつ増えながら繰り返し10回ループします。
    i++は i=i+1の意味です。

    int i;

    for ( i=0; i<10; i++)
      {
         printf("i=%d\n", i);
      }


条件判定ループ
    while 文
    ‾‾‾‾
    while ( 繰り返し条件 )
      {
        繰返したい動作       
      }

こちらの方がfor文よりも簡単そうですね。では次の例を見てみましょう。

while文の例
    この例も、iが0から9まで1ずつ増えながら10回ループします。
    for文の場合との違いに注意して下さい。

    int i;

    i=0;

    while ( i<10 )
      {
         printf("i=%d\n", i);
         i++;
      }




3. 練習課題その4:じゃんけんゲームを作る

 条件判定、条件ループを使って、じゃんけんゲームを作りましょう。
じゃんけんゲームの流れは次のようになります。

じゃんけんゲームの流れ

    ゲーム終了フラグに0を代入する

    ゲーム終了フラグが1でなければ次のループを繰り返す

          (1)  printf(...)を用いてメニューを表示する「1.グー 2.チョキ 3.パー 4.終了」    
          (2)  scanf(...)を用いて整数を入力する
          (3)  if文で入力された数字を調べる。それが4なら以下を実行する。

                    (a) ゲーム終了フラグに1を代入する

               それが4でなければ以下を実行する。

                    (a) コンピュータの手を作る(drand48()を使用。詳細は後で)
                    (b) if文でコンピュータとプレーヤの勝敗を判定し、
                        判定結果を表示する。
             

     ゲーム終了メッセージの表示

 たったこれだけで作れ!というのも酷だと思いますので、以下に上の流れに沿っ
た雛型を示します。全部自分で作る自身がない人はこれを参考に穴埋めをしてゲー
ムを完成させて下さい。

/* "jgame.c" --- じゃんけんゲームプログラム */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* メイン関数(必ず必要。C言語ではこの中が最初に実行される) */
int main(void)
{
	int game_end;               /* ゲーム終了フラグ */
	int player;                 /* プレーやの手 */
	int computer;               /* コンピュータの手 */ 

	game_end = 0;               /* ゲーム終了フラグの初期化 */

        srand48(time(NULL));          /* 乱数列の初期化 */

	/*
         * ゲームが終了するまでのループ
         */
	while ( game_end != 1 )
	  {
             /* メニュー表示 */
             printf("1. グー  2.チョキ  3.パー  4.終了\n");
             printf("input>");

             /* 入力(変数playerに入る) */
             scanf("%d", &player);

             /* 入力が4なら*/
             if ( player == 4 )
               {

                  game_end = 1;     /* ゲーム終了フラグを1にする */

               }
             else /* そうでなければ */
               {

                  /* 乱数によりコンピュータの手を作る(1 or 2 or 3) */
                  computer = (int)( 2.9999 * drand48() ) + 1;

                  /* 自分とコンピュータの手が同じ場合 */
                  if ( player == computer )
                    {
                       printf("あいこでしょ\n");
                    }

                  (残りのif文は自分で考えよう)

               }
	  }

        printf("ゲーム終了\n");

	return 0;
}


じゃんけんゲームの解答例
/* "jgame.c" --- じゃんけんゲームプログラム */

#include 
#include 
#include 

/* メイン関数(必ず必要。C言語ではこの中が最初に実行される) */
int main(void)
{
	int game_end;               /* ゲーム終了フラグ */
	int player;                 /* プレーヤの手 */
	int computer;               /* コンピュータの手 */ 

	game_end = 0;               /* ゲーム終了フラグの初期化 */

        srand48(time(NULL));          /* 乱数列の初期化 */

	/* ゲームが終了するまでのループ*/

	while ( game_end != 1 )
	{
		/* メニュー表示 */
		printf("1. グー  2.チョキ  3.パー  4.終了\n");
		printf("input>");

		/* 入力(変数playerに入る) */
		scanf("%d", &player);

		/* 入力が4なら*/
		if ( player == 4 )
		{
		game_end = 1;     /* ゲーム終了フラグを1にする */
		}
			else /* そうでなければ */
			{
			/* 乱数によりコンピュータの手を作る(1 or 2 or 3) */
			computer = (int)( 2.9999 * drand48() ) + 1;

			/* 自分とコンピュータの手が同じ場合 */
			if ( player == computer )
			{
			printf("あいこでしょ\n");
			}
			else if( (player == 1 && computer == 2)
			   ||
			   (player == 2 && computer == 3)
			   ||
			   (player == 3 && computer == 1))
		    {
		      printf("あなた: %d\n",player);
		      printf("こんぴゅーた: %d\n",computer);
		      printf("あなたのかち\n");
		      //	      game_end = 1;     /* ゲーム終了フラグを1にする */		      

		    }
		  else{
		    printf("あなた: %d\n",player);
		    printf("こんぴゅーた: %d\n",computer);
		    printf ("あなたのまけ\n");
		    //		game_end = 1;     /* ゲーム終了フラグを1にする */		 
		  }

 			}
	  }

        printf("ゲーム終了\n");

	return 0;
}  

 drand48()は0.0〜1.0の間の乱数を生成する関数です。
 drand48()を使用する前には、srand48()を呼び出して乱数を初期化する必要があります。


 プログラムを打ち込み終ったら、コンパイルし、実行して下さい。
ゲームはちゃんとできるでしょうか。早く終った人は、コンピュータの手の表示等、
工夫を凝らして下さい。

 
戻る