学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その13 簡単なゲームを作成

<<前  [TOP]  次>>


メモ帳を開いて次のプログラムを作ってみましょう。


Saikoro.java 直

public class Saikoro {

        public static int score = 100;
                                                                                
        public static int bet = 5;

	public static int round = 1;

        public static String[] diceStrings = {
                "| * |", "| : |", "|...|", "|: :|"," |:.:|"," |:::|" };
                                                                                
        public static void throwDices() {
                                                                                
                int me1 = (int)(Math.random()*6.0);
                int me2 = (int)(Math.random()*6.0);
                showDices( me1, me2 );
                checkPoints( me1, me2 );
        }
        public static void showDices( int a, int b ) {
                                                                                
                System.out.println("");
                System.out.println( diceStrings[a] + " " + diceStrings[b] );
                System.out.println( "" );
        }
        public static void checkPoints( int a, int b ) {
                                                                                
                int c = a + b + 2;
                if( c%2 == 0 ) {
			if( a == b ) {
                        	score += bet*2;
             	           System.out.println( "あなたは " + bet*2 + "$ 勝ちました。" );
               		 }
			else { 
				score += bet;
				System.out.println( "あなたは " + bet + "$ 勝ちました。" );
			}
		}
                                                                                
                else {
			if( c == 7 ) {
				score -= bet*2;
				System.out.println( "あなたは " + bet*2 + "$ 負けました。");
	                }
			else {
				score -= bet;
				System.out.println("あなたは " + bet + "$ 負けました。" );
			}
		}
	        System.out.println( "あなたの持ち金は" + score + "$ です。" );
        }
	public static void keyInput() {
                try {
                        int c = System.in.read();
                }
                catch( Exception e ) { }
        }
	public static void main( String[] args ) {
                                                                                
		while( score > 0 ) {
			System.out.println( "" );
			System.out.println( "エンターキーを押してください。" );
			keyInput();
			System.out.println( "" );
			System.out.println( "ラウンド:" + round );
			throwDices();
			round++;
		}
		System.out.println( "あなたのお金はなくなりました。ゲームオーバーです。" );
                                                                                
        }
}



まず最初に次の文を見てください。

public static int score = 100;

public static int bet = 5;

public static int round = 1;

public static String[] diceStrings = { "| * |", "| : |", "|...|", "|: :|"," |:.:|"," |:::|" };



これは、サイコロを記号で作っています。
ダブルコーテーション(”)で囲まれた部分が配列の箱一つに入ります。
変数の型はStringで、文字列を表すための型になります。


mainメソッドでは、while文を使ってscoreが0になるまでループを行っています。
呼び出されるメソッドはkeyInput()とthrowDices()です。
まずは、keyInputメソッドから説明します。

public static void keyInput() {
    try {
        int c = System.in.read();
    }
    catch( Exception e ) { }
}



ここでは、try{} catch{} の構文を使っています。

try {
    実行文;
}
catch(条件) {
    実行文;
}



まず、try の実行文には「何をしたときに」というのが入ります。 
今回は、System.in.read(); 「キーボードからの入力があった時に」という形になります。


System.in.read();は標準入力といい、System.out(標準出力)の反対です。
read()は何かを読み込むといった意味があります。


今回のプログラムでは、何か入力があるまで待機するといった処理を行います。
何か入力があれば次の処理に進みます。
一時停止みたいなものです。


catch( Exception e )のException eはエラーをを示します。
catch( Exception e )で、「もし入力にエラーが生じたら、実行文の内容を行いなさい」という意味になります。
今回は、実行文がありませんので実際にエラーがあっても何も起きません。

public static void throwDices() {

    int me1 = (int)(Math.random()*6.0);
    int me2 = (int)(Math.random()*6.0);
    showDices( me1, me2 );
    checkPoints( me1, me2 );
}



(int)(Math.random()*6.0)という記述で、0から5までの整数がランダムに出ます。
まず、Math.random()で0以上1未満の値がランダムに出ますので、それに6を乗じてint型でキャストするとこの値が得られます。
例えば、5.999をint型でキャストすると、5になります。


ここで得られた2つの変数は、showDices()とcheckPoints()の二つのメソッドに引数として渡されます。


showDices()は、渡された2つの数字をサイコロにして表示しています。


checkPoints()は与えられた数字に対して、配当を決めています。
今回のプログラムの勝敗は、偶数か奇数か、同じ目が出たかどうかしか判定していません。
自分で条件を変えて、いろいろ試してみて下さい。


条件によって変数scoreに数字が足し引きされています。
この数字は、このメソッドを抜けた後も継続されているのが解ると思います。
プログラムが終了するまで記憶し続けます。
このように、フィールドを使用すると便利です。


多分、持ち金が0になることはなかなか無いと思いますので、強制終了してプログラムを終了して下さい。
強制終了はCtr+Cでできます。


ゲームを実行してみましょう。





メモ帳を開いて次の2つのプログラムを作ってみましょう。


Input.java 直

public class Input {
	
	public static String readString( java.io.InputStream in ) {
		return readString( new java.io.InputStreamReader ( in ) );
	}
	public static String readString( java.io.InputStreamReader in ) {
		String str = null;
		try {
			java.io.BufferedReader bf
				= new java.io.BufferedReader( in );
			str = bf.readLine();
		}
		catch( Exception e ) {
			System.err.println( e );
		}
		return str;
	}
	public static int readInt( java.io.InputStream in ) {
		return readInt( new java.io.InputStreamReader( in ) );
	}
	public static int readInt( java.io.InputStreamReader in ) {
		int i = 0;
		try {
			String str = readString( in );
			i = Integer.parseInt( str );
		}
		catch( Exception e ) {
			System.err.println( e );
		}
		return i;
	}
}



