diff --git a/README.md b/README.md index fcf3f057..558879bf 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,12 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 +* 랜덤 숫자 생성 + * 길이는 3, 중복 X +* 숫자 입력 후 랜덤 숫자와 비교 + * 숫자와 위치가 같으면 스트라이크 + * 수자는 같은데 위치가 다르면 볼 + * 모두 맞으면 게임 종료 +* 각 게임이 끝나면 다시하기 s가능 diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..6eecdefa --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,10 @@ +import game.Game; + +public class Main { + public static void main(String[] args){ + Game game = new Game(); + do { + game.start(); + } while (game.checkGameAgain()); + } +} diff --git a/src/main/java/console/Console.java b/src/main/java/console/Console.java new file mode 100644 index 00000000..a5640789 --- /dev/null +++ b/src/main/java/console/Console.java @@ -0,0 +1,47 @@ +package console; + +import game.Score; + +import java.util.ArrayList; +import java.util.Scanner; + +public class Console { + + private static final String ASK_GAME_AGAIN = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private static final String INPUT_NUMBER = "숫자를 입력해주세요 : "; + private static final String GAME_END = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private final Scanner scanner; + + public Console() { + this.scanner = new Scanner(System.in); + } + + public int getGameMenu(){ + System.out.println(ASK_GAME_AGAIN); + return scanner.nextInt(); + } + + public ArrayList getPlayerAnswer(){ + System.out.println(INPUT_NUMBER); + ArrayList playerAnswer = new ArrayList<>(); + String input = scanner.next(); + String[] splitNumber = input.split(""); + for(int idx = 0; idx < 3; idx++){ + playerAnswer.add(Integer.parseInt(splitNumber[idx])); + } + return playerAnswer; + } + + public void printScore(Score score){ + if (score.getStrike() != 0) + System.out.println(String.format("%d 스트라이크", score.getStrike())); + if (score.getBall() != 0) + System.out.println(String.format("%d 볼", score.getBall())); + if (score.getStrike() == 0 && score.getBall() == 0) + System.out.println("낫싱"); + } + + public void printGameEnd(){ + System.out.println(GAME_END); + } +} diff --git a/src/main/java/console/Menu.java b/src/main/java/console/Menu.java new file mode 100644 index 00000000..6a9f1985 --- /dev/null +++ b/src/main/java/console/Menu.java @@ -0,0 +1,16 @@ +package console; + +public enum Menu { + DO_GAME(1), + EXIT_GAME(2); + + private final int menuNumber; + + Menu(int menuNumber) { + this.menuNumber = menuNumber; + } + + public static boolean isDoGame(int menuNumber) { + return DO_GAME.menuNumber == menuNumber; + } +} diff --git a/src/main/java/game/Game.java b/src/main/java/game/Game.java new file mode 100644 index 00000000..c7dc0586 --- /dev/null +++ b/src/main/java/game/Game.java @@ -0,0 +1,70 @@ +package game; + + +import console.Console; +import console.Menu; + +import java.util.ArrayList; +import java.util.Collections; + +public class Game { + + private final Console console; + private ArrayList answer; + + public Game() { + this.console = new Console(); + answer = new ArrayList<>(3); + } + + public void start(){ + makeRandomNumber(); + while(true) { + ArrayList playerAnswer = console.getPlayerAnswer(); + Score score = new Score(0, 0); + setScore(playerAnswer, score); + console.printScore(score); + if (score.getStrike() == 3) + break; + } + console.printGameEnd(); + } + + private void setScore(ArrayList playerAnswer, Score score) { + setStrikeCount(playerAnswer, score); + for (int idx = 0; idx < 3; idx++) { + setBallCount(playerAnswer, score, idx); + } + } + + private void setBallCount(ArrayList playerAnswer, Score score, int idx){ + for (int compIdx = 0; compIdx < 3; compIdx++){ + if (compIdx != idx && answer.get(compIdx) == playerAnswer.get(idx)) + score.plusBall(); + } + } + + private void setStrikeCount(ArrayList playerAnswer, Score score){ + for (int idx = 0; idx < 3; idx++){ + if (answer.get(idx) == playerAnswer.get(idx)) { + score.plusStrike(); + } + } + } + + private void makeRandomNumber() { + answer.clear(); + ArrayList numbers = new ArrayList<>(); + for (int i = 1; i <= 9; i++) { + numbers.add(i); + } + Collections.shuffle(numbers); + for (int idx = 0; idx < 3; idx++) { + answer.add(numbers.get(idx)); + } + } + + public boolean checkGameAgain(){ + return Menu.isDoGame(console.getGameMenu()); + } +} diff --git a/src/main/java/game/Score.java b/src/main/java/game/Score.java new file mode 100644 index 00000000..b0fafc86 --- /dev/null +++ b/src/main/java/game/Score.java @@ -0,0 +1,27 @@ +package game; + +public class Score { + private int ball; + private int strike; + + public Score(int ball, int strike) { + this.ball = ball; + this.strike = strike; + } + + public int getBall() { + return ball; + } + + public void plusBall() { + this.ball++; + } + + public int getStrike() { + return strike; + } + + public void plusStrike() { + this.strike++; + } +} diff --git a/src/test/java/game/GameTest.java b/src/test/java/game/GameTest.java new file mode 100644 index 00000000..15a9f2b6 --- /dev/null +++ b/src/test/java/game/GameTest.java @@ -0,0 +1,42 @@ +package game; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameTest { + + Game game = new Game(); + + @Test + void testRandomNumberSizeIs3() throws Exception { + Method method = Game.class.getDeclaredMethod("makeRandomNumber"); + method.setAccessible(true); + Field field = Game.class.getDeclaredField("answer"); + field.setAccessible(true); + + ArrayList array = (ArrayList)field.get(game); + method.invoke(game); + assertThat(array.size()).isEqualTo(3); + } + + @Test + void testRandomNumberIsNotDuplicated() throws Exception { + Method method = Game.class.getDeclaredMethod("makeRandomNumber"); + method.setAccessible(true); + Field field = Game.class.getDeclaredField("answer"); + field.setAccessible(true); + + ArrayList array = (ArrayList)field.get(game); + method.invoke(game); + + Set set = new HashSet<>(array); + assertThat(set.size()).isEqualTo(array.size()); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -}