【Java】ループ処理と乱数で年齢推測ツールを実装する

■実装の概要

ループ処理と乱数を使用して、任意の年齢をコンソール上に出力し、ユーザに実年齢より高いか、低いか、同じかを入力してもらう。
ユーザの入力値に応じて、コンソール上に出力する年齢の範囲を狭めていき、最終的に実年齢と同じになるまで処理を繰り返す。

■制約事項・前提条件

  • 推測する年齢は、0才〜122才までとする。
  • 自分の年齢が表示した年齢より低い場合は、「0」を入力する。
  • 自分の年齢が表示した年齢と同じ場合は、「1」を入力する。
  • 自分の年齢が表示した年齢より高い場合は、「2」を入力する。
  • 「0〜2」以外を入力した場合は、警告を表示し、処理を繰り返す。
  • ユーザの誤入力(*)は、例外処理のみ実装する。

(*)誤入力:「0〜2」について入力を誤ったもの。
例:自分の年齢が表示した年齢より低いにも関わらず、「2」を入力した場合など。

■実装イメージ

以下に30才を想定した年齢推測ツールの実装イメージを示す。

・0〜122才の配列から任意の値を出力

58才は30才よりも高いので「2」を入力する。


・配列をリサイズし、0〜57才の配列から任意の値を出力

15才は30才よりも低いので「0」を入力する。


・配列をリサイズし、16〜57才の配列から任意の値を出力

30才は正解なので「1」を入力し、処理を終了する。

■サンプルコード

package main;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class GuessAgeMain {
	
	//  初期最高齢を設定
	private static final int MAX_AGE = 122;
	
	// メイン処理
	public static void main(String[] args) {
		
		// 初期値セット
		int chk_age_index = 0;
		int chk_num = 0;
		
		// 年齢配列の初期をセット
		int[] age_array = new int[MAX_AGE + 1];
		for(int i = 0; i < MAX_AGE + 1; i++ ) {
			age_array[i] = i;
		}
		
		// フラグの初期値セット
		boolean is_guess_age = false;
		
		// ランダムとスキャナーのインスタンス
		Random rand = new Random();
		Scanner scan = new Scanner(System.in);
		
		try {
			// 年齢正解するまで繰り返し
			while(!is_guess_age) {
				// ランダムなインデックス番号を取得...(1)
				chk_age_index = rand.nextInt(age_array.length);
				
				// 年齢を出力し、ユーザに年齢が合っているか入力してもらう
				System.out.print("あなたの年齢は「" + age_array[chk_age_index] + "」才ですか?:");
				chk_num = scan.nextInt();
				
				// 入力値判定
				switch(chk_num) {
					// 0:年齢が低い場合
					case 0:
						// 配列を編成しなおす「インデックス:(1)から最大未満」
						age_array = Arrays.copyOfRange(age_array, chk_age_index + 1, age_array.length);
						break;

					// 1:正解の場合
					case 1:
						System.out.println("あなたの年齢は「" + age_array[chk_age_index] + "」才です");
						// フラグ変更してループを抜ける
						is_guess_age = true;
						break;

						// 年齢が高い場合
					case 2:
						// 配列を編成しなおす「インデックス:0から(1)未満まで」
						age_array = Arrays.copyOfRange(age_array, 0, chk_age_index);
						break;
					
					//  0から2以外を入力した場合
					default:
						System.out.println("0〜2を入力してください");
						break;
				}
			}

		// 例外処理
		}catch(Exception e) {
			System.out.println("例外エラー:" + e);

			// 終了処理
		}finally {
			// スキャナーをクローズ
			scan.close();
		}
	}
}

■実行結果

実年齢を30才として実行した場合のコンソール出力例を以下に示す。

あなたの年齢は「120」才ですか?:2
あなたの年齢は「85」才ですか?:2
あなたの年齢は「58」才ですか?:2
あなたの年齢は「15」才ですか?:0
あなたの年齢は「27」才ですか?:0
あなたの年齢は「31」才ですか?:2
あなたの年齢は「30」才ですか?:1
あなたの年齢は「30」才です
タイトルとURLをコピーしました