入力した回数をカウントし、正解時に出力したい
Hit&Blow(数あてゲーム)を作成しました。
ランダムに生成される4桁の数字を当てるゲームで、
位置と数字が一致していればHit、数字のみが一致している場合はBlowで表示されます。
大まかなコーディングは(一応)できたので、改良を加えたいと思っております。
- 改良1:数字を入力した回数をカウントし、正解時に入力回数を出力したい。
- 改良2:入力回数を15回までに制限したい。
メソッドで細かくコーディングしたためか、改良がしづらくなってしまいました。。
mainメソッドで結果を出力しつつカウントする方法がベストでしょうか?
ご意見や解決法などどなたかお力をお貸しいただければ幸いです。
package game;
import java.io.*;
import java.util.HashSet;
import java.util.InputMismatchException;
public class HighandBlow {
public static void main(String[] args) {
String answerLine = randomNum();
while (true) {
String line = inputNum();
if (line.equals("")) {
continue;
}
if (checkAnswer(line, answerLine)) {
break;
}
}
}
public static String randomNum() {
int[] numArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < 5; i++) {
int a = (int) (Math.random() * 10);
int b = (int) (Math.random() * 10);
int temp = numArray[a];
numArray[a] = numArray[b];
numArray[b] = temp;
}
StringBuffer stringBuffer = new StringBuffer(4);
for (int i = 0; i < 4; i++) {
stringBuffer.append(String.valueOf(numArray[i]));
}
return stringBuffer.toString();
}
public static String inputNum() {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = "";
try {
line = br.readLine();
if (line.length() > 4) {
System.out.println("桁が多すぎます");
throw new InputMismatchException();
}
Integer.parseInt(line);
line = line.replace("+", " ");
line = line.replace("-", " ");
if (line.length() != 4) {
System.out.println("桁が足りません");
throw new InputMismatchException();
}
if (numFormat(line) != true) {
System.out.println("同じ数字が使われています");
throw new InputMismatchException();
}
} catch (NumberFormatException e) {
System.out.println("数字以外の文字が入力されています");
return "";
} catch (InputMismatchException e) {
return "";
} catch (IOException e) {
return "";
}
return line;
}
public static boolean numFormat(String s) {
HashSet<String> set = new HashSet<String>();
for (int i = 0; i < s.length(); i++) {
set.add(String.valueOf(s.charAt(i)));
}
return set.size() == 4;
}
public static boolean checkAnswer(String inputStr, String randomStr) {
int hit = 0;
int blow = 0;
for (int i = 0; i < 4; i++) {
if (inputStr.charAt(i) == randomStr.charAt(i)) {
hit++;
}
if (randomStr.indexOf(inputStr.charAt(i)) != -1) {
blow++;
}
}
boolean ret = false;
if (hit == 4) {
System.out.println("正解!");
ret = true;
} else {
System.out.println(hit + "hit " + (blow - hit) + "Blow");
}
return ret;
}
}