このページではJavaのサンプルプログラムをご紹介しよう。コンソールを使用してじゃんけんを行うゲームだ。
今回のサンプルプログラムでは、コンソールに文字を表示して対話形式でじゃんけんゲームを進めていく。じゃんけんゲームをするためには,いくつかのオブジェクトが登場する。これらのオブジェクト同士がお互いに情報交換しながらじゃんけんゲームがストーリーに従って動作するようになっている。
ストーリーのあらましは「審判の指示に従ってコンピュータと人間がじゃんけんで対戦し、それぞれが出した手の形を審判が判定する」と言うものだ。
実行結果から見てみよう。実際の画面はこうなる。審判が「じゃんけん」と合図する。そこでコンピュータに「ぐー」を表す「g」を入力する。そうすると判定結果が出てくるという流れである。
さっそく,実際のサンプルプログラムを見てみよう。
じゃんけんゲームのクラス
このサンプルプログラムは,コンソールからの文字入力と画面出力を使った対話型のちょっと複雑なゲームプログラムである。ゲーム中で登場するクラスとオブジェクトについて簡単に説明しておこう。
- ScissorsPaterStoneGameクラス:ゲームのストーリーを実行する。
- Shapeクラス:じゃんけんする二人の手の形を表す。
- Judgeクラス:審判を表す。
- Consoleクラス:画面の表示と入力を行うためのクラスである。また,タイマー機能も持っている。
サンプルプログラム
ScissorsPaterStoneGameクラス
このクラスは,ゲームに登場するオブジェクトをストーリーに従って呼び出し,じゃんけんゲームを実行する。
import java.util.Random;
public class ScissorsPaterStoneGame {
public static void main(String[] args) {//[1]
Shape shapeOfMyHand = new Shape();//[2]
Shape shapeOfYourHand = new Shape();//[3]
Judge judge = new Judge(shapeOfYourHand, shapeOfMyHand);//[4]
Random random = new Random();//[5]
judge.displayIntroduction();//[6]
while (true) {//[7]
int inputCharacter = Console.read();//[8]
shapeOfYourHand.convertKeyToShape(inputCharacter);//[9]
if (shapeOfYourHand.hand() == Shape.CANNOT_CONVERT)//[10]
return;//[11]
judge.sayCueWord();//[12]
shapeOfMyHand.randomizeShape(random);//[13]
judge.judge();//[14]
judge.sayResult();//[15]
Console.sleep(2);//[16]
}
}
}
説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] mainメソッドの定義,ここからゲームが始まる。
- [2]-[5] ゲームの中に登場するオブジェクトと作る。作られたオブジェクトは,shapeOfMyHand:コンピュータ側の手の形,shapeOfmyHand:入力された手の形,judge:審判,random:乱数である。
- [6] ゲームの説明を表示する。
- [7] ループの始まり。
- [8] コンソールから文字を入力する。
- [9] 入力文字をshapeOfYourHandオブジェクトの手の形に変換する。
- [10]-[11] 手の形が「ぐう」,「ちょき」,「ぱー」以外の文字が入力されたら終了する。
- [12] 審判がじゃんけんの開始の合図をする。
- [13] 乱数からコンピュータ側の手の形を決める。
- [14] 審判が判定を行う。
- [15] 審判が判定結果を発表する。
- [16] 2秒休み,ループの先頭に戻る。
Shapeクラス
このクラスは,ゲームを行う人の手を表している。文字入力と乱数の入力に対応して「ぐう」,「ちょき」,「ぱー」の手の形に変換し,その形を保持する。このクラスから対戦する人の手の形のオブジェクトが作られる。
import java.util.Random;
public class Shape {//[1]
public static final int GU = 1;//[2]
public static final int CYOKI = 2;//[3]
public static final int PA = 3;//[4]
public static final int CANNOT_CONVERT = -1;//[5]
private final int KEY_G = 103;//[6]
private final int KEY_C = 99;//[8]
private final int KEY_P = 112;//[9]
private int hand;//[10]
public void randomizeShape(Random random) {//[20]
this.hand = random.nextInt(3) + 1;//[21]
}
public void convertKeyToShape(int inputKeyCode) {//[40]
int keyCode = toLowerKey(inputKeyCode);//[41]
switch (keyCode) {//[42]
case KEY_G://[43]
this.hand = GU;//[44]
return;//[45]
case KEY_C://[46]
this.hand = CYOKI;//[47]
return;//[48]
case KEY_P://[49]
this.hand = PA;//[50]
return;//[51]
default://[52]
this.hand = CANNOT_CONVERT;//[53]
return;//[54]
}
}
private int toLowerKey(int keyCode) {//[60]
if (keyCode < KEY_C) {//[61]
return keyCode + 32;//[62]
}
return keyCode;//[63]
}
public String toString() {//80]
switch (hand) {//[81]
case GU://[82]
return "ぐう";//[83]
case CYOKI://[84]
return "ちょき";//[85]
case PA://86]
return "ぱあ";//87]
default://[88]
return "?";//89]
}
}
public int hand() {//[100]
return hand;//[101]
}
}
説明
- [1] クラスを定義する。
- [2]-[10] 変数を定義する。
- [20] メソッドrandomizeShapeを定義する。
- [21] 乱数を発生させて手の形を決め,handに代入する。
- [40] メソッドconvertKeyToShapeを定義する。
- [41] メソッドtoLowerKeywによって,キーの値を小文字に変換する。
- [42]-[54] キーの値に対応する手の形をhandに代入する。
- [60] メソッドtoLowerKeyを定義する。
- [61]-[63] キーの値を小文字に変換する。
- [80] メソッドconvertKeyToShapeを定義する。
- [81]-[89] 手の形を文字列に変換して戻す。
- [100] メソッドhandを定義する。
- [101] handの値を戻す。
Judgeクラス
このクラスは,審判を表している。この審判を表すオブジェクトは,ゲームの進行に伴って指示を行い,判定を下す。
public class Judge {//[1]
private enum Result {//[2]
RESULT_WIN,//[3]
RESULT_FALSE,//[4]
RESULT_EVEN//[5]
}
private Shape myShape;//[6]
private Shape yourShape;//[7]
private Result result;//[8]
public Judge (Shape yourShape, Shape myShape) {//[9]
this.yourShape = yourShape;//[10]
this.myShape = myShape;//[11]
this.result = Result.RESULT_FALSE;//[12]
}
public void displayIntroduction() {//[20]
Console.writeWithCR("じゃんけんを始めます。");//[21]
Console.writeWithCR("G:ぐー,C:ちょき,P:ぱあ,それ以外:終わり");//[22]
Console.writeWithCR("G/C/Pのどれかを選んで改行キーを押すと,じゃんけんが始まります。");//[23]
Console.writeWithCR("じゃんけん");//[24]
}
public void sayCueWord() {//[40]
switch (result) {//[41]
case RESULT_WIN://[42]
case RESULT_FALSE://[43]
Console.write("ぽん!");//[44]
break;//[45]
case RESULT_EVEN://[46]
Console.write("しょ");//[47]
break;//[48]
}
}
public void sayResult() {//[60]
Console.write(" → ");//[61]
Console.sleep(2);//[62]
Console.write("あなたは" + yourShape.toString() + " → ");//[63]
Console.sleep(1);//[64]
Console.writeWithCR("わたしは" + myShape.toString());//[65]
switch (result) {//[66]
case RESULT_WIN://[67]
Console.writeWithCR("あなたの勝ち!");//[68]
Console.writeWithCR("じゃんけん");//[69]
break;//[70]
case RESULT_FALSE://[71]
Console.writeWithCR("あなたの負け!");//[72]
Console.writeWithCR("じゃんけん");//[73]
break;//[74]
case RESULT_EVEN://[75]
Console.writeWithCR("あいこで,");//[76]
break;//[77]
}
}
public void judge() {//[80]
this.result = judgeByRule();//[81]
}
private Result judgeByRule() {//[82]
if (yourShape.hand() == myShape.hand())//[83]
return Result.RESULT_EVEN;//[84]
switch (yourShape.hand()) {//[85]
case Shape.GU://[86]
if (myShape.hand() == Shape.CYOKI)//[87]
return Result.RESULT_WIN;//[88]
break;//[89]
case Shape.CYOKI://[90]
if (myShape.hand() == Shape.PA)//[91]
return Result.RESULT_WIN;//[92]
break;//[93]
case Shape.PA://[94]
if (myShape.hand() == Shape.GU)//[95]
return Result.RESULT_WIN;//[96]
break;//[97]
default://[98]
break;//[99]
}
return Result.RESULT_FALSE;//[100]
}
}
説明
- [1] クラスを定義する。
- [2]-[5] enumにより判定結果を定義する。
- [6]-[8] 変数を定義する。
- [9]-[12] コンストラクタにより初期値を設定する。
- [20] メソッドdisplayIntroductionを定義する。
- [21]-[24] ゲームの紹介と入力方法について説明を行う。
- [40] メソッドsayCueWordを定義する。
- [41]-[48] 前の判定結果によって合図の言葉を変える。
- [60] メソッドsayResultを定義する。
- [61]-[65] あなたの手の形,コンピュータの手の形の順にタイマーを入れて表示する。
- [66]-[77] 勝敗の結果を表示する。
- [80] メソッドjudgeを定義する。
- [81]-[100] 邪険のルールに従って判定を行う。
Consoleクラス
このクラスは,コンソールを表している。このコンソールを表すオブジェクトは,コンソールの文字の入出力とタイマー機能を持つ。
import java.io.IOException;
public class Console {//[1]
public static int read() {//[2]
int inputKeyCode = 0;//[3]
try {//[4]
inputKeyCode = System.in.read();//[5]
System.in.skip(256);//[6]
} catch (IOException ioException) {//[7]
System.out.println("ioException例外");//[8]
}//[9]
return inputKeyCode;//[10]
}
public static void write(String text) {//[20]
System.out.print(text);//[21]
}
public static void writeWithCR(String text) {//[40]
System.out.println(text);//[41]
}
public static void sleep(int seconds) {//[60]
try {//[61]
Thread.sleep(seconds * 1000);//[62]
} catch (InterruptedException exception) {//[63]
System.out.println("InterruptedException例外");//[64]
}
}
}
説明
- [1] クラスを定義する。
- [2] メソッドreadを定義する。
- [3]-[10] 入力されたキーのコードを取得する。
- [20] メソッドwriteを定義する。
- [21] コンソールに引数で指定された文字列を表示する。
- [40] メソッドwriteWithCRを定義する。
- [41] コンソールに引数で指定された文字列を表示し,改行する。
- [60] メソッドsleepを定義する。
- [61]-[64] 引数に指定された秒数だけ休止する。
まとめ
このページでは複数のクラスを利用したJavaゲームのサンプルプログラムをご紹介した。各クラスの説明を参考にしてルールを本来のじゃんけんではない物に自由に変えたり、メッセージを変更したりと改造してみよう。





コメント