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

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Java | 15 | サイコロゲーム

↓↓クリックして頂けると励みになります。



14 | クラスメソッド】 << 【ホーム】 >> 【16 | グラフ表示


簡単なゲームを作成
簡単なゲームを作成



今までに学習した内容を利用してサイコロを使った簡単なゲームを作成します。



Visual Studio Codeで以下のJavaプログラム「Saikoro.java」を作成して下さい。


新規作成 【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でできます。


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

~/Desktop/Programming/JP $ javac Saikoro.java

~/Desktop/Programming/JP $ java Saikoro

エンターキーを押してください。


ラウンド:1

|: :|  |:::|

あなたは 5$ 勝ちました。
あなたの持ち金は105$ です。

エンターキーを押してください。


ラウンド:2

 |:::| | : |

あなたは 5$ 勝ちました。
あなたの持ち金は110$ です。

エンターキーを押してください。


ラウンド:3

|...| |...|

あなたは 10$ 勝ちました。
あなたの持ち金は120$ です。

エンターキーを押してください。


ラウンド:4

 |:::| | : |

あなたは 5$ 勝ちました。
あなたの持ち金は125$ です。

エンターキーを押してください。

・・・
・・・

ラウンド:106

 |:::| | * |

あなたは 10$ 負けました。
あなたの持ち金は5$ です。

エンターキーを押してください。


ラウンド:107

|...| | : |

あなたは 5$ 負けました。
あなたの持ち金は0$ です。
あなたのお金はなくなりました。ゲームオーバーです。



Visual Studio Codeで、以下の2つのJavaプログラムを作成します。
作成するファイルは「Input.java」と「InputTest.java」の2つです。


新規作成1 【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;
	}
}



新規作成2 【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プログラムは以下の3つのパッケージを利用しています。

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



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


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


「InputTest.java」はmainメソッドがあり、そこで「Input.java」のメソッドを呼び出しています。
ですので、プログラムの実行は「InputTest.java」のみ行います。


作成した2つのプログラムの動作を確認するには、まず2つのファイルをコンパイルし、その後「InputTest.java」のみを実行します。


Javaプログラムを実行すると、以下のような動作になります。


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

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



出力結果を確認して下さい。

~/Desktop/Programming/JP $ javac Input.java
~/Desktop/Programming/JP $ javac InputTest.java

~/Desktop/Programming/JP $ java InputTest     
名前を入力してください:-> taro
taro
数字を入力してください:-> taro
java.lang.NumberFormatException: For input string: "taro"
0

~/Desktop/Programming/JP $ java InputTest
名前を入力してください:-> taro
taro
数字を入力してください:-> 2
2



定数finalを利用したサイコロゲームを作成します。
Visual Studio Codeで以下の「Saikoro2.java」ファイルを作成して下さい。


新規作成 【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のパッケージに含まれているものです。


Javaプログラムをコンパイルして実行結果を確認します。

~/Desktop/Programming/JP $ javac Saikoro2.java
 
~/Desktop/Programming/JP $ java Saikoro2     

ラウンド:1

偶数か奇数かを選んでエンターを押してください。
偶数ならEVEN 奇数ならODDと入力してください。
EVEN or ODD-> 1

掛け金を入力してください。
-> 2

 |:.:|  |:.:|

あなたは 4$ 負けました。
あなたの持ち金は 96$ です。

ラウンド:2

偶数か奇数かを選んでエンターを押してください。
偶数ならEVEN 奇数ならODDと入力してください。
EVEN or ODD-> EEEE

掛け金を入力してください。
-> 2

|...|  |:::|

あなたは 2$ 負けました。
あなたの持ち金は 94$ です。

ラウンド:3

偶数か奇数かを選んでエンターを押してください。
偶数ならEVEN 奇数ならODDと入力してください。
EVEN or ODD-> ODD     

掛け金を入力してください。
-> 101

| : | |...|

あなたは 101$を手に入れました!
あなたの持ち金は 195$ です。

ラウンド:4

偶数か奇数かを選んでエンターを押してください。
偶数ならEVEN 奇数ならODDと入力してください。
EVEN or ODD-> ODD     

掛け金を入力してください。
-> 1000

 |:::|  |:.:|

あなたは 1000$を手に入れました!
あなたの持ち金は 1195$ です。

ラウンド:5

偶数か奇数かを選んでエンターを押してください。
偶数ならEVEN 奇数ならODDと入力してください。
EVEN or ODD-> ODD

掛け金を入力してください。
-> 100000

|: :| |: :|

あなたは 200000$ 負けました。
あなたの持ち金は -198805$ です。
あなたの持ち金は無くなりました。ゲームオーバーです。



14 | クラスメソッド】 << 【ホーム】 >> 【16 | グラフ表示





↓↓クリックして頂けると励みになります。