From 75b40601e063de8b8a7de225b2d451a699bd04d7 Mon Sep 17 00:00:00 2001 From: paka Date: Sat, 28 Jun 2025 02:48:06 +0900 Subject: [PATCH 1/6] =?UTF-8?q?init=20:=20readme=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=82=AD=EC=A0=9C=20=EB=90=9C?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 47 +++++++++++++++++++ .../{BallCount.java => BallCounting.java} | 0 src/main/java/baseball/Computer.java | 37 --------------- src/main/java/baseball/InputException.java | 8 ---- src/main/java/baseball/Judgement.java | 38 --------------- 5 files changed, 47 insertions(+), 83 deletions(-) rename src/main/java/baseball/{BallCount.java => BallCounting.java} (100%) delete mode 100644 src/main/java/baseball/Computer.java delete mode 100644 src/main/java/baseball/InputException.java delete mode 100644 src/main/java/baseball/Judgement.java diff --git a/docs/README.md b/docs/README.md index e69de29..2d73507 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,47 @@ +## Player 클래스 (사용자로 부터 숫자를 입력받음) +### 기능 +- `guess()`: 사용자 입력을 받아 숫자 리스트로 반환 + +## AiPlayer 클래스 (상대방) +### 기능 +- `correct()` :랜덤한 3자리의 숫자를 반환 +- `checkBallsAndStrikes()` : 입력받은 사용자의 숫자에 대해 결과를 볼,스트라이크,낫싱으로 결과값 반환 + +### 상태값 +- `ballcounting : BallCounting` +- `strike : String` +- `ball : String` +- `nothing : String` + +## GameHost 클래스 +### 기능 +- `start()` : 게임 시작 문구를 출력합니다 +- `end()` : 3스트라이크 시 게임 종료 문구를 출력합니다 +- `askRestart()` : 1입력시 종료, 2 입력 시 재시작을 합니다 + +## BallCounting 클래스 +### 기능 +- `setCorrect` : aiPlayer가 출력한 값을 가져옵니다 +- `setGuess` : 사용자가 예측한 숫자를 가져옵니다 +- `getStrike()` : 같은 자리의 숫자가 일치할 시 해당 횟수에 따라 스트라이크를 출력합니다 +- `getBall()` : 다른 자리의 숫자가 일치할 시 해당 횟수에 따라 볼을 출력합니다 +- `getNothing()` : 같은 숫자가 전혀 없을 시 낫싱을 출력합니다 + +### 상태값 +- `guess : List ` +- `correct : List ` + +## Start 클래스 +### 기능 +- `runGame()` : 게임을 진행합니다 + +### 상태값 +- `gameHost : GameHost` +- `aiPlayer : AiPlayer` +- `ballCounting :BallCounting` +- `player : Player` + +## ExceptionMessage +### 기능 +- `checkInputLength` : player 입력 숫자가 3자리에 대한 예외사항 + diff --git a/src/main/java/baseball/BallCount.java b/src/main/java/baseball/BallCounting.java similarity index 100% rename from src/main/java/baseball/BallCount.java rename to src/main/java/baseball/BallCounting.java diff --git a/src/main/java/baseball/Computer.java b/src/main/java/baseball/Computer.java deleted file mode 100644 index e59e1a0..0000000 --- a/src/main/java/baseball/Computer.java +++ /dev/null @@ -1,37 +0,0 @@ -package baseball; - -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; - -public class Computer { - - public List correct() { - List computer = new ArrayList<>(); - while (computer.size() < 3) { - int randomNumber = Randoms.pickNumberInRange(1, 9); - if (!computer.contains(randomNumber)) { - computer.add(randomNumber); - } - } - return computer; - } - - public void start() { - System.out.println("숫자 야구 게임을 시작합니다"); - } - - public void end() { - System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - } - - public int askRestart() { - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); - return Integer.parseInt(Console.readLine()); - } - - - -} diff --git a/src/main/java/baseball/InputException.java b/src/main/java/baseball/InputException.java deleted file mode 100644 index 84931eb..0000000 --- a/src/main/java/baseball/InputException.java +++ /dev/null @@ -1,8 +0,0 @@ -package baseball; - -public class InputException extends IllegalArgumentException { - - public InputException(String message) { - super(message); - } -} diff --git a/src/main/java/baseball/Judgement.java b/src/main/java/baseball/Judgement.java deleted file mode 100644 index 9adc8f1..0000000 --- a/src/main/java/baseball/Judgement.java +++ /dev/null @@ -1,38 +0,0 @@ -package baseball; - -public class Judgement { - - private BallCount ballCount; - - public Judgement(BallCount ballCount) { - - this.ballCount = ballCount; - } - - public String result() { - int strike = ballCount.strike().size(); - int ball = ballCount.ball().size(); - int nothing = ballCount.equalsNumber().size(); - - return countBall(ball) + countStrike(strike)+ isNothing(nothing); - } - - public String countStrike(int strike) { - if(strike > 0){ - return " "+strike +"스트라이크"; - }return ""; - } - - public String countBall(int ball) { - if (ball > 0) { - return ball + "볼"; - }return ""; - } - - public String isNothing(int nothing) { - if( nothing == 0) { - return "낫싱"; - }return ""; - } - -} From 968df78d7e8f58a02091ed9729fd80db673a0fa5 Mon Sep 17 00:00:00 2001 From: paka Date: Sat, 28 Jun 2025 02:49:26 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20computer=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B0=8F=20judgement=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?aiPlayer=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/AiPlayer.java | 49 +++++++++++++++++++++++++ src/main/java/baseball/Application.java | 5 +-- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/main/java/baseball/AiPlayer.java diff --git a/src/main/java/baseball/AiPlayer.java b/src/main/java/baseball/AiPlayer.java new file mode 100644 index 0000000..46f6f1b --- /dev/null +++ b/src/main/java/baseball/AiPlayer.java @@ -0,0 +1,49 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class AiPlayer { + + private final BallCounting ballCounting; + private String strike; + private String ball; + private String nothing; + + public AiPlayer(BallCounting ballCounting) { + this.ballCounting = ballCounting; + } + + public List correct() { + + List computer = new ArrayList<>(); + while (computer.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (!computer.contains(randomNumber)) { + computer.add(randomNumber); + } + } + return computer; + } + + public String checkBallsAndStrikes(List correct,List guess){ + List numberOfStrike = ballCounting.getStrike(correct,guess); + List numberOfBall = ballCounting.getBall(correct,guess); + strike =""; + ball = ""; + nothing =""; + + if(numberOfStrike.size()>0){ + strike = numberOfStrike.size() + "스트라이크"; + } + if(numberOfBall.size() >0) { + ball = numberOfBall.size() + "볼"; + } + if(numberOfStrike.size() == 0 && numberOfBall.size() == 0){ + nothing = ballCounting.getNothing(); + } + return ball + " " + strike + nothing; + } +} diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 8d761b8..73572c1 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -3,10 +3,7 @@ public class Application { public static void main(String[] args) { - Start start = new Start(); - start.button(); + start.runGame(); } - - } From e7f1ccedac1fedfcd28cf2af03fcebf7421fd158 Mon Sep 17 00:00:00 2001 From: paka Date: Sat, 28 Jun 2025 02:52:44 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20BallCounting=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20,=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EC=9D=98=20exception=EC=97=90=EC=84=9C=20?= =?UTF-8?q?IllegalArgumentExcepiton=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BallCounting.java | 32 ++++++-------------- src/main/java/baseball/ExceptionMessage.java | 2 +- src/main/java/baseball/Player.java | 1 - 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/main/java/baseball/BallCounting.java b/src/main/java/baseball/BallCounting.java index bf66d7b..2a1664d 100644 --- a/src/main/java/baseball/BallCounting.java +++ b/src/main/java/baseball/BallCounting.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -public class BallCount { +public class BallCounting { private List correct; private List guess; @@ -11,40 +11,28 @@ public class BallCount { public void setCorrect(List correct) { this.correct = correct; } - public void setGuess(List guess) { this.guess = guess; } - public List getCorrect() { - return correct; - } - - public List getGuess() { - return guess; - } - - public List strike() { + public List getStrike(List correct,List guess) { List sameNumber = new ArrayList<>(); for(int i = 0; i <3; i++) { - if(getCorrect().get(i) == getGuess().get(i)){ - sameNumber.add(getCorrect().get(i)); + if(correct.get(i).equals(guess.get(i)) ){ + sameNumber.add(guess.get(i)); } }return sameNumber; } - public List ball() { - List common = new ArrayList<>(equalsNumber()); - common.removeAll(strike()); - + public List getBall(List correct,List guess) { + List common = new ArrayList<>(correct); + common.retainAll(guess); + common.removeAll(getStrike(correct,guess)); return common; } - public List equalsNumber() { - List common = new ArrayList<>(getGuess()); - common .retainAll(getCorrect()); - - return common ; + public String getNothing() { + return "낫싱"; } } diff --git a/src/main/java/baseball/ExceptionMessage.java b/src/main/java/baseball/ExceptionMessage.java index a8bd2fd..b35b06d 100644 --- a/src/main/java/baseball/ExceptionMessage.java +++ b/src/main/java/baseball/ExceptionMessage.java @@ -4,7 +4,7 @@ public class ExceptionMessage { public void checkInputLength(String[] input) { if (input.length != 3) { - throw new InputException("3자리 숫자를 입력하셔야됩니다"); + throw new IllegalArgumentException("3자리 숫자를 입력하셔야됩니다"); } } } diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/Player.java index 073edbc..4f1db05 100644 --- a/src/main/java/baseball/Player.java +++ b/src/main/java/baseball/Player.java @@ -20,5 +20,4 @@ public List guess() { } return user; } - } From 8d12a02ce9ecbab323ad5b6d665b90b1135fbeb0 Mon Sep 17 00:00:00 2001 From: paka Date: Sat, 28 Jun 2025 02:53:31 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat=20:=20computer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=97=AD=ED=95=A0=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/baseball/GameHost.java | 23 +++++++++++++++ src/main/java/baseball/Start.java | 43 ++++++++++++---------------- 2 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 src/main/java/baseball/GameHost.java diff --git a/src/main/java/baseball/GameHost.java b/src/main/java/baseball/GameHost.java new file mode 100644 index 0000000..dbf814d --- /dev/null +++ b/src/main/java/baseball/GameHost.java @@ -0,0 +1,23 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; + +public class GameHost { + + public void start() { + System.out.println("숫자 야구 게임을 시작합니다"); + } + + public void end() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + + public String askRestart() { + Start start = new Start(); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + int ask = Integer.parseInt(Console.readLine()); + if (ask == 1){ + start.runGame(); + } return ""; + } +} diff --git a/src/main/java/baseball/Start.java b/src/main/java/baseball/Start.java index 07ffe6d..c619dea 100644 --- a/src/main/java/baseball/Start.java +++ b/src/main/java/baseball/Start.java @@ -4,38 +4,33 @@ public class Start { - private final Computer computer; - private final BallCount ballCount; - private Player player; - private Judgement judgement; + private final GameHost gameHost; + private final AiPlayer aiPlayer; + private final BallCounting ballCounting; + private final Player player; public Start() { - this.computer = new Computer(); + this.gameHost = new GameHost(); + this.ballCounting = new BallCounting(); + this.aiPlayer = new AiPlayer(ballCounting); this.player = new Player(); - this.ballCount = new BallCount(); - this.judgement = new Judgement(ballCount); } - public void button() { - computer.start(); - List correct = computer.correct(); - ballCount.setCorrect(correct); + public void runGame() { + gameHost.start(); + List correct = aiPlayer.correct(); + ballCounting.setCorrect(correct); while (true) { List guess = player.guess(); - ballCount.setGuess(guess); + ballCounting.setGuess(guess); - System.out.println(judgement.result()); - if (guess.equals(correct)) break; + System.out.println(aiPlayer.checkBallsAndStrikes(correct,guess)); + if (guess.equals(correct)) { + System.out.println("3스트라이크"); + break; + } } - computer.end(); - int ask = computer.askRestart(); - if(ask == 1){ - restart(); - } - } - - public void restart() { - new Start().button(); + gameHost.end(); + gameHost.askRestart(); } - } From 4480e1514bf0d2c13866db95971163f7e6762f6e Mon Sep 17 00:00:00 2001 From: paka Date: Sun, 29 Jun 2025 18:15:53 +0900 Subject: [PATCH 5/6] =?UTF-8?q?init:=20README=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=82=B4=EC=9A=A9=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80=20(=EC=BD=94=EB=93=9C=EB=8A=94?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EC=97=86=EC=9D=8C,=20=EC=B6=94?= =?UTF-8?q?=ED=9B=84=20=EB=B9=84=EA=B5=90=20=EC=98=88=EC=A0=95=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BDx)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 22 +++++++++++++++++-- .../{Start.java => BaseballGame.java} | 0 2 files changed, 20 insertions(+), 2 deletions(-) rename src/main/java/baseball/{Start.java => BaseballGame.java} (100%) diff --git a/docs/README.md b/docs/README.md index 2d73507..cdd5615 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ ## GameHost 클래스 ### 기능 -- `start()` : 게임 시작 문구를 출력합니다 +- `baseballGame()` : 게임 시작 문구를 출력합니다 - `end()` : 3스트라이크 시 게임 종료 문구를 출력합니다 - `askRestart()` : 1입력시 종료, 2 입력 시 재시작을 합니다 @@ -31,7 +31,7 @@ - `guess : List ` - `correct : List ` -## Start 클래스 +## BaseballGame 클래스 ### 기능 - `runGame()` : 게임을 진행합니다 @@ -45,3 +45,21 @@ ### 기능 - `checkInputLength` : player 입력 숫자가 3자리에 대한 예외사항 +## 리팩토링에 대한 피드백 내용 +- 현재 마크다운 문서는 클래스 중심으로 되어 있음 -> 앞으로는 객체중심으로 작성 +- 클래스와 객체 대한 이해와 공부가 필요함 +- 연관 관계가 과함 +- 필드에 대해서 초기화를 할 때 생성자를 만들어서 초기화 해도 된다 +ex) ``` public AiPlayer(BallCounting ballCounting) { + this.ballCounting = ballCounting; + } ``` +-> ``` public AiPlayer() { + this.ballCounting = new BallCuonting(); + }``` +- 클래스 명은 동사X, 명사 (Play 클래스 = 동사임) +- 메서드명을 좀 더 명확하게! +ex) `GameHost`에서 메서드명 `start` -> `printStart`, `end` -> `printEnd`, +`AiPlayer`에서 `correct`-> `pickRandomNumber` +- `Setter`는 최대한 사용x +- static 메서드에 대해서 공부해보고 `BallCounting` 클래스에서 활용 + 필드 선언이 필요x +- 객체 다이어그램을 그리고 시작하는것도 좋음 diff --git a/src/main/java/baseball/Start.java b/src/main/java/baseball/BaseballGame.java similarity index 100% rename from src/main/java/baseball/Start.java rename to src/main/java/baseball/BaseballGame.java From 6384bd3e6f18a82f1892b7591c1a03aadcf96786 Mon Sep 17 00:00:00 2001 From: paka Date: Sun, 29 Jun 2025 22:33:41 +0900 Subject: [PATCH 6/6] no message --- src/main/java/baseball/{BaseballGame.java => Start.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/baseball/{BaseballGame.java => Start.java} (100%) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/Start.java similarity index 100% rename from src/main/java/baseball/BaseballGame.java rename to src/main/java/baseball/Start.java