From 36c50b4a1e8327c57a5d536faea5dfa22c9f2a89 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:21:17 +0900 Subject: [PATCH 1/9] =?UTF-8?q?README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) 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스트라이크가 나올때까지 실행되는 게임 From 66f64acda2ffdf92d98c2394c871bb264dc922d8 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:21:55 +0900 Subject: [PATCH 2/9] =?UTF-8?q?ListUtil=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/ListUtil.java | 16 ++++++++ src/test/java/baseball/ListUtilTest.java | 47 ++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/main/java/baseball/ListUtil.java create mode 100644 src/test/java/baseball/ListUtilTest.java 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/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); + } +} From a400529fb68960b188b307a69333cf55fafd78e4 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:22:57 +0900 Subject: [PATCH 3/9] =?UTF-8?q?RandomNumber=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/RandomNumber.java | 11 ++++++++++ src/test/java/baseball/RandomNumberTest.java | 22 ++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/baseball/RandomNumber.java create mode 100644 src/test/java/baseball/RandomNumberTest.java 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/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); + } +} From 0a2d0adbfb4058d8e0da9118f361206a6cc6dea7 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:23:47 +0900 Subject: [PATCH 4/9] =?UTF-8?q?Referee=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Referee.java | 61 +++++++++++++++++++++++++ src/test/java/baseball/RefereeTest.java | 60 ++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/main/java/baseball/Referee.java create mode 100644 src/test/java/baseball/RefereeTest.java 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/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스트라이크"); + } +} From b07dbf550894372e7e26dbb5db70084a48258cca Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:24:34 +0900 Subject: [PATCH 5/9] =?UTF-8?q?ScannerUtil=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/ScannerUtil.java | 56 +++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/baseball/ScannerUtil.java 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; + } +} From 2fe5655cc252a32f71282b7dd3120bc408d31f31 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:24:53 +0900 Subject: [PATCH 6/9] =?UTF-8?q?Computer=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Computer.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/baseball/Computer.java 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; + } +} From 8310f2b7aaf012fbc432718236f90349986c5806 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:25:17 +0900 Subject: [PATCH 7/9] =?UTF-8?q?Player=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Player.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/baseball/Player.java 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; + } +} From 431107a6cfedbe4af35eee1e9ca6f521389a660e Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:25:45 +0900 Subject: [PATCH 8/9] =?UTF-8?q?GameUtil=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameUtil.java | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/baseball/GameUtil.java 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("수고하셨습니다."); + } +} From f3b7db5adb228d7e74397583fb74938ce8eee994 Mon Sep 17 00:00:00 2001 From: kimjinwook1 <87925272+kimjinwook1@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:26:00 +0900 Subject: [PATCH 9/9] =?UTF-8?q?Game=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Game.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/baseball/Game.java 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(); + } +}