2023.05.23
ミニゲーム
「じゃんけん」の作成 その2
ここで作成する「じゃんけん」は、グー/チョキ/パーと終了の4種類をキーボードで選択し、終了が選択されるまで「じゃんけん」を続けるものです。
1回の「じゃんけん」で終了するプログラムの作り方は、以下の記事を参考にしてください。
プログラムの作成手順
①グー、チョキ、パーを0~2の整数で定義します。
②終了を3で定義します。
④キーボードで自分の手、または終了を入力します。0~3の整数を入力。
⑤終了が選択された場合、プログラムを終了します。グー、チョキ、パーが選択された場合⑥に進みます。
⑥勝敗を判定します。
⑦結果を出力します。
⑧③に戻ります。
Javaのソースコード
Janken2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086
import java.util.Scanner; public class Janken2 { private static final int GUU = 0; // グー private static final int CHOKI = 1; // チョキ private static final int PAA = 2; // パー private static final int QUIT = 3; // 終了 // 勝敗の判定 // 自分が勝った場合、 1を戻す // 自分が負けた場合、-1を戻す // あいこの場合、 0を戻す private static int judge( int jibun, int aite ) { // あいこの判定 if ( jibun == aite ) return 0; // 勝ちの判定 if ( ( GUU == jibun ) && ( CHOKI == aite ) ) return 1; if ( ( CHOKI == jibun ) && ( PAA == aite ) ) return 1; if ( ( PAA == jibun ) && ( GUU == aite ) ) return 1; // 自分の負け return -1; } // 数値をじゃんけんの手の文字に変換 private static String getTeString( int te ) { if ( 0 == te ) return "グー"; if ( 1 == te ) return "チョキ"; if ( 2 == te ) return "パー"; return ";" } // メイン public static void main( String[] args ) { // 無限ループを作成 for ( ; ; ) { // 相手の手を決める // 0~2の乱数をaiteに代入 int aite = (int)( Math.random() * 3.0 ); // メッセージを表示 System.out.print( "じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → " ); // Scannerを作成 Scanner scan = new Scanner( System.in ); // 自分の手または終了をキーボード入力する int jibun = scan.nextInt(); if ( ( 0 > jibun ) || ( 3 < jibun ) ) { System.out.println( "0~3の数字を入力してください。" ); return; } // 終了を選択した場合、無限ループを抜ける if ( QUIT == jibun ) break; // 相手の手を出力 System.out.println( "相手の手は、" + getTeString( aite ) ); // 自分の手を出力 System.out.println( "自分の手は、" + getTeString( jibun ) ); // 勝敗の判定 int result = judge( jibun, aite ); switch ( result ) { case 0: System.out.println( "あいこです。" ); break; case 1: System.out.println( "あなたの勝ちです。" ); break; case -1: System.out.println( "あなたの負けです。" ); break; } // 改行 System.out.println(); } } }
実行結果
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Janken2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Janken2.java
実行
C:\talavax\javasample>java Janken2
実行結果
じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → 0 相手の手は、チョキ 自分の手は、グー あなたの勝ちです。 じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → 1 相手の手は、チョキ 自分の手は、チョキ あいこです。 じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → 2 相手の手は、グー 自分の手は、パー あなたの勝ちです。 じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → 3
キーボードで3が選択されるとプログラムを終了します。
Javaソースコードの解説
ここから、ソースコードを詳しく解説していきます。
001
import java.util.Scanner;
003
public class Janken2 {
クラス名を、Janken2としています。
004 005 006 007
private static final int GUU = 0; // グー private static final int CHOKI = 1; // チョキ private static final int PAA = 2; // パー private static final int QUIT = 3; // 終了
009 010 011 012 013 014
// 勝敗の判定 // 自分が勝った場合、 1を戻す // 自分が負けた場合、-1を戻す // あいこの場合、 0を戻す private static int judge( int jibun, int aite ) {
015 016
// あいこの判定
if ( jibun == aite ) return 0;
自分の手jibunと相手の手aiteが同じ場合、return文で0を戻しています。この0は、あいこ(引き分け)を表しています。
018 019 020 021
// 勝ちの判定
if ( ( GUU == jibun ) && ( CHOKI == aite ) ) return 1;
if ( ( CHOKI == jibun ) && ( PAA == aite ) ) return 1;
if ( ( PAA == jibun ) && ( GUU == aite ) ) return 1;
自分の手jibunが勝つ場合の条件を記述してます。
19行目のif文で、自分の手jibunがグーで相手の手aiteがチョキの場合、return文で1を戻しています。
023 024
// 自分の負け return -1;
ここに到達した場合、return文で-1を戻しています。-1を自分の負けを表しています。
027 028 029 030 031 032 033 034
// 数値をじゃんけんの手の文字に変換 private static String getTeString( int te ) { if ( 0 == te ) return "グー"; if ( 1 == te ) return "チョキ"; if ( 2 == te ) return "パー"; return ";" }
数で表しているじゃんけんの手を文字列に変換するメソッドgetTeStringです。
じゃんけんの手を表すint型の変数teを引数とし、その引数に対応する文字列を戻しています。
0はグー、1はチョキ、2はパーです。それ以外の数の場合、空文字を戻しています。
037 038
// メイン public static void main( String[] args )
このmainメソッドからプログラムを実行します。
040 041
// 無限ループを作成 for ( ; ; ) {
042 043 044
// 相手の手を決める // 0~2の乱数をaiteに代入 int aite = (int)( Math.random() * 3.0 );
0~2の整数の乱数を発生し、int型の変数aiteに代入しています。
Math.randomメソッドは0.0以上で1.0未満の乱数を発生するので3.0を掛けることで、0.0以上で3.0未満の乱数を発生することができます。
Math.randomメソッド
public static double Math.random()
・乱数を返します。 パラメータ なし 戻り値 0.0以上、1.0未満の乱数
046 047
// メッセージを表示 System.out.print( "じゃんけんポン 0:グー 1:チョキ 2:パー 3:終了 → " );
print文で、自分の手と終了をキーボードから入力する値を表示しています。print文を使っているので改行されずに、キーボード入力した値は、このメッセージの右側に表示されます。println文を使うとキーボード入力した値は下に表示されます。
049 050
// Scannerを作成
Scanner scan = new Scanner( System.in );
標準入力System.inを使って、Scannerクラスのscanを初期化しています。
052 053
// 自分の手または終了をキーボード入力する int jibun = scan.nextInt();
nextIntメソッドで、キーボードから入力された1行を読み取り、その値をint型の変数jibunに代入しています。
054 055 056 057
if ( ( 0 > jibun ) || ( 3 < jibun ) ) { System.out.println( "0~3の数字を入力してください。" ); return; }
059 060
// 終了を選択した場合、無限ループを抜ける
if ( QUIT == jibun ) break;
062 063
// 相手の手を出力 System.out.println( "相手の手は、" + getTeString( aite ) );
065 066
// 自分の手を出力 System.out.println( "自分の手は、" + getTeString( jibun ) );
068 069
// 勝敗の判定 int result = judge( jibun, aite );
070 071 072 073 074 075 076 077 078 079 080
switch ( result ) { case 0: System.out.println( "あいこです。" ); break; case 1: System.out.println( "あなたの勝ちです。" ); break; case -1: System.out.println( "あなたの負けです。" ); break; }
以上です。