↓↓クリックして頂けると励みになります。
【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 | グラフ表示】
↓↓クリックして頂けると励みになります。