問題へのリンク
解答コード
詳細
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int N = scanner.nextInt();
StringBuilder sb = new StringBuilder();
Umpire umpire = new Umpire();
for (int i = 0; i < N; i++) {
final String S = scanner.next();
sb.append(umpire.call(S)).append("\n");
}
System.out.println(sb);
scanner.close();
}
private static class Umpire {
private int strike = 0;
private int ball = 0;
String call(String judge) {
if (judge.equals("strike")) {
return strike();
} else {
return ball();
}
}
private String strike() {
strike++;
if (strike == 3) {
reset();
return "out!";
} else {
return "strike!";
}
}
private String ball() {
ball++;
if (ball == 4) {
reset();
return "fourball!";
} else {
return "ball!";
}
}
private void reset() {
strike = 0;
ball = 0;
}
}
}
解説
詳細
審判を作ってしまうとデータ管理が楽です。
call⇒mainではこれしかしません。審判は投げられたボールに対して発声するだけです。
call内の動作
投げられたものが"strike"か"ball"かで動作が変わります。
"strike"⇒strike用発声をします。
"ball"⇒ball用発声をします。
strike時の動作
strikeカウントを増やして判定します
strike == 3 ⇒バッターアウトです。"out!"と発言してresetします
それ以外 ⇒ "strike!"と発言するだけです。
ball時の動作
ballカウントを増やして判定します
ball == 4 ⇒ファーボールです。"foueball!"と発言してresetします
それ以外 ⇒ "ball!"と発言するだけです。
reset時の動作
バッターが変わります。strike・ball両方0にします。
追記
記事が完成してから複数のバッターを考慮する必要がないことに気づきました。
reset部分全部いりませんね!