From f3842c94f568ec816e444395f949de965574ecd5 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Fri, 9 Aug 2024 21:13:49 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat.=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 8fe711203..7b1ce4d13 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,30 @@ git checkout main // 기본 브랜치가 main인 경우 git checkout -b 브랜치이름 ex) git checkout -b apply-feedback ``` +--- +4. 기능 목록 - TDD 구현 +- 1~9의 숫자 중 랜덤으로 3개의 숫자를 구한다 +- 사용자로부터 입력 받는 3개 숫자 예외처리 + - 1~9의 숫자인가? + - 중복 값이 있는가? + - 3자리인가? +- 위치와 숫자 값이 같은 경우 -> 스트라이크 +- 위치는 다른데 숫자 값이 같은 경우 -> 볼 +- 숫자 값이 다른 경우 -> 낫싱 +- 사용자가 입력한 값에 대한 실행 결과를 구한다 + +```jsx +com / user +123 / 123 -> 3 strike +123 / 142 -> 1 strike, 1 ball + +# step 1 +1 2 / 1 2 -> strike +3 2 / 1 2 -> ball +1 3 / 1 2 -> nothing + +# step 2 +123 / 1 1 -> strike +123 / 1 2 -> ball +123 / 1 5 -> nothing +``` \ No newline at end of file From d6116bfd5ced5ede299e0117b9a2ebf26c49f634 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 00:07:27 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat.=20Step1=20&=20Step2=20=EC=88=98?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - step 1 : random ball 1개와 user입력 ball 1개 1:1 비교 - step 2 : ball 3개가 들어간 List의 Balls와 user입력 ball 1개 비교 --- src/main/java/baseball/Ball.java | 35 ++++++++++++++++++++++++++ src/main/java/baseball/BallStatus.java | 9 +++++++ src/main/java/baseball/Balls.java | 28 +++++++++++++++++++++ src/test/java/baseball/BallTest.java | 29 +++++++++++++++++++++ src/test/java/baseball/BallsTest.java | 33 ++++++++++++++++++++++++ 5 files changed, 134 insertions(+) create mode 100644 src/main/java/baseball/Ball.java create mode 100644 src/main/java/baseball/BallStatus.java create mode 100644 src/main/java/baseball/Balls.java create mode 100644 src/test/java/baseball/BallTest.java create mode 100644 src/test/java/baseball/BallsTest.java diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java new file mode 100644 index 000000000..856e7e9a8 --- /dev/null +++ b/src/main/java/baseball/Ball.java @@ -0,0 +1,35 @@ +package baseball; + +public class Ball { + // Step 1 + + private final int position; + private final int ballNum; + + public Ball(int position, int ballNum) { + this.position = position; + this.ballNum = ballNum; + } + + + public BallStatus play(Ball ball) { + if(this.equals(ball)) return BallStatus.STRIKE; + if(matchBallNum(ball.ballNum)) return BallStatus.BALL; + return BallStatus.NOTHING; + } + + private boolean matchBallNum(int ballNum) { + return this.ballNum == ballNum; + } + + @Override + public boolean equals(Object o) { + if(this == o)return true; + if(o == null || this.getClass() != o.getClass()) return false; // 실행 중인 클래스 객체의 정보를 확인 + Ball ball = (Ball) o; + return position == ball.position && + ballNum == ball.ballNum; + } + + +} diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java new file mode 100644 index 000000000..42a429d5d --- /dev/null +++ b/src/main/java/baseball/BallStatus.java @@ -0,0 +1,9 @@ +package baseball; + +public enum BallStatus { + NOTHING, STRIKE, BALL; + + public boolean isNotNothing() { + return this != NOTHING; + } +} diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java new file mode 100644 index 000000000..c2cfd2ad2 --- /dev/null +++ b/src/main/java/baseball/Balls.java @@ -0,0 +1,28 @@ +package baseball; + +import java.util.ArrayList; +import java.util.List; + +public class Balls { + private List balls; + + public Balls(List computer) { + this.balls = getBalls(computer); + } + + private static List getBalls(List computer) { + List balls = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + balls.add(new Ball(i+1, computer.get(i))); + } + return balls; + } + + public BallStatus play(Ball ball) { + return balls.stream() + .map(answer -> answer.play(ball)) + .filter(BallStatus::isNotNothing) + .findFirst() + .orElse(BallStatus.NOTHING); + } +} diff --git a/src/test/java/baseball/BallTest.java b/src/test/java/baseball/BallTest.java new file mode 100644 index 000000000..5879bbecf --- /dev/null +++ b/src/test/java/baseball/BallTest.java @@ -0,0 +1,29 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BallTest { + // Step 1. + @Test + @DisplayName("userball과 computerball 각각 1개씩 비교 - strike") + void strike() { + Ball computerBall = new Ball(1, 5); + + assertThat(computerBall.play(new Ball(1, 5))).isEqualTo(BallStatus.STRIKE); + } + @Test + @DisplayName("userball과 computerball 각각 1개씩 비교 - ball") + void ball() { + Ball computerBall = new Ball(1, 5); + assertThat(computerBall.play(new Ball(2, 5))).isEqualTo(BallStatus.BALL); + } + @Test + @DisplayName("userball과 computerball 각각 1개씩 비교 - nothing") + void nothing() { + Ball computerBall = new Ball(1, 5); + assertThat(computerBall.play(new Ball(2, 6))).isEqualTo(BallStatus.NOTHING); + } +} diff --git a/src/test/java/baseball/BallsTest.java b/src/test/java/baseball/BallsTest.java new file mode 100644 index 000000000..13e4d282f --- /dev/null +++ b/src/test/java/baseball/BallsTest.java @@ -0,0 +1,33 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BallsTest { + // Step 2. + @Test + @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - strike") + void strike() { + Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); + assertThat(computerBall.play(new Ball(1, 1))).isEqualTo(BallStatus.STRIKE); + + } + @Test + @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - ball") + void ball() { + Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); + assertThat(computerBall.play(new Ball(1, 3))).isEqualTo(BallStatus.BALL); + + } + @Test + @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - nothing") + void nothing() { + Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); + assertThat(computerBall.play(new Ball(1, 4))).isEqualTo(BallStatus.NOTHING); + + } +} From 59c310c2efc60160561684593b42456fdc46f442 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 15:16:50 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat.=20step=203=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - step 3 : ball 3개가 들어간 userBalls와 randomBalls를 비교 --- src/main/java/baseball/Ball.java | 8 +++---- src/main/java/baseball/BallStatus.java | 6 ++++++ src/main/java/baseball/Balls.java | 17 ++++++++++++--- src/main/java/baseball/Score.java | 26 ++++++++++++++++++++++ src/test/java/baseball/BallsTest.java | 30 ++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/main/java/baseball/Score.java diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java index 856e7e9a8..8437871cd 100644 --- a/src/main/java/baseball/Ball.java +++ b/src/main/java/baseball/Ball.java @@ -4,11 +4,11 @@ public class Ball { // Step 1 private final int position; - private final int ballNum; + private final BallNumber ballNum; public Ball(int position, int ballNum) { this.position = position; - this.ballNum = ballNum; + this.ballNum = new BallNumber(ballNum); } @@ -18,8 +18,8 @@ public BallStatus play(Ball ball) { return BallStatus.NOTHING; } - private boolean matchBallNum(int ballNum) { - return this.ballNum == ballNum; + private boolean matchBallNum(BallNumber ballNum) { + return this.ballNum.equals(ballNum); } @Override diff --git a/src/main/java/baseball/BallStatus.java b/src/main/java/baseball/BallStatus.java index 42a429d5d..4e99126a6 100644 --- a/src/main/java/baseball/BallStatus.java +++ b/src/main/java/baseball/BallStatus.java @@ -6,4 +6,10 @@ public enum BallStatus { public boolean isNotNothing() { return this != NOTHING; } + public boolean isStrike() { + return this == STRIKE; + } + public boolean isBall() { + return this == BALL; + } } diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java index c2cfd2ad2..830a56a4e 100644 --- a/src/main/java/baseball/Balls.java +++ b/src/main/java/baseball/Balls.java @@ -4,12 +4,13 @@ import java.util.List; public class Balls { - private List balls; + private final List balls; // computer balls public Balls(List computer) { this.balls = getBalls(computer); } + private static List getBalls(List computer) { List balls = new ArrayList<>(); for (int i = 0; i < 3; i++) { @@ -17,10 +18,20 @@ private static List getBalls(List computer) { } return balls; } + public Score play(List userInput) { + Balls userBalls = new Balls(userInput); + Score result = new Score(); + // 비교 분석 + for(Ball answer : balls){ // computerBall + BallStatus status = userBalls.play(answer); // 앞 뒤에 들어갈 객체가 바뀌어도 strike,ball 판별에는 문제가 되지 않음 + result.report(status); + } + return result; + } - public BallStatus play(Ball ball) { + public BallStatus play(Ball userBall) { return balls.stream() - .map(answer -> answer.play(ball)) + .map(answer -> answer.play(userBall)) .filter(BallStatus::isNotNothing) .findFirst() .orElse(BallStatus.NOTHING); diff --git a/src/main/java/baseball/Score.java b/src/main/java/baseball/Score.java new file mode 100644 index 000000000..aac8c2ebe --- /dev/null +++ b/src/main/java/baseball/Score.java @@ -0,0 +1,26 @@ +package baseball; + +public class Score { + private int strike = 0; + private int ball = 0; + + + public int getStrike() { + return this.strike; + } + public int getBall() { + return this.ball; + } + + public void report(BallStatus status) { + if(status.isBall()) this.ball += 1; + if(status.isStrike()) this.strike += 1; + + } + public boolean isGameEnd() { + return strike == 3; + } + public boolean isNothing() { + return this.strike == 0 && this.ball == 0; + } +} diff --git a/src/test/java/baseball/BallsTest.java b/src/test/java/baseball/BallsTest.java index 13e4d282f..6f3c19891 100644 --- a/src/test/java/baseball/BallsTest.java +++ b/src/test/java/baseball/BallsTest.java @@ -1,5 +1,6 @@ package baseball; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -8,6 +9,35 @@ import static org.assertj.core.api.Assertions.assertThat; public class BallsTest { + + // step 3. + @Test + @DisplayName("userball 3개와 computerball 3개를 가지고 비교 - strike") + void play_3strike() { + Balls computer = new Balls(Arrays.asList(1,2,3)); + Score result = computer.play(Arrays.asList(1,2,3)); + assertThat(result.getStrike()).isEqualTo(3); + assertThat(result.getBall()).isEqualTo(0); + assertThat(result.isGameEnd()).isTrue(); + } + @Test + @DisplayName("userball 3개와 computerball 3개를 가지고 비교 - ball") + void play_1strike_2ball() { + Balls computer = new Balls(Arrays.asList(1,2,3)); + Score result = computer.play(Arrays.asList(1,3,2)); + assertThat(result.getStrike()).isEqualTo(1); + assertThat(result.getBall()).isEqualTo(2); + } + + @Test + @DisplayName("userball 3개와 computerball 3개를 가지고 비교 - ball") + void play_nothing() { + Balls computer = new Balls(Arrays.asList(1,2,3)); + Score result = computer.play(Arrays.asList(4,5,6)); + assertThat(result.getStrike()).isNotEqualTo(1); + assertThat(result.getBall()).isNotEqualTo(2); + assertThat(result.isNothing()).isTrue(); + } // Step 2. @Test @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - strike") From bf730edf4abd49cedca733335e64ebe564d7d36b Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 20:20:59 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat.=203=EC=9E=90=EB=A6=AC=EC=9D=98=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/utils/MakeRandomNum.java | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/utils/MakeRandomNum.java diff --git a/src/main/java/utils/MakeRandomNum.java b/src/main/java/utils/MakeRandomNum.java new file mode 100644 index 000000000..8af912f3b --- /dev/null +++ b/src/main/java/utils/MakeRandomNum.java @@ -0,0 +1,32 @@ +package utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class MakeRandomNum { + private List numList; + private static boolean[] check; // true이면 값이 들어가있다 + public MakeRandomNum() { + check = new boolean[10]; // 1~9 사이의 수 파악 + } + public List makeRandomNum(){ + numList = new ArrayList<>(); + Random random = new Random(); + int idx = 0; + while(idx != 3) { + int num = random.nextInt(9)+1; // 1 ~ 4 까지의 무작위 int 값 리턴 + idx = checkDuplicate(idx, num); + } + System.out.println(numList.toString()); + return numList; + } + public int checkDuplicate(int idx, int num) { + if(!check[num]) { + idx++; + check[num] = true; + numList.add(num); + } + return idx; + } +} From 7b23875047476cf45d4c9fced53a6a232526fb35 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 20:21:26 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix.=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Ball.java | 10 +++++----- src/main/java/baseball/Balls.java | 6 +++--- src/test/java/baseball/BallTest.java | 6 +++--- src/test/java/baseball/BallsTest.java | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/baseball/Ball.java b/src/main/java/baseball/Ball.java index 8437871cd..bcf5eabdb 100644 --- a/src/main/java/baseball/Ball.java +++ b/src/main/java/baseball/Ball.java @@ -4,22 +4,22 @@ public class Ball { // Step 1 private final int position; - private final BallNumber ballNum; + private final int ballNum; public Ball(int position, int ballNum) { this.position = position; - this.ballNum = new BallNumber(ballNum); + this.ballNum = ballNum; } - public BallStatus play(Ball ball) { + public BallStatus playBall(Ball ball) { if(this.equals(ball)) return BallStatus.STRIKE; if(matchBallNum(ball.ballNum)) return BallStatus.BALL; return BallStatus.NOTHING; } - private boolean matchBallNum(BallNumber ballNum) { - return this.ballNum.equals(ballNum); + private boolean matchBallNum(int ballNum) { + return this.ballNum == ballNum; } @Override diff --git a/src/main/java/baseball/Balls.java b/src/main/java/baseball/Balls.java index 830a56a4e..b3cb0c5b1 100644 --- a/src/main/java/baseball/Balls.java +++ b/src/main/java/baseball/Balls.java @@ -23,15 +23,15 @@ public Score play(List userInput) { Score result = new Score(); // 비교 분석 for(Ball answer : balls){ // computerBall - BallStatus status = userBalls.play(answer); // 앞 뒤에 들어갈 객체가 바뀌어도 strike,ball 판별에는 문제가 되지 않음 + BallStatus status = userBalls.playBalls(answer); // 앞 뒤에 들어갈 객체가 바뀌어도 strike,ball 판별에는 문제가 되지 않음 result.report(status); } return result; } - public BallStatus play(Ball userBall) { + public BallStatus playBalls(Ball userBall) { return balls.stream() - .map(answer -> answer.play(userBall)) + .map(answer -> answer.playBall(userBall)) .filter(BallStatus::isNotNothing) .findFirst() .orElse(BallStatus.NOTHING); diff --git a/src/test/java/baseball/BallTest.java b/src/test/java/baseball/BallTest.java index 5879bbecf..fc4d5fef2 100644 --- a/src/test/java/baseball/BallTest.java +++ b/src/test/java/baseball/BallTest.java @@ -12,18 +12,18 @@ public class BallTest { void strike() { Ball computerBall = new Ball(1, 5); - assertThat(computerBall.play(new Ball(1, 5))).isEqualTo(BallStatus.STRIKE); + assertThat(computerBall.playBall(new Ball(1, 5))).isEqualTo(BallStatus.STRIKE); } @Test @DisplayName("userball과 computerball 각각 1개씩 비교 - ball") void ball() { Ball computerBall = new Ball(1, 5); - assertThat(computerBall.play(new Ball(2, 5))).isEqualTo(BallStatus.BALL); + assertThat(computerBall.playBall(new Ball(2, 5))).isEqualTo(BallStatus.BALL); } @Test @DisplayName("userball과 computerball 각각 1개씩 비교 - nothing") void nothing() { Ball computerBall = new Ball(1, 5); - assertThat(computerBall.play(new Ball(2, 6))).isEqualTo(BallStatus.NOTHING); + assertThat(computerBall.playBall(new Ball(2, 6))).isEqualTo(BallStatus.NOTHING); } } diff --git a/src/test/java/baseball/BallsTest.java b/src/test/java/baseball/BallsTest.java index 6f3c19891..ca88b77ba 100644 --- a/src/test/java/baseball/BallsTest.java +++ b/src/test/java/baseball/BallsTest.java @@ -43,21 +43,21 @@ void play_nothing() { @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - strike") void strike() { Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); - assertThat(computerBall.play(new Ball(1, 1))).isEqualTo(BallStatus.STRIKE); + assertThat(computerBall.playBalls(new Ball(1, 1))).isEqualTo(BallStatus.STRIKE); } @Test @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - ball") void ball() { Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); - assertThat(computerBall.play(new Ball(1, 3))).isEqualTo(BallStatus.BALL); + assertThat(computerBall.playBalls(new Ball(1, 3))).isEqualTo(BallStatus.BALL); } @Test @DisplayName("userball 1개와 computerball 리스트를 가지고 비교 - nothing") void nothing() { Balls computerBall = new Balls(Arrays.asList(1, 2, 3)); - assertThat(computerBall.play(new Ball(1, 4))).isEqualTo(BallStatus.NOTHING); + assertThat(computerBall.playBalls(new Ball(1, 4))).isEqualTo(BallStatus.NOTHING); } } From 7d07f0232b0766873101ca50c1bf86739b99de22 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 20:21:42 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat.=20ui=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ui/InputView.java | 22 ++++++++++++++++++++++ src/main/java/ui/ResultView.java | 29 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/ui/InputView.java create mode 100644 src/main/java/ui/ResultView.java diff --git a/src/main/java/ui/InputView.java b/src/main/java/ui/InputView.java new file mode 100644 index 000000000..1078d6695 --- /dev/null +++ b/src/main/java/ui/InputView.java @@ -0,0 +1,22 @@ +package ui; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class InputView { + public static int inputNumber() { + Scanner sc = new Scanner(System.in); + return sc.nextInt(); + } + public static List splitNumber(int userNumber) { + + List userNumList = new ArrayList<>(); + userNumList.add(userNumber / 100); + int tmp = userNumber % 100; + userNumList.add(tmp / 10); + userNumList.add(tmp % 10); + + return userNumList; + } +} diff --git a/src/main/java/ui/ResultView.java b/src/main/java/ui/ResultView.java new file mode 100644 index 000000000..54e1b3d96 --- /dev/null +++ b/src/main/java/ui/ResultView.java @@ -0,0 +1,29 @@ +package ui; + +import baseball.Score; + +public class ResultView { + public static int result(Score score) { + StringBuilder sb = new StringBuilder(); + int result = 0; + + if(score.isNothing()) { + sb.append("낫싱"); + } + if(score.getBall() > 0) { + sb.append(score.getBall()).append("볼 "); + } + if(score.getStrike() > 0){ + sb.append(score.getStrike()).append("스트라이크"); + result = score.getStrike(); + } + if(score.isGameEnd()) { + sb.append("\n") + .append("3개의 숫자를 모두 맞히셨습니다! 게임 종료").append("\n") + .append("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + } + System.out.println(sb); + + return result; + } +} From 6ce59d376389a9dbc3fa5b6a23cef805233687da Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 20:22:26 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat.=20Application=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=8B=A4=ED=96=89=20=EC=BD=94=EB=93=9C=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 | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/baseball/BaseBall.java diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseBall.java new file mode 100644 index 000000000..ac7d58edc --- /dev/null +++ b/src/main/java/baseball/BaseBall.java @@ -0,0 +1,37 @@ +package baseball; + +import ui.InputView; +import ui.ResultView; +import utils.MakeRandomNum; + +import java.util.Scanner; + +public class BaseBall { + public void game(){ + // computer num + MakeRandomNum randomNum = new MakeRandomNum(); + Balls answer = new Balls(randomNum.makeRandomNum()); + + // user num + Scanner sc = new Scanner(System.in); + int strike = 0; + + while(strike != 3) { + System.out.print("숫자를 입력해 주세요 : "); + int userInput = sc.nextInt(); + + strike = ResultView.result(answer.play(InputView.splitNumber(userInput))); + } + + } + public BaseBall() { + while(true){ + game(); + if(InputView.inputNumber()==2) return; + } + } + + public static void main(String[] args) { + new BaseBall(); + } +} From 07f07e6ef72cba2d38b12f2879a73cd7ae16798c Mon Sep 17 00:00:00 2001 From: wjdtk Date: Sat, 10 Aug 2024 22:15:10 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat.=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=EC=9D=98=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BallsNumber.java | 39 +++++++++++++++++++++++++ src/main/java/baseball/BaseBall.java | 11 ++++++- src/main/java/ui/InputView.java | 10 ------- src/test/java/baseball/BallsTest.java | 19 ++++++++++++ 4 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 src/main/java/baseball/BallsNumber.java diff --git a/src/main/java/baseball/BallsNumber.java b/src/main/java/baseball/BallsNumber.java new file mode 100644 index 000000000..c497ddd11 --- /dev/null +++ b/src/main/java/baseball/BallsNumber.java @@ -0,0 +1,39 @@ +package baseball; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BallsNumber { + + public List splitNumber(int userNumber) { + + List userNumList = new ArrayList<>(); + userNumList.add(userNumber / 100); + + int tmp = userNumber % 100; + userNumList.add(tmp / 10); + userNumList.add(tmp % 10); + + return userNumList; + } + + public static boolean validateNumber(List ballNumbers) { + boolean validation = false; + + for (Integer x : ballNumbers) { + if(! (0 < x && x < 10)) { + System.out.println("중복 숫자가 없는 수를 입력해주세요."); + return validation; + } + if(!(Collections.frequency(ballNumbers, x) == 1)) { + System.out.println("1~9 사이 숫자로 이루어진 수를 입력해주세요."); + return validation; + } + } + + return true; + } + +} + diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseBall.java index ac7d58edc..75aba9cd9 100644 --- a/src/main/java/baseball/BaseBall.java +++ b/src/main/java/baseball/BaseBall.java @@ -4,8 +4,11 @@ import ui.ResultView; import utils.MakeRandomNum; +import java.util.List; import java.util.Scanner; +import static baseball.BallsNumber.validateNumber; + public class BaseBall { public void game(){ // computer num @@ -20,7 +23,13 @@ public void game(){ System.out.print("숫자를 입력해 주세요 : "); int userInput = sc.nextInt(); - strike = ResultView.result(answer.play(InputView.splitNumber(userInput))); + // 유효성 검사 + BallsNumber ball = new BallsNumber(); + + List ballList = ball.splitNumber(userInput); + if(!validateNumber(ballList)) continue; + + strike = ResultView.result(answer.play(ballList)); } } diff --git a/src/main/java/ui/InputView.java b/src/main/java/ui/InputView.java index 1078d6695..599eab35e 100644 --- a/src/main/java/ui/InputView.java +++ b/src/main/java/ui/InputView.java @@ -9,14 +9,4 @@ public static int inputNumber() { Scanner sc = new Scanner(System.in); return sc.nextInt(); } - public static List splitNumber(int userNumber) { - - List userNumList = new ArrayList<>(); - userNumList.add(userNumber / 100); - int tmp = userNumber % 100; - userNumList.add(tmp / 10); - userNumList.add(tmp % 10); - - return userNumList; - } } diff --git a/src/test/java/baseball/BallsTest.java b/src/test/java/baseball/BallsTest.java index ca88b77ba..0f51b5d69 100644 --- a/src/test/java/baseball/BallsTest.java +++ b/src/test/java/baseball/BallsTest.java @@ -5,11 +5,30 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; +import java.util.List; +import static baseball.BallsNumber.validateNumber; import static org.assertj.core.api.Assertions.assertThat; public class BallsTest { + @Test + @DisplayName("user Ball의 유효성 검사- success") + void validate_success() { + assertThat(validateNumber(Arrays.asList(1,2,3))).isTrue(); + } + @Test + @DisplayName("user Ball의 유효성 검사 - 중복 검사") + void validate_fail1() { + assertThat(validateNumber(Arrays.asList(1,2,2))).isFalse(); + + }@Test + @DisplayName("user Ball의 유효성 검사 - 1~9사이 숫자") + void validate_fail2() { + assertThat(validateNumber(Arrays.asList(1,2,0))).isFalse(); + + } + // step 3. @Test @DisplayName("userball 3개와 computerball 3개를 가지고 비교 - strike") From 64f8ab7b2f3fbd7da34931f04484c78592ec9756 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Wed, 14 Aug 2024 11:36:52 +0900 Subject: [PATCH 09/11] =?UTF-8?q?refactor.=20indent=20depth=EA=B0=80=201?= =?UTF-8?q?=EC=9D=B4=ED=95=98=EA=B0=80=20=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20&&=20=EC=A4=91=EB=B3=B5=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BallsNumber.java | 45 +++++++++++++++---------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/baseball/BallsNumber.java b/src/main/java/baseball/BallsNumber.java index c497ddd11..5a5e4b4ee 100644 --- a/src/main/java/baseball/BallsNumber.java +++ b/src/main/java/baseball/BallsNumber.java @@ -7,33 +7,42 @@ public class BallsNumber { public List splitNumber(int userNumber) { - List userNumList = new ArrayList<>(); - userNumList.add(userNumber / 100); - int tmp = userNumber % 100; - userNumList.add(tmp / 10); - userNumList.add(tmp % 10); + while(userNumber > 0) { + userNumList.add(0, userNumber % 10); + userNumber /= 10; + } return userNumList; } - public static boolean validateNumber(List ballNumbers) { - boolean validation = false; - - for (Integer x : ballNumbers) { - if(! (0 < x && x < 10)) { - System.out.println("중복 숫자가 없는 수를 입력해주세요."); - return validation; - } - if(!(Collections.frequency(ballNumbers, x) == 1)) { - System.out.println("1~9 사이 숫자로 이루어진 수를 입력해주세요."); - return validation; - } - } + return areAllNumbersValid(ballNumbers) && areAllNumbersUnique(ballNumbers); + } + + // 1~9사이 숫자인지 확인 + private static boolean areAllNumbersValid(List ballNumbers) { + return ballNumbers.stream().allMatch(BallsNumber::isValidNumber); + } + private static boolean isValidNumber(int x) { + if (!(0 < x && x < 10)) { + System.out.println("1~9 사이 숫자로 이루어진 수를 입력해주세요."); + return false; + } return true; } + // 숫자 중복 확인 + private static boolean areAllNumbersUnique(List ballNumbers) { + return ballNumbers.stream().allMatch(x -> isUniqueNumber(ballNumbers, x)); + } + private static boolean isUniqueNumber(List ballNumbers, int x) { + if (!(Collections.frequency(ballNumbers, x) == 1)) { + System.out.println("중복 숫자가 없는 수를 입력해주세요."); + return false; + } + return true; + } } From aac045c357def3af2db5a8d72b3b2f0e99411f67 Mon Sep 17 00:00:00 2001 From: wjdtk Date: Wed, 14 Aug 2024 11:40:17 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor.=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=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/baseball/BaseBall.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/BaseBall.java b/src/main/java/baseball/BaseBall.java index 75aba9cd9..457262aed 100644 --- a/src/main/java/baseball/BaseBall.java +++ b/src/main/java/baseball/BaseBall.java @@ -36,7 +36,7 @@ public void game(){ public BaseBall() { while(true){ game(); - if(InputView.inputNumber()==2) return; + if(InputView.inputNumber()!=1) return; } } From 47ef43b9cbf6e94e8b05d2dd9765c997db53f61c Mon Sep 17 00:00:00 2001 From: wjdtk Date: Wed, 14 Aug 2024 11:43:59 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor.=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/utils/MakeRandomNum.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/utils/MakeRandomNum.java b/src/main/java/utils/MakeRandomNum.java index 8af912f3b..c9721c0af 100644 --- a/src/main/java/utils/MakeRandomNum.java +++ b/src/main/java/utils/MakeRandomNum.java @@ -18,7 +18,6 @@ public List makeRandomNum(){ int num = random.nextInt(9)+1; // 1 ~ 4 까지의 무작위 int 값 리턴 idx = checkDuplicate(idx, num); } - System.out.println(numList.toString()); return numList; } public int checkDuplicate(int idx, int num) {