diff --git a/README.md b/README.md index d5b0084..b50e60a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,88 @@ # 미션 - 숫자 야구 게임 +## 📄 구현 기능 목록 + +### 게임 관리자 + +- 게임의 전체적 순서를 보장한다. +- 게임의 종료 여부를 결정한다. +- 한 게임 내에서 전역적으로 유지 되어야 할 상태를 유지시킨다. + - 숫자 생성기에 의해 생성된 숫자 + +### 숫자 생성기 + +- 임의의 3자리 숫자를 생성한다. + - 각 자리의 숫자는 1-9사이의 숫자이다. + - 각 자리의 숫자는 서로 다르다. + +- 생성된 숫자는 한 게임 동안 유지될 수 있도록 한다. + +### 게임 내 사용자 입력기 + +- 게임 내에서 진행되는 숫자를 입력받는 입력기이다. +- 표준 입력으로부터 사용자 입력을 받는다. + + - 사용자 입력은 3자리 수이어야만 한다. + - [Option] 3자리 이상일 경우 + - 오류를 출력하고 입력을 다시 받는다. + - 혹은, 앞의 3자리만 잘라서 받는다. + - 3자리 미만일 경우 + - 오류를 출력하고 입력을 다시 받는다. + - 숫자가 아닐 경우 + - 오류를 출력하고 입력을 다시 받는다. + - [Option] 한 자리의 숫자가 다른 자리의 것과 같은 숫자인 경우 + - ex) 777, 121, 334, 515 + - 오류를 출력하고 입력을 다시 받는다. + - 혹은, 정상적으로 게임을 진행한다. + - [Option] 생성 숫자가 751이고, 사용자 입력 숫자가 777인 경우 + - 1스트라이크 2볼을 출력한다. + - 혹은, 1스트라이크를 출력한다. + + - 잘못된 입력으로 인한 예외는 IllegalArgumentException을 발생시킨다. + - 입력된 숫자는 비교 결과가 생성되어 출력될 때까지 유지한다. + +### 게임 외 사용자 입력기 + +- 게임 종료후 새로운 게임을 시작하는 이벤트를 발생시키거나 프로그램을 종료시킬 수 있는 이벤트를 발생시킬 수 있는 입력기이다. + - 입력으로 "yes"를 받을 경우 출력기에게 다시시작 메시지를 전달한다. + - 입력으로 "no"를 받을 경우 출력기에게 종료 메시지를 전달한다. + - 둘 중 어느 것에도 포함되지 않는 입력을 받을 경우 에러 메시지를 전달한다. + +### 결과 출력기 + +- 비교기로부터 넘겨받은 비교 결과를 출력한다. + - 스트라이크 카운트에 "스트라이크" 문자열을 이어 출력한다. + - 볼 카운트에 "볼" 문자열을 이어 출력한다. + - 스트라이크 카운트 혹은 볼 카운트가 0일 경우 출력하지 않는다. + - ex) 스트라이크 카운트가 0이고, 볼 카운트가 1일 경우, "1볼"만 출력한다. + - 스트라이크 카운트가 0이고, 볼 카운트가 0일 경우 "낫싱"을 출력한다. + +- 3스트라이크일 경우 게임 외 출력기에게 메시지를 출력하도록 이벤트를 발생시킨다. + +### 게임 외 출력기 + +- 게임을 종료하는 메시지를 출력한다. + - 다른 게임 시작 의사 여부를 묻는 메시지를 출력한다. + - ex) "다시 시작하시겠습니까? (yes/no)" + +- 게임 외 사용자 입력기에게 입력을 받도록 이벤트를 발생시킨다. +- 게임 외 사용자 입력기로부터 메시지를 전달받으면 적절한 메시지를 출력하고 처리를 진행한다. + - 다시시작 메시지라면 "게임을 다시시작합니다."를 출력하고 게임 관리자에게 다시시작하는 메시지를 전달한다. + - 종료 메시지라면 "종료합니다."를 출력하고 게임 관리자에게 종료하는 메시지를 전달한다. + - 에러 메시지라면 "다시 시작하시겠습니까? (yes/no)"를 다시 출력하고 반복한다. + + + +### 입력 비교기 + +- 생성기로부터 유지된 생성값을 사용자 입력과 비교한다. + - 같은 자리에 같은 숫자가 있는 경우 스트라이크 카운트를 증가시킨다. + - 다른 자리에 생성된 숫자가 포함하는 숫자를 가지고 있는 경우 볼 카운트를 증가시킨다. + +- 비교 결과는 결과 출력기에 넘겨줄 수 있다. + + + ## 🚀 기능 요구사항 - 이 게임은 프로그램이 1에서 9까지 서로 다른 임의의 수 3개를 정하고 이를 플레이어가 맞추는 게임이다. - 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받는다. @@ -11,6 +94,7 @@ - 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
+ ## ✍🏻 입출력 요구사항 ### ⌨️ 입력 diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index d484dad..248c5ec 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -5,6 +5,8 @@ public class Application { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - // TODO 구현 진행 + GameManager manager = new GameManager(scanner); + manager.run(); + scanner.close(); } } diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java new file mode 100644 index 0000000..6d07366 --- /dev/null +++ b/src/main/java/baseball/GameManager.java @@ -0,0 +1,86 @@ +package baseball; + +import baseball.generator.RandomNumberGenerator; +import baseball.receiver.ConsoleInputReceiver; +import baseball.receiver.InputReceiver; +import baseball.number.GameNumber; +import baseball.printer.ConsolePrinter; +import baseball.printer.Printer; +import baseball.result.Result; + +import java.util.InputMismatchException; +import java.util.Objects; +import java.util.Scanner; + +public class GameManager { + private static final int START_GAME = 1; + + private final Printer printer; + private final InputReceiver receiver; + private GameNumber seedNumber; + private GameNumber userNumber; + + public GameManager(Scanner scanner) { + Objects.requireNonNull(scanner); + printer = new ConsolePrinter(); + receiver = new ConsoleInputReceiver(scanner); + } + + public void run() { + printer.greet(); + printer.askStartGame(); + + boolean continueGame = isContinueGame(); + + while (continueGame) { + Result result = new Result(); + seedNumber = RandomNumberGenerator.generate(); + startGame(result); + printer.noticeWin(); + printer.askStartGame(); + continueGame = isContinueGame(); + } + } + + private boolean isContinueGame() { + int select = receiver.receiveContinueGameSelect(); + try { + throwIfInputIsNotOneOrTwo(select); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return isContinueGame(); + } + return (select == START_GAME); + } + + private void throwIfInputIsNotOneOrTwo(int select) { + if (select != 1 && select != 2) { + throw new IllegalArgumentException("올바르지 않은 입력입니다.\n시작은 1, 종료는 2 입니다."); + } + } + + private void startGame(Result result) { + while (!result.isWin()) { + boolean isValidInput = receiveUserInput(); + + if (!isValidInput) { + continue; + } + result.calculateResult(seedNumber, userNumber); + printer.printResult(result); + } + } + + private boolean receiveUserInput() { + try { + printer.requestUserNumber(); + String userInput = receiver.receiveUserNumber(); + userNumber = GameNumber.from(userInput); + } catch (IllegalArgumentException | InputMismatchException e) { + receiver.dealWithExceptionalInput(); + printer.warnInvalidInput(); + return false; + } + return true; + } +} diff --git a/src/main/java/baseball/generator/RandomNumberGenerator.java b/src/main/java/baseball/generator/RandomNumberGenerator.java new file mode 100644 index 0000000..3e1695f --- /dev/null +++ b/src/main/java/baseball/generator/RandomNumberGenerator.java @@ -0,0 +1,22 @@ +package baseball.generator; + +import baseball.number.GameNumber; +import utils.RandomUtils; + +public class RandomNumberGenerator { + + public static GameNumber generate() { + int newSeed = 0; + + for (int exponent = 0; exponent < 3; exponent++) { + int randomDigit = RandomUtils.nextInt(1, 9); + newSeed += (Math.pow(10.0, exponent) * randomDigit); + } + + if (!GameNumber.validateNumber(newSeed)){ + return generate(); + } + + return GameNumber.from(String.valueOf(newSeed)); + } +} diff --git a/src/main/java/baseball/number/GameNumber.java b/src/main/java/baseball/number/GameNumber.java new file mode 100644 index 0000000..6e3c960 --- /dev/null +++ b/src/main/java/baseball/number/GameNumber.java @@ -0,0 +1,44 @@ +package baseball.number; + +public class GameNumber { + private String value; + + private GameNumber(String number) { + value = number; + } + + public static GameNumber from(String number) { + if (!validateNumber(Integer.parseInt(number))) { + throw new IllegalArgumentException(); + } + return new GameNumber(number); + } + + public static boolean validateNumber(int number) { + if (number <= 122 || number >=988) { + return false; + } + + boolean[] digits = new boolean[10]; + String strNumber = Integer.toString(number); + + for (char digit : strNumber.toCharArray()) { + + int integerDigit = Integer.parseInt(String.valueOf(digit)); + if (integerDigit == 0) { + return false; + } + if (!digits[integerDigit]) { + digits[integerDigit] = true; + continue; + } + return false; + } + + return true; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/baseball/printer/ConsolePrinter.java b/src/main/java/baseball/printer/ConsolePrinter.java new file mode 100644 index 0000000..db7e255 --- /dev/null +++ b/src/main/java/baseball/printer/ConsolePrinter.java @@ -0,0 +1,50 @@ +package baseball.printer; + +import baseball.result.Result; + +public class ConsolePrinter implements Printer { + + @Override + public void greet() { + System.out.println("숫자 야구 게임입니다.\n" + + "게임을 시작하시겠습니까?"); + } + + @Override + public void askStartGame() { + System.out.println("시작하려면 1, 종료하려면 2를 입력하세요."); + } + + @Override + public void requestUserNumber() { + System.out.print("숫자를 입렧해주세요 : "); + } + + @Override + public void warnInvalidInput() { + System.out.println("올바르지 않은 입력입니다.\n" + + "서로 다른 숫자 세 자리를 입력해주세요."); + } + + @Override + public void printResult(Result result) { + if (result.isNothing()) { + System.out.println("낫싱"); + return ; + } + + if (result.getBallCount() != 0) { + System.out.print(result.getBallCount() + "볼 "); + } + + if (result.getStrikeCount() != 0) { + System.out.print(result.getStrikeCount() + "스트라이크"); + } + System.out.println(); + } + + @Override + public void noticeWin() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } +} diff --git a/src/main/java/baseball/printer/Printer.java b/src/main/java/baseball/printer/Printer.java new file mode 100644 index 0000000..9a78225 --- /dev/null +++ b/src/main/java/baseball/printer/Printer.java @@ -0,0 +1,17 @@ +package baseball.printer; + +import baseball.result.Result; + +public interface Printer { + void greet(); + + void askStartGame(); + + void requestUserNumber(); + + void warnInvalidInput(); + + void printResult(Result result); + + void noticeWin(); +} diff --git a/src/main/java/baseball/receiver/ConsoleInputReceiver.java b/src/main/java/baseball/receiver/ConsoleInputReceiver.java new file mode 100644 index 0000000..42d3c38 --- /dev/null +++ b/src/main/java/baseball/receiver/ConsoleInputReceiver.java @@ -0,0 +1,49 @@ +package baseball.receiver; + +import baseball.number.GameNumber; + +import java.util.InputMismatchException; +import java.util.Scanner; + +public class ConsoleInputReceiver implements InputReceiver { + + private final Scanner scanner; + + public ConsoleInputReceiver(Scanner scanner) { + this.scanner = scanner; + } + + @Override + public int receiveContinueGameSelect() { + int select; + try { + select = scanner.nextInt(); + } catch (InputMismatchException e) { + cleanScannerBuffer(); + System.out.println("잘못된 입력입니다. 숫자만 입력해주세요."); + return receiveContinueGameSelect(); + } + + return select; + } + + @Override + public String receiveUserNumber() throws IllegalArgumentException, InputMismatchException { + int number = scanner.nextInt(); + if (!GameNumber.validateNumber(number)) { + throw new IllegalArgumentException(); + } + return Integer.toString(number); + } + + @Override + public void dealWithExceptionalInput() { + cleanScannerBuffer(); + } + + private void cleanScannerBuffer() { + if (scanner.hasNextLine()) { + scanner.nextLine(); + } + } +} diff --git a/src/main/java/baseball/receiver/InputReceiver.java b/src/main/java/baseball/receiver/InputReceiver.java new file mode 100644 index 0000000..003abb9 --- /dev/null +++ b/src/main/java/baseball/receiver/InputReceiver.java @@ -0,0 +1,10 @@ +package baseball.receiver; + +public interface InputReceiver { + + int receiveContinueGameSelect(); + + String receiveUserNumber(); + + void dealWithExceptionalInput(); +} diff --git a/src/main/java/baseball/result/Result.java b/src/main/java/baseball/result/Result.java new file mode 100644 index 0000000..301b3cd --- /dev/null +++ b/src/main/java/baseball/result/Result.java @@ -0,0 +1,57 @@ +package baseball.result; + +import baseball.number.GameNumber; + +public class Result { + private int strikeCount; + private int ballCount; + + public Result() { + this.strikeCount = 0; + this.ballCount = 0; + } + + public void calculateResult(GameNumber seedNumber, GameNumber userNumber) { + calculateStrikeCount(seedNumber, userNumber); + calculateBallCount(seedNumber, userNumber); + } + + private void calculateStrikeCount(GameNumber seedNumber, GameNumber userNumber) { + int strikeCount = 0; + String seedValue = seedNumber.getValue(); + String userValue = userNumber.getValue(); + + for (int i = 0; i < seedValue.length(); i++) { + if (userValue.charAt(index) == seedValue.charAt(index)) { + strikeCount++; + } + } + this.strikeCount = strikeCount; + } + + private void calculateBallCount(GameNumber seedNumber, GameNumber userNumber) { + String seedValue = seedNumber.getValue(); + String userValue = userNumber.getValue(); + int ballCount = (int) seedValue.codePoints() + .mapToObj(digit -> (char) digit) + .filter(digit -> userValue.indexOf(digit) != -1) + .count(); + this.ballCount = ballCount - strikeCount; + } + + public boolean isWin() { + return strikeCount == 3; + } + + public boolean isNothing() { + return strikeCount == 0 && ballCount == 0; + } + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } +} diff --git a/src/test/java/baseball/generator/RandomNumberGeneratorTest.java b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java new file mode 100644 index 0000000..0da4412 --- /dev/null +++ b/src/test/java/baseball/generator/RandomNumberGeneratorTest.java @@ -0,0 +1,24 @@ +package baseball.generator; + +import baseball.number.GameNumber; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomNumberGeneratorTest { + + @Test + void 생성된_난수가_게임_숫자_생성규칙에_부합하는지_100회_검증() { + + GameNumber randomNumber; + + for (int loop = 0; loop < 100; loop++) { + //given + randomNumber = RandomNumberGenerator.generate(); + int integerRandomNumber = Integer.parseInt(randomNumber.getValue()); + + //when, then + assertTrue(GameNumber.validateNumber(integerRandomNumber)); + } + } +} \ No newline at end of file diff --git a/src/test/java/baseball/number/GameNumberTest.java b/src/test/java/baseball/number/GameNumberTest.java new file mode 100644 index 0000000..d597f36 --- /dev/null +++ b/src/test/java/baseball/number/GameNumberTest.java @@ -0,0 +1,256 @@ +package baseball.number; + +import baseball.result.Result; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class GameNumberTest { + + @Test + void case_노카운트_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("123"); + seedNumbers[0] = GameNumber.from("456"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("984"); + seedNumbers[1] = GameNumber.from("712"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("921"); + seedNumbers[2] = GameNumber.from("743"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("652"); + seedNumbers[3] = GameNumber.from("981"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 0); + } + } + + @Test + void case_1스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("582"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("237"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("597"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("746"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_1스트라이크_1볼_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("287"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("497"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("917"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("236"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 1); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_1스트라이크_2볼_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("387"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("897"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("217"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("836"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 2); + assertEquals(results[testCase].getStrikeCount(), 1); + } + } + + @Test + void case_2스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("583"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("287"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("137"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("382"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 2); + } + } + + @Test + void case_3스트라이크_검증() { + //given + final int TEST_CASE_NUM = 4; + GameNumber[] userNumbers = new GameNumber[TEST_CASE_NUM]; + GameNumber[] seedNumbers = new GameNumber[TEST_CASE_NUM]; + Result[] results = new Result[TEST_CASE_NUM]; + + userNumbers[0] = GameNumber.from("783"); + seedNumbers[0] = GameNumber.from("783"); + results[0] = new Result(); + + userNumbers[1] = GameNumber.from("987"); + seedNumbers[1] = GameNumber.from("987"); + results[1] = new Result(); + + userNumbers[2] = GameNumber.from("127"); + seedNumbers[2] = GameNumber.from("127"); + results[2] = new Result(); + + userNumbers[3] = GameNumber.from("386"); + seedNumbers[3] = GameNumber.from("386"); + results[3] = new Result(); + + for (int testCase = 0; testCase < TEST_CASE_NUM; testCase++) { + //when + results[testCase].calculateResult(seedNumbers[testCase], userNumbers[testCase]); + //then + assertEquals(results[testCase].getBallCount(), 0); + assertEquals(results[testCase].getStrikeCount(), 3); + } + } + + @Test + void 세자리수_입력이_아니면_false() { + //given + int input1 = 1000; + int input2 = -1; + int input3 = 23; + int input4 = 99; + + //when, then + assertFalse(GameNumber.validateNumber(input1)); + assertFalse(GameNumber.validateNumber(input2)); + assertFalse(GameNumber.validateNumber(input3)); + assertFalse(GameNumber.validateNumber(input4)); + } + + @Test + public void 세자리_수이지만_서로_다른_숫자가_아니면_false() { + //given + int input1 = 110; + int input2 = 122; + int input3 = 999; + int input4 = 575; + int input5 = 100; + + //when, then + assertFalse(GameNumber.validateNumber(input1)); + assertFalse(GameNumber.validateNumber(input2)); + assertFalse(GameNumber.validateNumber(input3)); + assertFalse(GameNumber.validateNumber(input4)); + assertFalse(GameNumber.validateNumber(input5)); + } + + @Test + public void 세자리_수이면서_각_자리_숫자가_서로_다른_숫자이면_true() { + //given + int input1 = 564; + int input2 = 679; + int input3 = 541; + int input4 = 918; + int input5 = 543; + + //when, then + assertTrue(GameNumber.validateNumber(input1)); + assertTrue(GameNumber.validateNumber(input2)); + assertTrue(GameNumber.validateNumber(input3)); + assertTrue(GameNumber.validateNumber(input4)); + assertTrue(GameNumber.validateNumber(input5)); + } +} \ No newline at end of file