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