『楽しく!』『できる!!』C講座のページ


第4回:ゲームを作ろう!

・条件分岐
さて、今回は条件分岐(if文)をつかって簡単なゲームを作ってみたいと思います。
『なるべく、遊びの要素をとりいれた楽しい講座を』なんていってたくせに、全然つまんねーよ。と思っていたあなた!お待たせしました。ゲームです。
今回は少々ソースが長くなっていますが、頑張ってください。

・条件分岐

 条件分岐とは、その名のとおり、「〜 ならば …」というように条件によって分岐するものです。今回紹介するのは 『if文』 と呼ばれる構文です。
ソースでは、

    if( 条件式 ){   
      実行文1    
    }         

という形で書かれます。この"条件式"の部分が「判定」され、その式が 成立するとき(真(≠0)のとき)に、実行文1が実行 されます。このとき、条件式が成立しないとその次の { から } までの実行文1は無視されます。

<例1>


 if( a >= 1){
   printf(" a は 1 以上です。\n"); 
 }



と書くと、a が 1 以上のときは a は 1 以上です。 と表示し、改行します。
しかし、a >= 1 が成立しないとき、つまり a が 1 より小さいときは、printf は無視されます。

判定に使われる”>=”などの記号を関係演算子とよびます。
関係演算子には以下のような種類があり、それぞれを条件式のところに用いることができます。


関係演算子 意味
a == b aとbは等しい
a != b aとbは等しくない
a <= b aはb以下である
a < b aはbより小さい
a >= b aはb以上である
a > b aはbより大きい


また、その応用(?)の形として

 if( 条件式1 ){
    実行文1
 }
 else if( 条件式2 ){ 
    実行文2
 }


 else
    実行文 n

というように書くことができます。
ここで新しくでてきた"else if( 条件式2 )"というのは、
「そうでなくて 〜 なら…」というもので、 上にあるif文が成立しないとき(偽(=0)のとき)に、条件式2を判定し、真ならば その下の 実行文2 を実行します。
また、一番最後の else は「そうでなければ」の意味で、これまでの条件式がすべて成立しないときに 実行文n を実行します。
else if はいくつも続けて書くことができ、最後の else は省略可能です。

<例2.1>


 if( a>=1 ){
    printf(" a は 1 以上です。\n");
 }
 else if( a<1 ){
    printf(" a は 1 より小さいです。\n");
 }
 else{
    printf(" a は数字ではありません。\n"); 
 }



とすれば、aが1以上ならば a は 1 以上です。と表示し、aが1より小さければ a は 1 より小さいです。と表示する。
それ以外なら(上の条件式のどれも成立しなければ) a は数字ではありません。と表示します。
また、 実行文の範囲を示す{ と }は実行文が一行のときは省略することができます。
つまり

<例2.2>


 if( a>=1 )
    printf(" a は 1 以上です。\n");
 else if( a<1 )
    printf(" a は 1 より小さいです。\n");
 else
    printf(" a は数字ではありません。\n"); 



という形に書けるのです。 逆に言えば、実行文が複数行に及ぶときは"必ず"{ と }を必要とするということです!




今回のソースは


/*ZJanken*/

 #include<stdio.h>
 void main(void)
 {
    char selected; /* プレイヤーが選択したものを入れておく */

    printf("************************************** \n"); 
    printf("* じゃんけんゲーム * \n");
    printf("************************************** \n");
    printf("\n");
    printf("#### 説明 #######\n");
    printf("# g : グー  #\n");
    printf("# t : チョキ #\n");
    printf("# p : パー  #\n");
    printf("#################\n");
    printf("\n");
    printf("\n");
    printf("ジャンケンしよう!\n");
    printf("ジャンケン……\n");
    scanf("%c",&selected);    /* プレイヤーが選択したキャラを 
                         selected に格納 */
    printf("ほいっ!!\n");

    if(selected == 'g'){
        printf("++++++++++++++\n");
        printf(" あなた:グー \n");
        printf(" わたし:パー \n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");
    }
    else if(selected == 't'){
        printf("++++++++++++++\n");
        printf(" あなた:チョキ\n");
        printf(" わたし:グー \n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");
    }
    else if(selected == 'p'){
        printf("++++++++++++++\n");
        printf(" あなた:パー \n");
        printf(" わたし:チョキ\n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");
    }
    else
        printf("エラー!! g,t,p の中から選択してください!!\n"); 
 }

です。

 今回は、簡単なゲームを作ってもらいましたがどうだったでしょうか?
 このゲームにはまだまだ、いろいろな問題点があります。
まず、第一に "絶対勝てない" こと。 まぁ、だから 「ZJanken」(Zettaikatenai Janken) なわけですが(^^;
次回からは、このプログラムをもとに、もっとよいものに改良していく過程でいろいろなことを紹介していこうと思います。

 自分で考え、新しいプログラムを作ることは何よりも良い上達への近道です。
自分で考えることで、おのずと自分がどの程度理解しているかが分かるでしょう。


・今回の課題
 今回のソースを参考にし、何か新しいプログラムを作成してください。
できるかぎり、今回までに習ったことのみを使用することとします。




・前回の答え


 まずお詫びします。前回の内容に「文字列の入力」に関する説明がないのに、課題は文字列の入力を必要とするものでした。詳しい内容は「文字列とポインタ」などで詳しく触れるつもりです。
 文字列の入力はよく使うのですが、概念を説明しようとすると一回の講座を必要とします。今回はこのようにすればデキル。とおまじないのように考えておいてください。追々説明します。
 少しだけ説明すると、下のように  char 変数名[文字数]; というように宣言すれば、文字列を扱う変数を定義できます。それ以降の扱いは他の変数と変わりません。  また扱える文字数は char 変数名[10]; と書けば9文字まで。 char 変数名[20]; と書けば19文字まで。というように [ ]の中の数字-1の文字数までとなります。 ですので char 変数名[101]; とでもしておけば当面は大丈夫でしょう。(あまりむやみに数字を大きく設定するとまずいのですが。)
 また、これだけでは年齢の入力を求められたときに、文字を入力するとバグります。これを回避する為には…。
今回の講座の内容が解っていればできそうですね。


 #include <stdio.h>

 void main(void)
 {

  int age;
  char name[10];

  printf("「あなたの名前を教えていただけますか?」\n");

  scanf("%s",&name);

  printf("「%sさんですね。私はRX-2343です。」\n",name); 
  printf("「あなたのお歳を教えていただけますか?」\n");

  scanf("%d" ,&age);

  printf("「%d歳ですか。」\n",age);
  printf("「私は1000歳になります。」\n");
 }