diff --git a/README.md b/README.md index 8d7e8aee..df1f751d 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + + +## 구현 요구사항 +1. 컴퓨터가 가지고 있을 랜덤 정수형 숫자 3개 생성 기능 + * 숫자의 범위는 1~9이다. + * 중복은 허용하지 않는다. +2. 플레이어 숫자 입력 기능 + * 플레이어는 컴퓨터가 가지고 있을 것이라 예상하는 숫자를 입력할 수 있다. + * 유효하지 않은 숫자를 입력할 경우 IllegalArgumentException를 발생시키고 프로그램은 종료된다. + * 정수형이 아닌 입력값, 유효하지 않은 범위, 길이가 3이 아닐 경우 +3. 플레이어 숫자 판정 + * 같은 수가 컴퓨터의 숫자의 같은 자리에 있을 경우 스트라이크, 숫자는 같지만 다른 자리에 있을 경우 볼, 같은 수가 전혀 없으면 낫싱이라는 결과를 얻을 수 있다. + * #스트라이크와 같이 각각의 스트라이크,볼의 개수를 나타내야한다. + * 플레이어가 모든 숫자를 맞출 때까지 입력과 판정 과정이 반복될 수 있어야한다. +4. 게임 재시작 혹은 종료 기능 + * 숫자를 모두 맞추면 게임이 종료되고 사용자는 게임을 다시 할 지 아예 종료할지 선택할 수 있다. \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..e7d99091 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,6 @@ +public class Application { + public static void main(String[] args) { + BaseballGameService baseballGameService = new BaseballGameService(); + baseballGameService.start(); + } +} \ No newline at end of file diff --git a/src/main/java/BaseballGameService.java b/src/main/java/BaseballGameService.java new file mode 100644 index 00000000..8eeb5eb2 --- /dev/null +++ b/src/main/java/BaseballGameService.java @@ -0,0 +1,18 @@ +import java.util.List; + +public class BaseballGameService { + public void start() { + boolean restart = true; + while(restart){ + ScoreCounting scoreCounting = new ScoreCounting(); + List randNums = RandomIntGenerate.init(); + List userInputs; + do { + userInputs = UserInput.getInput(); + } while (!scoreCounting.count(randNums, userInputs)); + + GameManager manager = new GameManager(); + restart = manager.restart(); + } + } +} \ No newline at end of file diff --git a/src/main/java/GameManager.java b/src/main/java/GameManager.java new file mode 100644 index 00000000..80502ce2 --- /dev/null +++ b/src/main/java/GameManager.java @@ -0,0 +1,18 @@ +import java.util.Scanner; + +public class GameManager { + public boolean restart(){ + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + Scanner scanner = new Scanner(System.in); + int restart = scanner.nextInt(); + if (restart == 1){ + return true; + } + else if (restart == 2){ + return false; + } + else{ + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/RandomIntGenerate.java b/src/main/java/RandomIntGenerate.java new file mode 100644 index 00000000..13802735 --- /dev/null +++ b/src/main/java/RandomIntGenerate.java @@ -0,0 +1,20 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +public class RandomIntGenerate { + public static List init() { + List nums = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + nums.add(generateNumber(nums)); + } + return nums; + } + private static int generateNumber(List nums){ + Random random = new Random(); + int randInt; + do { + randInt = random.nextInt(9) + 1; + } while (nums.contains(randInt)); + return randInt; + } +} diff --git a/src/main/java/ScoreCounting.java b/src/main/java/ScoreCounting.java new file mode 100644 index 00000000..d6e08385 --- /dev/null +++ b/src/main/java/ScoreCounting.java @@ -0,0 +1,37 @@ +import java.util.List; + +public class ScoreCounting { + public boolean count(List randInputs, List userInputs){ + String result = ""; + int strike = 0; + int ball = 0; + int miss = 0; + for (int i = 0; i < userInputs.size(); i++){ + if (userInputs.get(i).equals(randInputs.get(i))){ + ball++; + } else if (randInputs.contains(userInputs.get(i))) { + strike++; + } + else{ + miss++; + } + } + if (ball == 3){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } + if (miss == 3){ + result = "낫싱"; + } + else{ + if (ball > 0){ + result += (ball+"볼 "); + } + if (strike > 0){ + result += (strike+"스크라이트"); + } + } + System.out.println(result); + return false; + } +} diff --git a/src/main/java/UserInput.java b/src/main/java/UserInput.java new file mode 100644 index 00000000..2800e774 --- /dev/null +++ b/src/main/java/UserInput.java @@ -0,0 +1,28 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class UserInput { + public static List getInput() throws IllegalArgumentException{ + + Scanner scanner = new Scanner(System.in); + System.out.println("1~9까지의 숫자를 중복없이 입력해주세요."); + List userInputs = new ArrayList<>(); + for(int i = 0; i<3; i++) { + System.out.println(i + 1 + "번째 숫자를 입력해주세요 : "); + Integer num = scanner.nextInt(); + if (isValid(userInputs,num)){ + userInputs.add(num); + } + else{ + System.out.println("잘못된 숫자입니다."); + throw new IllegalArgumentException(); + } + } + return userInputs; + } + + private static boolean isValid(List nums,Integer num){ + return num > 0 && num < 10 && !nums.contains(num); + } +} diff --git a/src/test/java/ScoreCountingTest.java b/src/test/java/ScoreCountingTest.java new file mode 100644 index 00000000..32ff6f7f --- /dev/null +++ b/src/test/java/ScoreCountingTest.java @@ -0,0 +1,30 @@ +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class ScoreCountingTest { + + @Test + @DisplayName("점수 집계 테스트") + public void count(){ + //given + List userInputs = new ArrayList<>(); + userInputs.add(1); + userInputs.add(5); + userInputs.add(8); + List randInts = new ArrayList<>(); + randInts.add(8); + randInts.add(5); + randInts.add(3); + ScoreCounting counting = new ScoreCounting(); + + //when + boolean result = counting.count(userInputs,randInts); + + //then + Assertions.assertFalse(result); + } +}