第×章 
 〜基本編〜
 簡単なゲームを作る
 基本的な事が一通り終わったので、約束していた簡単なゲームを作ってみたいと思う
です〜。今回作るのは数あてゲームです。聞いたことがない人もいるかも知れないので
簡単にどんなゲームか説明するです。
 数あてゲームは、適当な数値を決めて、その数値を当てるというゲームですね!
 単純なゲームですがこのゲームには、出力、条件判断、繰り返し、例外処理など今ま
でやったところすべて入っているです〜。それと今回新しい機能がいくつか出てくるの
でそれも一緒にやるです〜
 それでは、今回作る数あてゲームを見てみるです〜
数あてゲーム〜♪
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
//数あてゲーム〜♪

import java.io.*;

class KazuateGame{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new
            BufferedReader(new InputStreamReader(System.in));

        //変数の宣言
        String  str;
        int myAns, cmpAns;        //自分の入力した答え、正解の答え
        int cnt = 0;              //何回目で正解したかカウントする
        boolean gamePlay = true;  //ゲームが続くか判定するフラグ

        cmpAns = (int)(Math.random()*100 + 1);  //答えを乱数で作る

        //正解するまで無限ループする
        while(gamePlay){
            cnt++;
            try{
                System.out.print("1〜100の間の整数を入力してほしいです:");
                str = br.readLine();
                myAns = Integer.parseInt(str);
            }
            catch(NumberFormatException nfe){
                //正しい値が入力されなかったのでループの最初に戻る
                continue;
            }

            if(myAns<1 || myAns>100){
                //正しい値が入力されなかったのでループの最初に戻る
                continue;
            }
            else if(myAns < cmpAns){
                System.out.println("答えは入力した数値より大きいです〜");
            }
            else if(myAns > cmpAns){
                System.out.println("答えは入力した数値より小さいです〜");
            }
            else if(myAns ==  cmpAns){
                /*
                  正解したのでフラグをfalseにする
                  breakをするのと一緒(ループから抜ける)
                */
                gamePlay = false;
            }
        }

        System.out.println("おみごとです〜 " + cnt +"回目で正解です〜");
    }
}

 まずはゲームのアルゴリズムを説明する前に、今回新しく出てきちゃったところにつ
いて説明するです〜


 まず16行目に (int)(Math.random()*100 + 1)というのがあるですね!
これは、簡単に言ってしまうと1〜100の間の乱数を発生させているです〜
乱数と言うのは適当な値です。毎回何が来るのか分からないのです。
では、なぜ1〜100の値が出てくるのか説明するです。
Math.random()というのが乱数を発生させているです。
このMath.random()を実行すると0〜0.99999・・・までの適当な少数値を決めるです。
それに100をかけると0〜99.999・・・になるですね!それ足す1をすることで
1〜100.999・・・になるです。それをint型にキャストしてあげると
1〜100の整数値になるですね!

 28行目と33行目にcontinueというものがきているですね。
これは、ブロックの最初に戻るという意味があるです。
前にbreakをやったことがあるですね!breakのときはブロックから抜けるという意味が
あったです。そして今回やったのは、今さっき言ったようにブロックの最初に戻るとい
う意味があるです。このプログラムだとwhile(gamePlay)まで戻るです〜
そして再びwhile(gamePlay)を処理するですね!

 31行目のif(myAns<1 || myAns>100)は、今までのif文と何か違うですね!
なんと条件式が2つあるです。しかも真ん中になぞの記号・・・
真ん中の謎の記号は、論理演算子という演算子です。
この論理演算子は合計3つあるですが今回出てくるのはそのうちの1つでオア(or)です。
これは、またはという意味をもっているです〜。つまり
myAns<1(myAnsが1より小さい)またはmyAns>100(myAnsが100より大きい)とき
処理をするという意味をもっているです。この2つの式のどちらかでも当てはまれば
if文は処理されるです〜

それでは、ゲームの大まかなアルゴリズムを説明するです〜
1 それぞれで使う変数などを宣言する
 内容はコメントの通りです〜
2 cmpAnsに乱数で作った値を入れる。cmpAnsには1〜100のどれかが入るです。
3 ここからループ処理がはじまるです〜
4 まずは、カウントを1増やすです。このカウントは何回目で正解したかを記録して
 おくための変数です。
5 値を入力して、整数に変換する。
 このとき正しくない値(文字など)が入力された場合再び入力させるです。
 1〜100以外の値が入力された場合も同じで再び入力させるです。
6 もし入力した値が乱数で作った答えよりも大きければ、
 答えは入力した数値より大きいです〜と表示させる
 もし入力した値が乱数で作った答えよりも小さければ、
 答えは入力した数値より小さいです〜と表示させる
 もし入力した値が乱数で作った答えと同じだったらgamePlayをfalseにする。
 これによってループしなくなるです〜
7 正解以外の場合while(gamePlay)のgamePlayがtrueのまんまなので再びループを
 繰り返すです〜。正解するまで繰り返すです〜

 簡単なゲームでも奥は結構深いですね! このゲームって実には実は答えの見つけ方に規則性があるです〜。その規則性を見つけ て見るのも面白いです〜。その答えの見つけ方が分かると最低何回で答えが見つかると いうことが分かるです。その見つけ方は検索のアルゴリズムでも使われているです〜 それでは、今回はこの辺で終了するですね!


注意:これより下はただの雑談です・・・
  久々に登場した雑談です〜
 今回の雑談は、この数あてゲームです〜。
 数あてゲームを初めて作った言語はBASICです。かなりのGoto使いだった
 です〜。Gotoというのは、知らない人は気にしないほうがいいと思うです。
 次に数あてゲームを作った言語はC言語です〜
 このときには、今説明したような感じで仕上がっていたです。
 そして次にこのゲームを作ったのはJavaです〜
 そのあと続々とVBやC#などなど(COBOL、CASLでは作ってないです)で
 数あてゲームを作ったです〜。
 つまり新しい言語に出会うと、ついついこのゲームを作りたくなってしまうという
 感じだったです〜
   
TOPに戻る   Java講座に戻る