以下の実行例となるような暗算ゲームを作成せよ。
問題は1から30までの値2つをランダムに生成しその2値の掛け算とする。
Xの場所は、最初の値、2つ目の値、答えのいずれか場所を1つランダムに選択すること。
また10問解くのにかかった時間も計測すること。
[実行例]
***暗算ゲーム***
Xには何が入るかな?全部で10問でるよ!
X*6=150
X>25 [enter]
正解!(1/1)
X*14=28
X>2 [enter]
正解!(2/2)
7*11=X
X>77 [enter]
不正解(3/3)
23*X=115
X>4 [enter]
不正解(3/4)
〜略〜
X*27=243
X>9 [enter]
正解!(8/10)
8問正解でした。(かかった時間:3分13秒)。
もう一度やりますかy…yes,n…no>y [enter]
23*27=X
X>611 [enter]
不正解(0/1)
〜略〜
X*20=280
X>14 [enter]
正解!(7/10)
7問正解でした。(かかった時間:2分54秒)。
もう一度やりますかy…yes,n…no>n [enter]
アプリを終了します。

[解答例]

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

public class MathQ {

	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		Random rand=new Random();
		final int MIN=1,MAX=30;
		final int Q_MAX=10;
		System.out.println("***暗算ゲーム***");
		System.out.println("Xには何が入るかな?全部で10問でるよ!");
		String cont;
		do{
			int qCount=0;
			int correctAnsCount=0;
			long start=System.currentTimeMillis();
			while(qCount<Q_MAX){
				qCount++;
				int first=rand.nextInt(MAX)+MIN;
				int second=rand.nextInt(MAX)+MIN;
				int result=first*second;
				int xPos=rand.nextInt(3);
				switch(xPos){
				case 0:
					System.out.println("X*"+second+"="+result);
					break;
				case 1:
					System.out.println(first+"*X="+result);
					break;
				case 2:
					System.out.println(first+"*"+second+"=X");
					break;
				}
				System.out.print("X>");
				int userAns=scan.nextInt();
				boolean isCorrect=(xPos==0 && userAns==first || xPos==1 && userAns==second || xPos==2 && userAns==result);
				if(isCorrect){
					correctAnsCount++;
				}
				System.out.printf("%s(%d/%d)%n", isCorrect ? "正解!":"不正解",correctAnsCount,qCount);
			}
			long end=System.currentTimeMillis();
			long diff=end-start;
			String time=millitimeToStr(diff);
			System.out.printf("%d問正解でした。(かかった時間:%s)。%nもう一度やりますかy...yes,n...no>", correctAnsCount,time);
			cont=scan.next();
		}while(cont.equals("y"));
		System.out.println("アプリを終了します。");
		scan.close();
	}
	/**
	 * ミリ秒を引数として受けとり、それを「◯分◯秒」形式の文字列として返却するメソッド
	 * @param millitime
	 * @return ◯分◯秒といった形式の文字列を返却
	 */
	public static String millitimeToStr(long millitime){
		long min=millitime / (60*1000);
		long sec=(millitime % (60*1000)) / 1000;
		return String.format("%d分%d秒", min,sec);
	}
}