InputTest.java 直

public class InputTest {
	public static void main( String[] args ) {

		System.out.print( "名前を入力してください:-> " );
		String name = Input.readString( System.in );
		System.out.println( name );

		System.out.print( "数字を入力してください:-> " );
		int i = Input.readInt( System.in );
		System.out.println( i );
	}
}



java.io.InputStream
java.io.InputStreamReader
java.io.BufferedReader


この3つはjavaのパッケージです。
javaにもともと内蔵されているプログラムだと思ってください。


文字と数字を入力するプログラムです。
Input.javaには、mainメソッドがありませんので、実行はできません。
コンパイルのみを行ってください。


InputTest.javaはInput.javaのメソッドを使用しています。
テスト実行するためのプログラムです。


今回のプログラムの実行はInputTest.javaのみ行います。


まず、2つのプログラムをコンパイルします。





次にInputTest.javaを実行します。


名前を入力してください:->と言われ、名前を入力してエンターを押すとそのまま名前が表示されます。
数字を入力してください:->と言われ、数字を入力するとそのまま数字が出力されます。
しかし、数字を入力してください:->と言われてTaroと文字列を入力するとエラーメッセージが出ます。
これが、try-catchの処理となります。
このようにエラーメッセージを出すには、cathの部分に標準エラー出力を記述します。

catch( Exception e ) {
    System.err.println( e );
}



出力結果を見てください。





メモ帳を開いて次のプログラムを作ってみましょう。


Saikoro2.java 直

public class Saikoro2 {
	public static int score = 100;
	public static int bet = 5;
	public static int round = 1;
                                                                                
        public static final int EVEN = 0;
        public static final int ODD = 1;
        public static int choice = EVEN;
                                                                                
        public static String[] diceStrings = {
                "| * |", "| : |", "|...|", "|: :|"," |:.:|"," |:::|" };
                                                                                
         public static void throwDices() {
                int me1 = (int)(Math.random()*6.0);
                int me2 = (int)(Math.random()*6.0);
                showDices( me1, me2 );
                checkPoints( me1, me2 );
        }
         public static void showDices( int a, int b ) {
                System.out.println("");
                System.out.println( diceStrings[a] + " " + diceStrings[b] );
                System.out.println( "" );
        }
        public static void checkPoints( int a, int b ) {
                int c = a + b + 2;
                int d = 0;
                if( c%2 == choice ) {
                        if( a == b || c == 7 )
                               d = bet*2;
                        else
                                d = bet;
                }
                else {
                        if( a == b || c == 7 )
                                d = -bet*2;
                        else
                                d = -bet;
                }
                score += d;
                String message1 = "あなたは ";
                if( d > 0 )
                        message1 += ( d + "$を手に入れました!" );
                else
                        message1 += ((-d) + "$ 負けました。" );
                String message2 = "あなたの持ち金は " + score + "$ です。";
                                                                                
                System.out.println( message1 );
                System.out.println( message2 );
}
        public static void keyInput() {
                try {
                        int c = System.in.read();
                }
                catch( Exception e ) {}
        }
        public static void choice() {
                                                                                
                System.out.println( "" );
                System.out.println( "偶数か奇数かを選んでエンターを押してください。" );
		System.out.println( "偶数ならEVEN 奇数ならODDと入力してください。" );
                System.out.print( "EVEN or ODD-> " );
                String str = Input.readString( System.in );
                if( str.startsWith( "e" ) || str.startsWith( "E" )) {
                        choice = EVEN;
                }
                else {
                        choice = ODD;
                }
        }
	public static void bet() {
		System.out.println( "" );
		System.out.println( "掛け金を入力してください。" );
		System.out.print( "-> " );
		bet = Input.readInt( System.in );
	}




         public static void main( String[] args ) {
               while( score > 0 ) {
                        System.out.println( "" );
                        System.out.println( "ラウンド:" + round );
                        choice();
			bet();
                        throwDices();
                        round++;
	        }
        	System.out.println( "あなたの持ち金は無くなりました。ゲームオーバーです。" );
	}
}



次の文を見てください。

public static final int EVEN = 0;
public static final int ODD = 1;



これには、今まで見たことのない記述があります。
finalです。


このfinalは変数ではなく、定数として値を扱うときに使用します。
型の前にfinalをつけます。
定数名は基本的に大文字で書きます。
変数と見分けがつきやすいように大文字で書いています。
小文字で書いてもエラーにはなりませんが、解りにくくなりますし、思わぬエラーを引き起こしますので、大文字で書くことをお勧めします。


次の文を見てください。

public static int choice = EVEN;



これは、その前に定数を宣言していますので、次のようにも書き変えることができます。

public static int choice = 0;



checkPoint()メソッドを見てみます。

int c = a + b + 2;



最後に2を足しているのは、次の条件に理由があります。

if( a == b || c == 7 )



このc == 7に当てはめる確率を上げています。
2を足さなければ、1と6の組み合わせしかありません。


次の記述を見てみます。

String message1 = "あなたは ";
if( d > 0 )
    message1 += ( d + "$を手に入れました!" );
else
    message1 += ((-d) + "$ 負けました。" );

System.out.println( message1 );



if文で条件分岐し、文字列をString型のmessage1に格納し最後にプリントしています。


次の記述です。

String str = Input.readString( System.in );



これは、先ほど作成したInput.javaのreadStringメソッドの使用方法です。
引数はSystem.inとして、入力された文字となっています。
ですので、Input.javaがコンパイルされていなければこのプログラムは動きません。

if( str.startsWith( "e" ) || str.startsWith( "E" )) {



これは、strの最初の文字がeかEならばという意味です。
startsWithもjavaのパッケージに含まれているものです。


出力結果を見てみましょう。






<<前  [TOP]  次>>