From b561b832f161299fde3b54832d0dd7e10f8a6c42 Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 1 Nov 2023 11:02:38 +0900 Subject: [PATCH 1/7] =?UTF-8?q?init:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 8fe711203..ca0e86a43 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,3 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) - ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 - ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push - -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) - ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. - ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. - -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 - -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +1. 컴퓨터가 서로 다른 임의의 숫자를 3개 선택 +2. 플레이어가 입력한 문자열과 컴퓨터가 선택한 숫자를 비교하고 결과 반환 +3. 입력과 출력을 처리 \ No newline at end of file From 4c2a66e8b2edfd70086ff7d83cacbaa289ae8bcb Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 1 Nov 2023 12:49:22 +0900 Subject: [PATCH 2/7] =?UTF-8?q?Feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseBall.java | 5 + src/test/java/baseball/BaseBallTest.java | 127 +++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/main/java/baseball/BaseBall.java create mode 100644 src/test/java/baseball/BaseBallTest.java diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseBall.java new file mode 100644 index 000000000..9a4723bbf --- /dev/null +++ b/src/main/java/baseball/BaseBall.java @@ -0,0 +1,5 @@ +package baseball; + +public class BaseBall { + +} diff --git a/src/test/java/baseball/BaseBallTest.java b/src/test/java/baseball/BaseBallTest.java new file mode 100644 index 000000000..5e4865793 --- /dev/null +++ b/src/test/java/baseball/BaseBallTest.java @@ -0,0 +1,127 @@ +package baseball; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import util.baseball.BaseBall; + +class BaseBallTest { + + @Test + void 컴퓨터가_세_개의_숫자를_선택() { + // given + BaseBall baseBall = new BaseBall(); + + // when + TargetNumber base = baseBall.setTargetNumber(); + + // then + assertThat(base.size()).isEqualTo(3); + } + + @ParameterizedTest + @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') + void one_ball(String targetNumber, String input) { + // given + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(1); + assertThat(result.getStrike()).isEqualTo(0); + assertThat(result.getOut()).isEqualTo(2); + } + + @ParameterizedTest + @CsvSource(value = {"135:213", "135:251", "248:452", "248:854", "123:219", "123:319"}, delimiter = ':') + void two_ball(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(2); + assertThat(result.getStrike()).isEqualTo(0); + assertThat(result.getOut()).isEqualTo(1); + } + + @ParameterizedTest + @CsvSource(value = {"135:513", "135:351"}, delimiter = ':') + void three_ball(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(3); + assertThat(result.getStrike()).isEqualTo(0); + assertThat(result.getOut()).isEqualTo(0); + } + + @ParameterizedTest + @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') + void one_strike(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getOut()).isEqualTo(2); + } + + @ParameterizedTest + @CsvSource(value = {"135:138", "135:235", "135:145"}, delimiter = ':') + void two_strike(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getStrike()).isEqualTo(2); + assertThat(result.getOut()).isEqualTo(1); + } + + @ParameterizedTest + @CsvSource(value = {"135:215", "135:231", "248:438", "248:234", "123:329", "123:139"}, delimiter = ':') + void one_ball_one_strike(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(1); + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getOut()).isEqualTo(1); + } + + @ParameterizedTest + @CsvSource(value = {"135:135", "248:248", "123:123"}, delimiter = ':') + void three_strike(String targetNumber, String input) { + TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + int compare = Integer.parseInt(input); + + // when + Discrimination result = base.discriminate(compare); + + // then + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.getStrike()).isEqualTo(3); + assertThat(result.getOut()).isEqualTo(0); + } +} \ No newline at end of file From efe7157c70c78050cdbb7e7c386ce6b9c3f012c8 Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 1 Nov 2023 14:06:54 +0900 Subject: [PATCH 3/7] =?UTF-8?q?Feat:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseBall.java | 34 +++++++++++++++ src/main/java/baseball/Discrimination.java | 50 +++++++++++++++++++++ src/main/java/baseball/Number.java | 18 ++++++++ src/test/java/baseball/BaseBallTest.java | 51 ++++++++++++++-------- 4 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 src/main/java/baseball/Discrimination.java create mode 100644 src/main/java/baseball/Number.java diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseBall.java index 9a4723bbf..49f81482d 100644 --- a/src/main/java/baseball/BaseBall.java +++ b/src/main/java/baseball/BaseBall.java @@ -1,5 +1,39 @@ package baseball; +import java.util.ArrayList; +import java.util.List; + public class BaseBall { + private Number targetNumber; + private final List history = new ArrayList<>(); + + public void setNewGame() { + int num = 0; + for (int i = 0; i < 3; i++) { + int digit = 1; + int random = (int) (Math.random() * 9) + 1; + num += random * digit; + } + + this.targetNumber = new Number(num); + } + + protected void setTargetNumber(Number targetNumber) { + this.targetNumber = targetNumber; + } + + public Number getTargetNumber() { + return this.targetNumber; + } + + public Discrimination discriminate(int answer) { + Number compare = new Number(answer); + Discrimination discrimination = new Discrimination(targetNumber, compare); + history.add(discrimination); + return discrimination; + } + public List getHistory() { + return new ArrayList<>(this.history); + } } diff --git a/src/main/java/baseball/Discrimination.java b/src/main/java/baseball/Discrimination.java new file mode 100644 index 000000000..9adeba57c --- /dev/null +++ b/src/main/java/baseball/Discrimination.java @@ -0,0 +1,50 @@ +package baseball; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.IntStream; + +public class Discrimination { + private final int strike; + private final int ball; + private final int out; + + public Discrimination(Number base, Number compare) { + int[] baseArr = base.get(); + int[] compareArr = compare.get(); + + Map compareMap = new HashMap<>(); + IntStream.range(0, 3).forEach(i -> compareMap.put(compareArr[i], i)); + + int strike = 0; + int ball = 0; + + for (int i = 0; i < baseArr.length; i++) { + if (compareMap.containsKey(baseArr[i])) { + if (compareMap.get(baseArr[i]) == i) { + strike++; + } else { + ball++; + } + + compareMap.remove(baseArr[i]); + } + } + + this.strike = strike; + this.ball = ball; + this.out = compareMap.size(); + } + + public int getStrike() { + return strike; + } + + public int getBall() { + return ball; + } + + public int getOut() { + return out; + } +} diff --git a/src/main/java/baseball/Number.java b/src/main/java/baseball/Number.java new file mode 100644 index 000000000..937729662 --- /dev/null +++ b/src/main/java/baseball/Number.java @@ -0,0 +1,18 @@ +package baseball; + +import java.util.Arrays; + +public class Number { + private final int[] nums = new int[3]; + + public Number(int number) { + for (int i = 2; i >= 0; i--) { + nums[i] = number % 10; + number = number / 10; + } + } + + public int[] get() { + return Arrays.copyOf(nums, 3); + } +} diff --git a/src/test/java/baseball/BaseBallTest.java b/src/test/java/baseball/BaseBallTest.java index 5e4865793..a116a8923 100644 --- a/src/test/java/baseball/BaseBallTest.java +++ b/src/test/java/baseball/BaseBallTest.java @@ -3,7 +3,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import util.baseball.BaseBall; + +import static org.assertj.core.api.Assertions.assertThat; class BaseBallTest { @@ -11,23 +12,25 @@ class BaseBallTest { void 컴퓨터가_세_개의_숫자를_선택() { // given BaseBall baseBall = new BaseBall(); + baseBall.setNewGame(); // when - TargetNumber base = baseBall.setTargetNumber(); + Number base = baseBall.getTargetNumber(); // then - assertThat(base.size()).isEqualTo(3); + assertThat(base.get().length).isEqualTo(3); } @ParameterizedTest @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') void one_ball(String targetNumber, String input) { // given - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -38,11 +41,13 @@ void one_ball(String targetNumber, String input) { @ParameterizedTest @CsvSource(value = {"135:213", "135:251", "248:452", "248:854", "123:219", "123:319"}, delimiter = ':') void two_ball(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(2); @@ -53,11 +58,13 @@ void two_ball(String targetNumber, String input) { @ParameterizedTest @CsvSource(value = {"135:513", "135:351"}, delimiter = ':') void three_ball(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(3); @@ -66,13 +73,15 @@ void three_ball(String targetNumber, String input) { } @ParameterizedTest - @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') + @CsvSource(value = {"135:148", "135:238", "135:245"}, delimiter = ':') void one_strike(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -83,11 +92,13 @@ void one_strike(String targetNumber, String input) { @ParameterizedTest @CsvSource(value = {"135:138", "135:235", "135:145"}, delimiter = ':') void two_strike(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -98,11 +109,13 @@ void two_strike(String targetNumber, String input) { @ParameterizedTest @CsvSource(value = {"135:215", "135:231", "248:438", "248:234", "123:329", "123:139"}, delimiter = ':') void one_ball_one_strike(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -113,11 +126,13 @@ void one_ball_one_strike(String targetNumber, String input) { @ParameterizedTest @CsvSource(value = {"135:135", "248:248", "123:123"}, delimiter = ':') void three_strike(String targetNumber, String input) { - TargetNumber base = new TargetNumber(Integer.parseInt(targetNumber)); + // given + BaseBall baseBall = new BaseBall(); + baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = base.discriminate(compare); + Discrimination result = baseBall.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); From c5f7dd00d7a16c3657d235d03e2753505eed3366 Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 1 Nov 2023 14:44:58 +0900 Subject: [PATCH 4/7] =?UTF-8?q?Feat:=20=EC=9D=B8=ED=92=8B,=20=EC=95=84?= =?UTF-8?q?=EC=9B=83=ED=92=8B=EC=9D=84=20=EC=B2=98=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B0=9D=EC=B2=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{BaseBall.java => BaseballGame.java} | 35 +++++++++++--- src/main/java/baseball/Discrimination.java | 14 ++++++ src/main/java/util/Terminal.java | 18 +++++++ src/test/java/baseball/BaseBallTest.java | 48 +++++++++---------- 4 files changed, 85 insertions(+), 30 deletions(-) rename src/main/java/baseball/{BaseBall.java => BaseballGame.java} (51%) create mode 100644 src/main/java/util/Terminal.java diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseballGame.java similarity index 51% rename from src/main/java/baseball/BaseBall.java rename to src/main/java/baseball/BaseballGame.java index 49f81482d..44918f59d 100644 --- a/src/main/java/baseball/BaseBall.java +++ b/src/main/java/baseball/BaseballGame.java @@ -1,21 +1,36 @@ package baseball; -import java.util.ArrayList; -import java.util.List; +import util.Terminal; -public class BaseBall { +import java.io.IOException; +import java.util.*; + +public class BaseballGame { private Number targetNumber; private final List history = new ArrayList<>(); public void setNewGame() { + Set bucket = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); + int num = 0; + int digit = 1; for (int i = 0; i < 3; i++) { - int digit = 1; - int random = (int) (Math.random() * 9) + 1; - num += random * digit; + num += pickNumber(bucket) * digit; + digit *= 10; } this.targetNumber = new Number(num); + this.history.clear(); + } + + private int pickNumber(Set bucket) { + while (true) { + int random = (int) (Math.random() * 9) + 1; + if (bucket.contains(random)) { + bucket.remove(random); + return random; + } + } } protected void setTargetNumber(Number targetNumber) { @@ -26,6 +41,14 @@ public Number getTargetNumber() { return this.targetNumber; } + public boolean proceed() throws IOException { + String in = Terminal.in("숫자를 입력해주세요 : "); + Discrimination discrimination = discriminate(Integer.parseInt(in)); + Terminal.out(discrimination.print()); + + return discrimination.getStrike() == 3; + } + public Discrimination discriminate(int answer) { Number compare = new Number(answer); Discrimination discrimination = new Discrimination(targetNumber, compare); diff --git a/src/main/java/baseball/Discrimination.java b/src/main/java/baseball/Discrimination.java index 9adeba57c..648108e73 100644 --- a/src/main/java/baseball/Discrimination.java +++ b/src/main/java/baseball/Discrimination.java @@ -36,6 +36,20 @@ public Discrimination(Number base, Number compare) { this.out = compareMap.size(); } + public String print() { + StringBuilder sb = new StringBuilder(); + if (getBall() > 0) { + sb.append(String.format("%d볼 ", getBall())); + } + + if (getStrike() > 0) { + sb.append(String.format("%d스트라이크", getStrike())); + } + + sb.append(System.lineSeparator()); + return sb.toString(); + } + public int getStrike() { return strike; } diff --git a/src/main/java/util/Terminal.java b/src/main/java/util/Terminal.java new file mode 100644 index 000000000..7be11cb5e --- /dev/null +++ b/src/main/java/util/Terminal.java @@ -0,0 +1,18 @@ +package util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Terminal { + + public static String in(String message) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + System.out.print(message); + return br.readLine(); + } + + public static void out(String str) { + System.out.print(str); + } +} diff --git a/src/test/java/baseball/BaseBallTest.java b/src/test/java/baseball/BaseBallTest.java index a116a8923..aca60f02e 100644 --- a/src/test/java/baseball/BaseBallTest.java +++ b/src/test/java/baseball/BaseBallTest.java @@ -11,11 +11,11 @@ class BaseBallTest { @Test void 컴퓨터가_세_개의_숫자를_선택() { // given - BaseBall baseBall = new BaseBall(); - baseBall.setNewGame(); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setNewGame(); // when - Number base = baseBall.getTargetNumber(); + Number base = baseballGame.getTargetNumber(); // then assertThat(base.get().length).isEqualTo(3); @@ -25,12 +25,12 @@ class BaseBallTest { @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') void one_ball(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -42,12 +42,12 @@ void one_ball(String targetNumber, String input) { @CsvSource(value = {"135:213", "135:251", "248:452", "248:854", "123:219", "123:319"}, delimiter = ':') void two_ball(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(2); @@ -59,12 +59,12 @@ void two_ball(String targetNumber, String input) { @CsvSource(value = {"135:513", "135:351"}, delimiter = ':') void three_ball(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(3); @@ -76,12 +76,12 @@ void three_ball(String targetNumber, String input) { @CsvSource(value = {"135:148", "135:238", "135:245"}, delimiter = ':') void one_strike(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -93,12 +93,12 @@ void one_strike(String targetNumber, String input) { @CsvSource(value = {"135:138", "135:235", "135:145"}, delimiter = ':') void two_strike(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -110,12 +110,12 @@ void two_strike(String targetNumber, String input) { @CsvSource(value = {"135:215", "135:231", "248:438", "248:234", "123:329", "123:139"}, delimiter = ':') void one_ball_one_strike(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -127,12 +127,12 @@ void one_ball_one_strike(String targetNumber, String input) { @CsvSource(value = {"135:135", "248:248", "123:123"}, delimiter = ':') void three_strike(String targetNumber, String input) { // given - BaseBall baseBall = new BaseBall(); - baseBall.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballGame baseballGame = new BaseballGame(); + baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseBall.discriminate(compare); + Discrimination result = baseballGame.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); From 1f9d3cf46a67c4ce64cc3a6ad7c406892f049ac8 Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 1 Nov 2023 14:45:04 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Feat:=20=EB=A9=94=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..11bd8fb16 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,42 @@ +import baseball.BaseballGame; +import util.Terminal; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + BaseballGame stage = new BaseballGame(); + + while (true) { + stage.setNewGame(); + if (proceed(stage)) { + return; + } + } + } + + private static boolean proceed(BaseballGame stage) throws IOException { + while (true) { + boolean proceed = stage.proceed(); + if (proceed) { + return askPlayEnd(); + } + } + } + + private static boolean askPlayEnd() throws IOException { + while (true) { + Terminal.out("세 개의 숫자를 모두 맞히셨습니다! 게임 종료"); + String in = Terminal.in("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요." + System.lineSeparator()); + if (in.trim().equals("1")) { + return false; + } + + if (in.trim().equals("2")) { + return true; + } + + Terminal.out("1과 2중에서 입력해주세요"); + } + } +} From 0138d1021de3bc1fe3b1ce531c6bfdcbc648f51b Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 8 Nov 2023 16:27:22 +0900 Subject: [PATCH 6/7] =?UTF-8?q?Feat:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=ED=95=98=EC=97=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 42 ------------ src/main/java/baseball/BaseballGame.java | 66 +++++++------------ src/main/java/baseball/BaseballStage.java | 38 +++++++++++ src/main/java/baseball/Number.java | 31 +++++++++ .../java/baseball/RandomNumberGenerator.java | 20 ++++++ src/test/java/baseball/BaseBallTest.java | 42 +++++------- 6 files changed, 130 insertions(+), 109 deletions(-) delete mode 100644 src/main/java/Main.java create mode 100644 src/main/java/baseball/BaseballStage.java create mode 100644 src/main/java/baseball/RandomNumberGenerator.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java deleted file mode 100644 index 11bd8fb16..000000000 --- a/src/main/java/Main.java +++ /dev/null @@ -1,42 +0,0 @@ -import baseball.BaseballGame; -import util.Terminal; - -import java.io.IOException; - -public class Main { - public static void main(String[] args) throws IOException { - BaseballGame stage = new BaseballGame(); - - while (true) { - stage.setNewGame(); - if (proceed(stage)) { - return; - } - } - } - - private static boolean proceed(BaseballGame stage) throws IOException { - while (true) { - boolean proceed = stage.proceed(); - if (proceed) { - return askPlayEnd(); - } - } - } - - private static boolean askPlayEnd() throws IOException { - while (true) { - Terminal.out("세 개의 숫자를 모두 맞히셨습니다! 게임 종료"); - String in = Terminal.in("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요." + System.lineSeparator()); - if (in.trim().equals("1")) { - return false; - } - - if (in.trim().equals("2")) { - return true; - } - - Terminal.out("1과 2중에서 입력해주세요"); - } - } -} diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 44918f59d..cb3e5565b 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -3,60 +3,40 @@ import util.Terminal; import java.io.IOException; -import java.util.*; public class BaseballGame { - private Number targetNumber; - private final List history = new ArrayList<>(); - - public void setNewGame() { - Set bucket = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); - - int num = 0; - int digit = 1; - for (int i = 0; i < 3; i++) { - num += pickNumber(bucket) * digit; - digit *= 10; + public static void main(String[] args) throws IOException { + while (true) { + Number targetNumber = RandomNumberGenerator.generate(); + BaseballStage stage = new BaseballStage(targetNumber); + if (proceed(stage)) { + return; + } } - - this.targetNumber = new Number(num); - this.history.clear(); } - private int pickNumber(Set bucket) { + private static boolean proceed(BaseballStage stage) throws IOException { while (true) { - int random = (int) (Math.random() * 9) + 1; - if (bucket.contains(random)) { - bucket.remove(random); - return random; + boolean proceed = stage.proceed(); + if (proceed) { + return askPlayEnd(); } } } - protected void setTargetNumber(Number targetNumber) { - this.targetNumber = targetNumber; - } - - public Number getTargetNumber() { - return this.targetNumber; - } - - public boolean proceed() throws IOException { - String in = Terminal.in("숫자를 입력해주세요 : "); - Discrimination discrimination = discriminate(Integer.parseInt(in)); - Terminal.out(discrimination.print()); - - return discrimination.getStrike() == 3; - } + private static boolean askPlayEnd() throws IOException { + while (true) { + Terminal.out("세 개의 숫자를 모두 맞히셨습니다! 게임 종료"); + String in = Terminal.in("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요." + System.lineSeparator()); + if (in.trim().equals("1")) { + return false; + } - public Discrimination discriminate(int answer) { - Number compare = new Number(answer); - Discrimination discrimination = new Discrimination(targetNumber, compare); - history.add(discrimination); - return discrimination; - } + if (in.trim().equals("2")) { + return true; + } - public List getHistory() { - return new ArrayList<>(this.history); + Terminal.out("1과 2중에서 입력해주세요"); + } } } diff --git a/src/main/java/baseball/BaseballStage.java b/src/main/java/baseball/BaseballStage.java new file mode 100644 index 000000000..c6e7cdc9c --- /dev/null +++ b/src/main/java/baseball/BaseballStage.java @@ -0,0 +1,38 @@ +package baseball; + +import util.Terminal; + +import java.io.IOException; +import java.util.*; + +public class BaseballStage { + private final Number targetNumber; + private final List history = new ArrayList<>(); + + public BaseballStage(Number number) { + this.targetNumber = number; + } + + public Number getTargetNumber() { + return this.targetNumber; + } + + public boolean proceed() throws IOException { + String in = Terminal.in("숫자를 입력해주세요 : "); + Discrimination discrimination = discriminate(Integer.parseInt(in)); + Terminal.out(discrimination.print()); + + return discrimination.getStrike() == 3; + } + + public Discrimination discriminate(int answer) { + Number compare = new Number(answer); + Discrimination discrimination = new Discrimination(targetNumber, compare); + history.add(discrimination); + return discrimination; + } + + public List getHistory() { + return new ArrayList<>(this.history); + } +} diff --git a/src/main/java/baseball/Number.java b/src/main/java/baseball/Number.java index 937729662..bae7c1445 100644 --- a/src/main/java/baseball/Number.java +++ b/src/main/java/baseball/Number.java @@ -15,4 +15,35 @@ public Number(int number) { public int[] get() { return Arrays.copyOf(nums, 3); } + + @Override + public boolean equals(Object obj) { + if (obj.getClass() != this.getClass()) { + return false; + } + + int[] compare = ((Number) obj).get(); + + if (nums.length != compare.length) { + return false; + } + + for (int i = 0; i < this.nums.length; i++) { + if (nums[i] != compare[i]) { + return false; + } + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + for (int num : nums) { + hashCode = 31 * hashCode + num; + } + + return hashCode; + } } diff --git a/src/main/java/baseball/RandomNumberGenerator.java b/src/main/java/baseball/RandomNumberGenerator.java new file mode 100644 index 000000000..ac5688467 --- /dev/null +++ b/src/main/java/baseball/RandomNumberGenerator.java @@ -0,0 +1,20 @@ +package baseball; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class RandomNumberGenerator { + public static Number generate() { + List bucket = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); + Collections.shuffle(bucket); + + int num = 0; + for (int i = 0; i < 3; i++) { + num = num * 10 + bucket.get(i); + } + + return new Number(num); + } +} diff --git a/src/test/java/baseball/BaseBallTest.java b/src/test/java/baseball/BaseBallTest.java index aca60f02e..1697c6d1f 100644 --- a/src/test/java/baseball/BaseBallTest.java +++ b/src/test/java/baseball/BaseBallTest.java @@ -11,26 +11,26 @@ class BaseBallTest { @Test void 컴퓨터가_세_개의_숫자를_선택() { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setNewGame(); + Number num = RandomNumberGenerator.generate(); + BaseballStage baseballStage = new BaseballStage(num); // when - Number base = baseballGame.getTargetNumber(); + Number base = baseballStage.getTargetNumber(); // then assertThat(base.get().length).isEqualTo(3); + assertThat(base).isEqualTo(num); } @ParameterizedTest @CsvSource(value = {"135:218", "135:241", "248:435", "248:134", "123:389", "123:739"}, delimiter = ':') void one_ball(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -42,12 +42,11 @@ void one_ball(String targetNumber, String input) { @CsvSource(value = {"135:213", "135:251", "248:452", "248:854", "123:219", "123:319"}, delimiter = ':') void two_ball(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(2); @@ -59,12 +58,11 @@ void two_ball(String targetNumber, String input) { @CsvSource(value = {"135:513", "135:351"}, delimiter = ':') void three_ball(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(3); @@ -76,12 +74,11 @@ void three_ball(String targetNumber, String input) { @CsvSource(value = {"135:148", "135:238", "135:245"}, delimiter = ':') void one_strike(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -93,12 +90,11 @@ void one_strike(String targetNumber, String input) { @CsvSource(value = {"135:138", "135:235", "135:145"}, delimiter = ':') void two_strike(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); @@ -110,12 +106,11 @@ void two_strike(String targetNumber, String input) { @CsvSource(value = {"135:215", "135:231", "248:438", "248:234", "123:329", "123:139"}, delimiter = ':') void one_ball_one_strike(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(1); @@ -127,12 +122,11 @@ void one_ball_one_strike(String targetNumber, String input) { @CsvSource(value = {"135:135", "248:248", "123:123"}, delimiter = ':') void three_strike(String targetNumber, String input) { // given - BaseballGame baseballGame = new BaseballGame(); - baseballGame.setTargetNumber(new Number(Integer.parseInt(targetNumber))); + BaseballStage baseballStage = new BaseballStage(new Number(Integer.parseInt(targetNumber))); int compare = Integer.parseInt(input); // when - Discrimination result = baseballGame.discriminate(compare); + Discrimination result = baseballStage.discriminate(compare); // then assertThat(result.getBall()).isEqualTo(0); From d61e622eee9b131d0b3042a6ae0451c39e0fbc80 Mon Sep 17 00:00:00 2001 From: deok-beom Date: Wed, 8 Nov 2023 16:53:56 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Feat:=20=ED=9E=88=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B2=B0=EA=B3=BC=20=ED=91=9C=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseballGame.java | 13 ++++-- src/main/java/baseball/Discrimination.java | 48 +++++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index cb3e5565b..1288b032b 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -3,10 +3,12 @@ import util.Terminal; import java.io.IOException; +import java.util.List; public class BaseballGame { public static void main(String[] args) throws IOException { while (true) { + Terminal.out("게임 시작!" + System.lineSeparator()); Number targetNumber = RandomNumberGenerator.generate(); BaseballStage stage = new BaseballStage(targetNumber); if (proceed(stage)) { @@ -19,14 +21,19 @@ private static boolean proceed(BaseballStage stage) throws IOException { while (true) { boolean proceed = stage.proceed(); if (proceed) { - return askPlayEnd(); + return askPlayEnd(stage.getHistory()); } } } - private static boolean askPlayEnd() throws IOException { + private static boolean askPlayEnd(List history) throws IOException { while (true) { - Terminal.out("세 개의 숫자를 모두 맞히셨습니다! 게임 종료"); + Terminal.out("세 개의 숫자를 모두 맞히셨습니다! 게임 종료" + System.lineSeparator()); + + for (Discrimination discrimination : history) { + Terminal.out(discrimination.show()); + } + String in = Terminal.in("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요." + System.lineSeparator()); if (in.trim().equals("1")) { return false; diff --git a/src/main/java/baseball/Discrimination.java b/src/main/java/baseball/Discrimination.java index 648108e73..575ab79b1 100644 --- a/src/main/java/baseball/Discrimination.java +++ b/src/main/java/baseball/Discrimination.java @@ -5,47 +5,75 @@ import java.util.stream.IntStream; public class Discrimination { + private final int input; private final int strike; private final int ball; private final int out; + private final String[] visual = new String[3]; public Discrimination(Number base, Number compare) { - int[] baseArr = base.get(); int[] compareArr = compare.get(); + int input = 0; + for (int i : compareArr) { + input = input * 10 + i; + } + this.input = input; - Map compareMap = new HashMap<>(); - IntStream.range(0, 3).forEach(i -> compareMap.put(compareArr[i], i)); + int[] baseArr = base.get(); + Map baseMap = new HashMap<>(); + IntStream.range(0, 3).forEach(i -> baseMap.put(baseArr[i], i)); int strike = 0; int ball = 0; - for (int i = 0; i < baseArr.length; i++) { - if (compareMap.containsKey(baseArr[i])) { - if (compareMap.get(baseArr[i]) == i) { + for (int i = 0; i < compareArr.length; i++) { + if (baseMap.containsKey(compareArr[i])) { + if (baseMap.get(compareArr[i]) == i) { + visual[i] = "S"; strike++; } else { + visual[i] = "B"; ball++; } - compareMap.remove(baseArr[i]); + baseMap.remove(baseArr[i]); + } else { + visual[i] = "O"; } } this.strike = strike; this.ball = ball; - this.out = compareMap.size(); + this.out = baseMap.size(); } public String print() { StringBuilder sb = new StringBuilder(); - if (getBall() > 0) { + sb.append(String.format("[입력:%d] > ", this.input)); + + if (ball > 0) { sb.append(String.format("%d볼 ", getBall())); } - if (getStrike() > 0) { + if (strike > 0) { sb.append(String.format("%d스트라이크", getStrike())); } + if (out == 3) { + sb.append("3아웃!"); + } + + sb.append(System.lineSeparator()); + return sb.toString(); + } + + public String show() { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("[입력:%d] > ", this.input)); + for (String s : visual) { + sb.append(s); + } + sb.append(System.lineSeparator()); return sb.toString(); }