<<前 [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のパッケージに含まれているものです。
出力結果を見てみましょう。
↓↓クリックして頂けると励みになります。