40448


Hit&Blow（数あてゲーム）を作成しました。  
ランダムに生成される4桁の数字を当てるゲームで、  
位置と数字が一致していればHit、数字のみが一致している場合はBlowで表示されます。

大まかなコーディングは（一応）できたので、改良を加えたいと思っております。

  * 改良1：数字を入力した回数をカウントし、正解時に入力回数を出力したい。
  * 改良2：入力回数を15回までに制限したい。

メソッドで細かくコーディングしたためか、改良がしづらくなってしまいました。。  
mainメソッドで結果を出力しつつカウントする方法がベストでしょうか？  
ご意見や解決法などどなたかお力をお貸しいただければ幸いです。

[code]

    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;
        }
    }
    
[/code]


CC BY-SA 3.0
2017-12-21T08:40:06.890
40443
2017-12-21T12:25:56.497
26629
question
java
入力した回数をカウントし、正解時に出力したい


> 改良1：数字を入力した回数をカウントし、正解時に入力回数を出力したい。

入力した回数を数える変数を用意し、whileループを回す度に+1でインクリメントしていく。  
正解時に答えと一緒に出力すればよいでしょう。

> 改良2：入力回数を15回までに制限したい。

whileループをforループにし、指定回数（15回）だけ繰り返すように変更。ループを抜けた場合には  
「残念ながら正解できませんでした」などの出力を付け足してもよいかもしれません。


CC BY-SA 3.0
2017-12-21T12:25:56.497
40448
2017-12-21T12:25:56.497
3060
40443
answer