diff --git a/README.md b/README.md index 8fe711203..2a3d55595 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,43 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` + +기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. + +같은 수가 같은 자리에 있으면 스트라이크, +다른 자리에 있으면 볼, +같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, +그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. +위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. +컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. +게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. +이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. +게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. + +- [x] 숫자 + - [x] randomNumberMaker + +- [x] ListUtil + - [x] List에 같은 숫자 있는지 중복 확인 + - [x] List의 사이즈 3인지 확인 + +- [x] 게임결과 판별기 (Referee) + - [x] 같은 숫자가 몇 개 있는지 확인 + - [x] 같은 자리, 같은 숫자 몇 개 있는지 확인 + - [x] 스트라이크, 볼, 낫싱 결과 도출 + +- [x] Computer + - [x] randomNumberMaker와 ListUtil을 통해 숫자 배열 반환 + +- [x] ScannerUtil + - [x] 숫자(String) 입력 + - [x] split 을 사용해 연속되어 들어오는 숫자 나누기 + - [x] split 한 String 배열을 List로 변환 + +- [x] Player + - [x] ScannerUtil 을 사용해서 숫자배열 반환 + +- [x] GameUtil + - [x] 1번을 누르면 재시작, 2번을 누르면 종료 + - [x] 1번 실행되는 게임 + - [x] 3스트라이크가 나올때까지 실행되는 게임 diff --git a/src/main/java/baseball/Computer.java b/src/main/java/baseball/Computer.java new file mode 100644 index 000000000..5d186b5f8 --- /dev/null +++ b/src/main/java/baseball/Computer.java @@ -0,0 +1,23 @@ +package baseball; + +import java.util.ArrayList; +import java.util.List; + +public class Computer { + + public List makeNumbers() { + RandomNumber randomNumber = new RandomNumber(); + + ListUtil listUtil = new ListUtil(); + + List computerNumbers = new ArrayList<>(); + + while (!listUtil.checkListSize(computerNumbers)) { + int number = randomNumber.make(); + listUtil.distinctNumberAdd(computerNumbers, number); + } + + System.out.println("computerNumbers = " + computerNumbers); + return computerNumbers; + } +} diff --git a/src/main/java/baseball/Game.java b/src/main/java/baseball/Game.java new file mode 100644 index 000000000..ce16ff800 --- /dev/null +++ b/src/main/java/baseball/Game.java @@ -0,0 +1,8 @@ +package baseball; + +public class Game { + public static void main(String[] args) { + GameUtil gameUtil = new GameUtil(); + gameUtil.runGame(); + } +} diff --git a/src/main/java/baseball/GameUtil.java b/src/main/java/baseball/GameUtil.java new file mode 100644 index 000000000..d0195f4d7 --- /dev/null +++ b/src/main/java/baseball/GameUtil.java @@ -0,0 +1,62 @@ +package baseball; + + +import java.util.List; + +public class GameUtil { + + public void runGame() { + + if (runOnlyOnceGame()) { + showMenu(); + } + } + + public boolean runOnlyOnceGame() { + + Computer computer = new Computer(); + List computers = computer.makeNumbers(); + + return gameResult(computers); + } + + private boolean gameResult(List computers) { + boolean threeStrike = true; + while (threeStrike) { + + Player player = new Player(); + List playerNumbers = player.makeNumbers(); + Referee referee = new Referee(); + + String result = referee.informStrikeBall(computers, playerNumbers); + System.out.println(result); + threeStrike = isGame(threeStrike, result); + } + + return true; + } + + private boolean isGame(boolean game, String result) { + if (result.equals("3스트라이크")) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + game = false; + } + return game; + } + + private void showMenu() { + ScannerUtil scannerUtil = new ScannerUtil(); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + + int choice = scannerUtil.insertInt(); + if (choice == 1) { + runGame(); + } + + while (choice != 1 && choice != 2) { + System.out.println("잘못 입력하셨습니다. 다시입력해주세요."); + choice = scannerUtil.insertInt(); + } + System.out.println("수고하셨습니다."); + } +} diff --git a/src/main/java/baseball/ListUtil.java b/src/main/java/baseball/ListUtil.java new file mode 100644 index 000000000..4c186e366 --- /dev/null +++ b/src/main/java/baseball/ListUtil.java @@ -0,0 +1,16 @@ +package baseball; + +import java.util.List; + +public class ListUtil { + + public boolean checkListSize(List list) { + return list.size() == 3; + } + + public void distinctNumberAdd(List numberList, int randomNumber) { + if (!numberList.contains(randomNumber)) { + numberList.add(randomNumber); + } + } +} diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/Player.java new file mode 100644 index 000000000..c60dccac9 --- /dev/null +++ b/src/main/java/baseball/Player.java @@ -0,0 +1,15 @@ +package baseball; + +import java.util.List; + +public class Player { + + public List makeNumbers() { + + ScannerUtil scannerUtil = new ScannerUtil(); + + List integers = scannerUtil.makeScannerNumbers(); + + return integers; + } +} diff --git a/src/main/java/baseball/RandomNumber.java b/src/main/java/baseball/RandomNumber.java new file mode 100644 index 000000000..cb529f05f --- /dev/null +++ b/src/main/java/baseball/RandomNumber.java @@ -0,0 +1,11 @@ +package baseball; + +import java.util.Random; + +public class RandomNumber { + + public int make() { + Random random = new Random(); + return random.nextInt(9) + 1; + } +} diff --git a/src/main/java/baseball/Referee.java b/src/main/java/baseball/Referee.java new file mode 100644 index 000000000..73a23e6fe --- /dev/null +++ b/src/main/java/baseball/Referee.java @@ -0,0 +1,61 @@ +package baseball; + +import java.util.List; + +public class Referee { + + public int countBall(List list1, List list2) { + + int count = 0; + int strike = countStrike(list1, list2); + + for (Integer number : list1) { + count = getCount(list2, count, number); + } + return count - strike; + } + + public int countStrike(List list1, List list2) { + + int count = 0; + for (int index = 0; index < 3; index++) { + count = getCountStrike(list1, list2, count, index); + } + return count; + } + + public String informStrikeBall(List list1, List list2) { + + int ball = countBall(list1, list2); + int strike = countStrike(list1, list2); + + if (strike == 3) { + return strike + "스트라이크"; + } + + if (strike == 0 && ball != 0) { + return ball + "볼"; + } + + if (strike != 0 && ball != 0) { + return ball + "볼 " + strike + "스트라이크"; + } + + return "낫싱"; + } + + private int getCountStrike(List list1, List list2, int count, int index) { + if (list1.get(index) == list2.get(index)) { + count++; + } + return count; + } + + private int getCount(List list2, int count, Integer number) { + if (list2.contains(number)) { + count++; + } + return count; + } + +} diff --git a/src/main/java/baseball/ScannerUtil.java b/src/main/java/baseball/ScannerUtil.java new file mode 100644 index 000000000..6f5aa8f5b --- /dev/null +++ b/src/main/java/baseball/ScannerUtil.java @@ -0,0 +1,56 @@ +package baseball; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class ScannerUtil { + + public List makeScannerNumbers() { + System.out.print("숫자를 입력하세요: "); + + ListUtil listUtil = new ListUtil(); + + List integers = stringListToIntegerList(); + + while (!listUtil.checkListSize(integers)) { + System.out.println("잘못된 숫자입니다."); + System.out.print("숫자를 입력하세요: "); + + integers = stringListToIntegerList(); + } + return integers; + } + + public String insertString() { + + Scanner scanner = new Scanner(System.in); + return scanner.next(); + } + + public int insertInt() { + + Scanner scanner = new Scanner(System.in); + return scanner.nextInt(); + } + + private String[] splitStringList() { + String string = insertString(); + + return string.split(""); + } + + private List stringListToIntegerList() { + String[] strings = splitStringList(); + + List temp = new ArrayList<>(); + ListUtil listUtil = new ListUtil(); + + for (String string : strings) { + int number = Integer.parseInt(string); + listUtil.distinctNumberAdd(temp, number); + } + + return temp; + } +} diff --git a/src/test/java/baseball/ListUtilTest.java b/src/test/java/baseball/ListUtilTest.java new file mode 100644 index 000000000..57050f592 --- /dev/null +++ b/src/test/java/baseball/ListUtilTest.java @@ -0,0 +1,47 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ListUtilTest { + + @Test + @DisplayName("리스트의 사이즈가 3이면 true 반환") + void checkListSize() throws Exception { + //given + ListUtil listUtil = new ListUtil(); + + List list = new ArrayList<>(); + list.add(1); + list.add(2); + list.add(3); + + //when + boolean checkListSize = listUtil.checkListSize(list); + + //then + assertThat(checkListSize).isTrue(); + } + + @Test + @DisplayName("리스트에 중복 숫자가 들어갈 경우 리스트에 add 안함") + void checkDuplicate() throws Exception { + //given + ListUtil listUtil = new ListUtil(); + + int number = 1; + List list = new ArrayList<>(); + + //when + for (int i = 0; i < 2; i++) { + listUtil.distinctNumberAdd(list, number); + } + //then + assertThat(list.size()).isEqualTo(1); + } +} diff --git a/src/test/java/baseball/RandomNumberTest.java b/src/test/java/baseball/RandomNumberTest.java new file mode 100644 index 000000000..82297f143 --- /dev/null +++ b/src/test/java/baseball/RandomNumberTest.java @@ -0,0 +1,22 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RandomNumberTest { + + @Test + @DisplayName("랜덤 넘버 만들기 테스트 -> 숫자 범위가 1~9 사이") + void randomNumberMakeTest() throws Exception { + //given + RandomNumber number = new RandomNumber(); + + //when + int randomNUmber = number.make(); + + //then + assertThat(randomNUmber).isBetween(1, 9); + } +} diff --git a/src/test/java/baseball/RefereeTest.java b/src/test/java/baseball/RefereeTest.java new file mode 100644 index 000000000..b4706a726 --- /dev/null +++ b/src/test/java/baseball/RefereeTest.java @@ -0,0 +1,60 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RefereeTest { + + @Test + @DisplayName("두 개의 리스트에서 몇 개의 숫자가 같은지 확인") + void countBall() throws Exception { + + //given + Referee referee = new Referee(); + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(3, 1, 2); + + //when + int ball = referee.countBall(list1, list2); + + //then + assertThat(ball).isEqualTo(3); + } + + @Test + @DisplayName("두 개의 리스트에서 같은 자리에 같은 숫자가 몇 개 있는지 확인") + void countStrike() throws Exception { + + //given + Referee referee = new Referee(); + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(1, 2, 3); + + //when + int strike = referee.countStrike(list1, list2); + + //then + assertThat(strike).isEqualTo(3); + } + + @Test + @DisplayName("볼, 스트라이크 갯수 알려주기") + void ballStrikeCount() throws Exception { + + //given + Referee referee = new Referee(); + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(1, 2, 3); + + //when + String inform = referee.informStrikeBall(list1, list2); + + //then + assertThat(inform).isEqualTo("3스트라이크"); + } +}