以下の実行例となるような暗算ゲームを作成せよ。
問題は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);
}
}

コメント