From f491808d47d0570970e434894331e84810bd5012 Mon Sep 17 00:00:00 2001 From: yenawee Date: Fri, 24 Mar 2023 15:24:53 +0900 Subject: [PATCH 01/71] =?UTF-8?q?refactor=20:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=20(State)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/controller/ChessController.java | 10 +++++----- src/main/java/chess/controller/Command.java | 2 +- .../controller/{status => state}/CommandType.java | 2 +- .../java/chess/controller/{status => state}/End.java | 6 +++--- .../java/chess/controller/{status => state}/Move.java | 8 ++++---- .../java/chess/controller/{status => state}/Start.java | 6 +++--- src/main/java/chess/controller/state/State.java | 9 +++++++++ src/main/java/chess/controller/status/Status.java | 9 --------- src/main/java/chess/domain/board/ChessBoard.java | 1 - src/main/java/chess/view/OutputView.java | 2 +- .../chess/controller/{status => state}/EndTest.java | 2 +- .../chess/controller/{status => state}/MoveTest.java | 6 +++--- .../chess/controller/{status => state}/StartTest.java | 6 +++--- 13 files changed, 34 insertions(+), 35 deletions(-) rename src/main/java/chess/controller/{status => state}/CommandType.java (60%) rename src/main/java/chess/controller/{status => state}/End.java (60%) rename src/main/java/chess/controller/{status => state}/Move.java (89%) rename src/main/java/chess/controller/{status => state}/Start.java (81%) create mode 100644 src/main/java/chess/controller/state/State.java delete mode 100644 src/main/java/chess/controller/status/Status.java rename src/test/java/chess/controller/{status => state}/EndTest.java (97%) rename src/test/java/chess/controller/{status => state}/MoveTest.java (95%) rename src/test/java/chess/controller/{status => state}/StartTest.java (93%) diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index c3b2115e7f5..6a7b72f1052 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -1,7 +1,7 @@ package chess.controller; -import chess.controller.status.Start; -import chess.controller.status.Status; +import chess.controller.state.Start; +import chess.controller.state.State; import chess.domain.chess.ChessGame; import chess.domain.piece.Piece; import chess.domain.position.Position; @@ -24,15 +24,15 @@ public void run() { }); } - private void play(final ChessGame chessGame, Consumer consumer) { - Status gameStatus = new Start(chessGame); + private void play(final ChessGame chessGame, Consumer consumer) { + State gameStatus = new Start(chessGame); while (gameStatus.isRun()) { gameStatus = getStatus(gameStatus); consumer.accept(gameStatus); } } - private Status getStatus(Status gameStatus) { + private State getStatus(State gameStatus) { try { List commands = InputView.getCommand(); final Command command = Command.findCommand(commands); diff --git a/src/main/java/chess/controller/Command.java b/src/main/java/chess/controller/Command.java index b7bcf89cbc7..8f0d228e055 100644 --- a/src/main/java/chess/controller/Command.java +++ b/src/main/java/chess/controller/Command.java @@ -1,6 +1,6 @@ package chess.controller; -import chess.controller.status.CommandType; +import chess.controller.state.CommandType; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/chess/controller/status/CommandType.java b/src/main/java/chess/controller/state/CommandType.java similarity index 60% rename from src/main/java/chess/controller/status/CommandType.java rename to src/main/java/chess/controller/state/CommandType.java index 20749ace7ae..65dcc25d6c2 100644 --- a/src/main/java/chess/controller/status/CommandType.java +++ b/src/main/java/chess/controller/state/CommandType.java @@ -1,4 +1,4 @@ -package chess.controller.status; +package chess.controller.state; public enum CommandType { START, MOVE, END diff --git a/src/main/java/chess/controller/status/End.java b/src/main/java/chess/controller/state/End.java similarity index 60% rename from src/main/java/chess/controller/status/End.java rename to src/main/java/chess/controller/state/End.java index 2a0ba6f7945..7e27ce3446e 100644 --- a/src/main/java/chess/controller/status/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -1,10 +1,10 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; -public final class End implements Status { +public final class End implements State { @Override - public Status checkCommand(final Command command) { + public State checkCommand(final Command command) { throw new IllegalArgumentException("게임이 끝났습니다."); } diff --git a/src/main/java/chess/controller/status/Move.java b/src/main/java/chess/controller/state/Move.java similarity index 89% rename from src/main/java/chess/controller/status/Move.java rename to src/main/java/chess/controller/state/Move.java index 4ba2903c429..e1dad06cc3c 100644 --- a/src/main/java/chess/controller/status/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -1,4 +1,4 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; import chess.domain.chess.ChessGame; @@ -8,7 +8,7 @@ import java.util.List; -public final class Move implements Status { +public final class Move implements State { public static final int SOURCE_INDEX = 1; public static final int TARGET_INDEX = 2; @@ -21,7 +21,7 @@ public Move(final ChessGame chessGame, final TeamColor teamColor) { } @Override - public Status checkCommand(final Command command) { + public State checkCommand(final Command command) { if (command.isStart()) { throw new IllegalArgumentException("이미 시작이 완료되었습니다."); } @@ -32,7 +32,7 @@ public Status checkCommand(final Command command) { return move(command); } - private Status move(final Command command) { + private State move(final Command command) { final List commands = command.getCommands(); final Position source = PositionConverter.convert(commands.get(SOURCE_INDEX)); final Position target = PositionConverter.convert(commands.get(TARGET_INDEX)); diff --git a/src/main/java/chess/controller/status/Start.java b/src/main/java/chess/controller/state/Start.java similarity index 81% rename from src/main/java/chess/controller/status/Start.java rename to src/main/java/chess/controller/state/Start.java index 635af752d87..80604222a44 100644 --- a/src/main/java/chess/controller/status/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -1,10 +1,10 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; import chess.domain.chess.ChessGame; import chess.domain.piece.TeamColor; -public final class Start implements Status { +public final class Start implements State { private final ChessGame chessGame; @@ -13,7 +13,7 @@ public Start(final ChessGame chessGame) { } @Override - public Status checkCommand(final Command command) { + public State checkCommand(final Command command) { if (command.isEnd()) { return new End(); } diff --git a/src/main/java/chess/controller/state/State.java b/src/main/java/chess/controller/state/State.java new file mode 100644 index 00000000000..dc7945bb564 --- /dev/null +++ b/src/main/java/chess/controller/state/State.java @@ -0,0 +1,9 @@ +package chess.controller.state; + +import chess.controller.Command; + +public interface State { + State checkCommand(final Command command); + + boolean isRun(); +} diff --git a/src/main/java/chess/controller/status/Status.java b/src/main/java/chess/controller/status/Status.java deleted file mode 100644 index 72773ffb554..00000000000 --- a/src/main/java/chess/controller/status/Status.java +++ /dev/null @@ -1,9 +0,0 @@ -package chess.controller.status; - -import chess.controller.Command; - -public interface Status { - Status checkCommand(final Command command); - - boolean isRun(); -} diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index d10aa36a630..f604beeec79 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -58,7 +58,6 @@ private boolean isObstructed(final Position target, final Position unitPosition, return isObstructed(target, unitPosition, currentPosition); } - public Map getBoard() { return Map.copyOf(board); } diff --git a/src/main/java/chess/view/OutputView.java b/src/main/java/chess/view/OutputView.java index fb0321c71aa..a8fdc85834c 100644 --- a/src/main/java/chess/view/OutputView.java +++ b/src/main/java/chess/view/OutputView.java @@ -1,6 +1,6 @@ package chess.view; -import static chess.controller.status.CommandType.*; +import static chess.controller.state.CommandType.*; public final class OutputView { diff --git a/src/test/java/chess/controller/status/EndTest.java b/src/test/java/chess/controller/state/EndTest.java similarity index 97% rename from src/test/java/chess/controller/status/EndTest.java rename to src/test/java/chess/controller/state/EndTest.java index b782e1cd8e2..12aa030de62 100644 --- a/src/test/java/chess/controller/status/EndTest.java +++ b/src/test/java/chess/controller/state/EndTest.java @@ -1,4 +1,4 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/chess/controller/status/MoveTest.java b/src/test/java/chess/controller/state/MoveTest.java similarity index 95% rename from src/test/java/chess/controller/status/MoveTest.java rename to src/test/java/chess/controller/state/MoveTest.java index 0a1db15bb9a..bf5d3c360d3 100644 --- a/src/test/java/chess/controller/status/MoveTest.java +++ b/src/test/java/chess/controller/state/MoveTest.java @@ -1,4 +1,4 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; import chess.domain.chess.ChessGame; @@ -37,10 +37,10 @@ void checkCommandEnd() { final Command command = new Command(CommandType.END, List.of("end")); // when - Status status = move.checkCommand(command); + State state = move.checkCommand(command); // then - assertThat(status) + assertThat(state) .isInstanceOf(End.class); } diff --git a/src/test/java/chess/controller/status/StartTest.java b/src/test/java/chess/controller/state/StartTest.java similarity index 93% rename from src/test/java/chess/controller/status/StartTest.java rename to src/test/java/chess/controller/state/StartTest.java index 0dab071bf68..cae1f85c958 100644 --- a/src/test/java/chess/controller/status/StartTest.java +++ b/src/test/java/chess/controller/state/StartTest.java @@ -1,4 +1,4 @@ -package chess.controller.status; +package chess.controller.state; import chess.controller.Command; import chess.domain.chess.ChessGame; @@ -33,10 +33,10 @@ void checkCommand() { final Command command = new Command(CommandType.END, List.of("end")); // when - Status status = start.checkCommand(command); + State state = start.checkCommand(command); // then - assertThat(status) + assertThat(state) .isInstanceOf(End.class); } From 4d5a5d749c689bdffe0562d1a37ffeed42fc1664 Mon Sep 17 00:00:00 2001 From: yenawee Date: Fri, 24 Mar 2023 17:07:09 +0900 Subject: [PATCH 02/71] =?UTF-8?q?docs=20:=202=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df3c4a89958..356ceee9579 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,18 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) + +## ✔ 2단계 기능 요구사항 +- [ ] King 이 잡혔을 때 게임 종료 +- [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 + - [ ] commandType 에 status 추가 +- [ ] 점수 계산 + - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 + + + + ## 1단계 피드백 사항 및 추가 수정 사항 - [x] 출력 시 View 와 Domain 의존성 제거 - DTO 도입 - [x] 매직 넘버 상수화 @@ -14,7 +26,7 @@ - [x] 예외 발생 시 재입력 -## ✔ 기능 요구사항 +## ✔ 1단계 기능 요구사항 ### ChessBoard From 6736e0ce7d02a4dc410b19821b15c833dbfe3e4b Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 16:37:04 +0900 Subject: [PATCH 03/71] =?UTF-8?q?feat=20:=20Command=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=97=90=20Status=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/Command.java | 6 ++- .../chess/controller/state/CommandType.java | 2 +- .../java/chess/controller/state/Move.java | 3 ++ .../java/chess/controller/state/Status.java | 42 +++++++++++++++++++ src/main/java/chess/domain/Score.java | 2 + 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/main/java/chess/controller/state/Status.java create mode 100644 src/main/java/chess/domain/Score.java diff --git a/README.md b/README.md index 356ceee9579..8e2700a2774 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## ✔ 2단계 기능 요구사항 - [ ] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - - [ ] commandType 에 status 추가 + - [x] commandType 에 status 추가 - [ ] 점수 계산 - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 diff --git a/src/main/java/chess/controller/Command.java b/src/main/java/chess/controller/Command.java index 8f0d228e055..a6fa325cdc6 100644 --- a/src/main/java/chess/controller/Command.java +++ b/src/main/java/chess/controller/Command.java @@ -9,7 +9,7 @@ public final class Command { public static final int COMMAND_INDEX = 0; public static final int MOVE_COMMAND_SIZE = 3; private static final String COMMAND_ERROR_MESSAGE = "잘못된 명령어 입력입니다."; - + private final CommandType type; private final List commands; @@ -38,6 +38,10 @@ public boolean isEnd() { return type == CommandType.END; } + public boolean isStatus() { + return type == CommandType.STATUS; + } + public boolean isCorrectWhenMove() { return commands.size() == MOVE_COMMAND_SIZE; } diff --git a/src/main/java/chess/controller/state/CommandType.java b/src/main/java/chess/controller/state/CommandType.java index 65dcc25d6c2..887643a3d96 100644 --- a/src/main/java/chess/controller/state/CommandType.java +++ b/src/main/java/chess/controller/state/CommandType.java @@ -1,5 +1,5 @@ package chess.controller.state; public enum CommandType { - START, MOVE, END + START, MOVE, END, STATUS } diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index e1dad06cc3c..092e496ca0d 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -28,6 +28,9 @@ public State checkCommand(final Command command) { if (command.isEnd()) { return new End(); } + if (command.isStatus()) { + return Status.of(chessGame, teamColor); + } validateCommand(command); return move(command); } diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java new file mode 100644 index 00000000000..f81c3e2ca64 --- /dev/null +++ b/src/main/java/chess/controller/state/Status.java @@ -0,0 +1,42 @@ +package chess.controller.state; + +import chess.controller.Command; +import chess.domain.Score; +import chess.domain.chess.ChessGame; +import chess.domain.piece.TeamColor; + +public class Status implements State { + private final ChessGame chessGame; + private final TeamColor teamColor; + + private Status(ChessGame chessGame, TeamColor teamColor) { + this.chessGame = chessGame; + this.teamColor = teamColor; + } + + public static State of(ChessGame chessGame, TeamColor teamColor) { + Score score = new Score(); + System.out.println("status"); + return new Status(chessGame, teamColor); + } + + @Override + public State checkCommand(Command command) { + if (command.isEnd()) { + return new End(); + } + if (command.isMove()) { + Move move = new Move(chessGame, teamColor); + return move.checkCommand(command); + } + if (command.isStatus()) { + return Status.of(chessGame, teamColor); + } + throw new UnsupportedOperationException("end, move 명령어만 입력 가능합니다."); + } + + @Override + public boolean isRun() { + return true; + } +} diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/Score.java new file mode 100644 index 00000000000..a8981266fd5 --- /dev/null +++ b/src/main/java/chess/domain/Score.java @@ -0,0 +1,2 @@ +package chess.domain;public class Score { +} From 9811eb552457ebf08ab4947a29ddcb6b845e1d25 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 17:56:54 +0900 Subject: [PATCH 04/71] =?UTF-8?q?feat=20:=20King=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=94=EC=9D=84=20=EB=95=8C=20=EA=B2=8C=EC=9E=84=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/state/End.java | 8 ++++++++ src/main/java/chess/controller/state/Move.java | 7 +++++-- src/main/java/chess/controller/state/Start.java | 11 +++-------- src/main/java/chess/controller/state/Status.java | 8 ++++---- src/main/java/chess/domain/Player.java | 2 ++ src/main/java/chess/domain/board/ChessBoard.java | 7 +++++++ src/main/java/chess/domain/chess/ChessGame.java | 4 ++++ src/main/java/chess/domain/piece/King.java | 5 +++++ src/main/java/chess/domain/piece/Piece.java | 4 ++++ 10 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 src/main/java/chess/domain/Player.java diff --git a/README.md b/README.md index 8e2700a2774..9a06ecb033f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## ✔ 2단계 기능 요구사항 -- [ ] King 이 잡혔을 때 게임 종료 +- [x] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 - [ ] 점수 계산 diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 7e27ce3446e..31b96259df1 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -1,6 +1,8 @@ package chess.controller.state; import chess.controller.Command; +import chess.domain.Score; +import chess.domain.chess.ChessGame; public final class End implements State { @Override @@ -12,4 +14,10 @@ public State checkCommand(final Command command) { public boolean isRun() { return false; } + + public State run(ChessGame chessGame) { + Score score = new Score(); + System.out.println("status"); + return new End(); + } } diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index 092e496ca0d..6ea5d249e6c 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -26,10 +26,10 @@ public State checkCommand(final Command command) { throw new IllegalArgumentException("이미 시작이 완료되었습니다."); } if (command.isEnd()) { - return new End(); + return new End().run(chessGame); } if (command.isStatus()) { - return Status.of(chessGame, teamColor); + return new Status(chessGame, teamColor).run(); } validateCommand(command); return move(command); @@ -40,6 +40,9 @@ private State move(final Command command) { final Position source = PositionConverter.convert(commands.get(SOURCE_INDEX)); final Position target = PositionConverter.convert(commands.get(TARGET_INDEX)); chessGame.setUp(source, target, teamColor); + if (chessGame.isEnd()) { + return new End().run(chessGame); + } return new Move(chessGame, teamColor.changeTurn()); } diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 80604222a44..1c63848c459 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -14,15 +14,10 @@ public Start(final ChessGame chessGame) { @Override public State checkCommand(final Command command) { - if (command.isEnd()) { - return new End(); + if (command.isStart()) { + return new Move(chessGame, TeamColor.WHITE); } - - if (command.isMove()) { - throw new IllegalArgumentException("게임이 시작되지 않았습니다."); - } - - return new Move(chessGame, TeamColor.WHITE); + throw new IllegalArgumentException("게임이 시작되지 않았습니다."); } @Override diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index f81c3e2ca64..690700ebd2b 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -9,12 +9,12 @@ public class Status implements State { private final ChessGame chessGame; private final TeamColor teamColor; - private Status(ChessGame chessGame, TeamColor teamColor) { + public Status(ChessGame chessGame, TeamColor teamColor) { this.chessGame = chessGame; this.teamColor = teamColor; } - public static State of(ChessGame chessGame, TeamColor teamColor) { + State run() { Score score = new Score(); System.out.println("status"); return new Status(chessGame, teamColor); @@ -23,14 +23,14 @@ public static State of(ChessGame chessGame, TeamColor teamColor) { @Override public State checkCommand(Command command) { if (command.isEnd()) { - return new End(); + return new End().run(chessGame); } if (command.isMove()) { Move move = new Move(chessGame, teamColor); return move.checkCommand(command); } if (command.isStatus()) { - return Status.of(chessGame, teamColor); + return run(); } throw new UnsupportedOperationException("end, move 명령어만 입력 가능합니다."); } diff --git a/src/main/java/chess/domain/Player.java b/src/main/java/chess/domain/Player.java new file mode 100644 index 00000000000..b057e741f05 --- /dev/null +++ b/src/main/java/chess/domain/Player.java @@ -0,0 +1,2 @@ +package chess.domain;public class Player { +} diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index f604beeec79..9d1a474fa36 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -8,6 +8,7 @@ import java.util.Map; public final class ChessBoard { + public static final int INITIAL_KING_COUNT = 2; private final Map board; private ChessBoard(final Map board) { @@ -61,4 +62,10 @@ private boolean isObstructed(final Position target, final Position unitPosition, public Map getBoard() { return Map.copyOf(board); } + + public boolean checkKingDie() { + return board.values().stream() + .filter(piece -> piece.isKing()) + .count() != INITIAL_KING_COUNT; + } } diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/chess/ChessGame.java index 06315b978a1..52ec9322796 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/chess/ChessGame.java @@ -47,4 +47,8 @@ private void movePiece(final Position source, final Position target, final Piece public Map getChessBoard() { return chessBoard.getBoard(); } + + public boolean isEnd() { + return chessBoard.checkKingDie(); + } } diff --git a/src/main/java/chess/domain/piece/King.java b/src/main/java/chess/domain/piece/King.java index eceb180f8f1..16187a60df8 100644 --- a/src/main/java/chess/domain/piece/King.java +++ b/src/main/java/chess/domain/piece/King.java @@ -16,4 +16,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getAllDirections(), KING_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public boolean isKing() { + return true; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index b7496aa462e..fe328bf0f0f 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -23,6 +23,10 @@ public PieceType getPieceType() { return pieceType; } + public boolean isKing() { + return false; + } + @Override public boolean equals(final Object o) { if (this == o) return true; From 35a81cd57c7fd7f491d94f3cd7ee8cae7491dce1 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 18:08:59 +0900 Subject: [PATCH 05/71] =?UTF-8?q?feat=20:=20=EA=B8=B0=EB=AC=BC=EB=B3=84=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/Bishop.java | 1 + src/main/java/chess/domain/piece/Knight.java | 2 ++ src/main/java/chess/domain/piece/Pawn.java | 2 ++ src/main/java/chess/domain/piece/Queen.java | 1 + src/main/java/chess/domain/piece/Rook.java | 1 + 5 files changed, 7 insertions(+) diff --git a/src/main/java/chess/domain/piece/Bishop.java b/src/main/java/chess/domain/piece/Bishop.java index df7a69363bb..67f49f23916 100644 --- a/src/main/java/chess/domain/piece/Bishop.java +++ b/src/main/java/chess/domain/piece/Bishop.java @@ -5,6 +5,7 @@ public class Bishop extends Piece { private static final int BISHOP_MAX_MOVE_COUNT = 8; + private static final Double VALUE = 3.0; public Bishop(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Knight.java b/src/main/java/chess/domain/piece/Knight.java index d6d21eddb9c..047a0adc6c0 100644 --- a/src/main/java/chess/domain/piece/Knight.java +++ b/src/main/java/chess/domain/piece/Knight.java @@ -3,6 +3,8 @@ import chess.domain.position.Position; public class Knight extends Piece { + private static final Double VALUE = 2.5; + public Knight(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index f8dec186878..0b8f06ac4b6 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -5,6 +5,8 @@ public abstract class Pawn extends Piece { protected static final int PAWN_MAX_MOVE_COUNT = 1; protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; + private static final Double VALUE = 1.0; + private static final Double VALUE_SAME_FILE = 0.5; Pawn(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Queen.java b/src/main/java/chess/domain/piece/Queen.java index 111a6ff476b..8541a8189ba 100644 --- a/src/main/java/chess/domain/piece/Queen.java +++ b/src/main/java/chess/domain/piece/Queen.java @@ -5,6 +5,7 @@ public class Queen extends Piece { private static final int QUEEN_MAX_MOVE_COUNT = 8; + private static final Double VALUE = 9.0; public Queen(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Rook.java b/src/main/java/chess/domain/piece/Rook.java index ca629d06fd1..86dd94b1ccd 100644 --- a/src/main/java/chess/domain/piece/Rook.java +++ b/src/main/java/chess/domain/piece/Rook.java @@ -5,6 +5,7 @@ public class Rook extends Piece { private static final int ROOK_MAX_MOVE_COUNT = 8; + private static final Double Value = 5.0; public Rook(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); From e00d95edaeec4bf578d961319d76bf4ccfc1659e Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:06:38 +0900 Subject: [PATCH 06/71] =?UTF-8?q?feat=20:=20=EC=A0=90=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++-- src/main/java/chess/controller/ScoreDto.java | 2 + src/main/java/chess/domain/Player.java | 2 - src/main/java/chess/domain/Score.java | 57 ++++++++++++++++- src/main/java/chess/domain/piece/Bishop.java | 5 ++ src/main/java/chess/domain/piece/King.java | 6 ++ src/main/java/chess/domain/piece/Knight.java | 5 ++ src/main/java/chess/domain/piece/Pawn.java | 18 ++++++ src/main/java/chess/domain/piece/Piece.java | 6 ++ src/main/java/chess/domain/piece/Queen.java | 5 ++ src/main/java/chess/domain/piece/Rook.java | 7 ++- src/test/java/chess/domain/ScoreTest.java | 65 ++++++++++++++++++++ 12 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 src/main/java/chess/controller/ScoreDto.java delete mode 100644 src/main/java/chess/domain/Player.java create mode 100644 src/test/java/chess/domain/ScoreTest.java diff --git a/README.md b/README.md index 9a06ecb033f..1f0e8d78a2c 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,13 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) -## ✔ 2단계 기능 요구사항 +## ✔ 3단계 기능 요구사항 - [x] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 -- [ ] 점수 계산 - - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 - - +- [x] 점수 계산 + - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 ## 1단계 피드백 사항 및 추가 수정 사항 @@ -26,7 +24,7 @@ - [x] 예외 발생 시 재입력 -## ✔ 1단계 기능 요구사항 +## ✔ 1, 2단계 기능 요구사항 ### ChessBoard diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java new file mode 100644 index 00000000000..1977c763948 --- /dev/null +++ b/src/main/java/chess/controller/ScoreDto.java @@ -0,0 +1,2 @@ +package chess.controller;public class ScoreDto { +} diff --git a/src/main/java/chess/domain/Player.java b/src/main/java/chess/domain/Player.java deleted file mode 100644 index b057e741f05..00000000000 --- a/src/main/java/chess/domain/Player.java +++ /dev/null @@ -1,2 +0,0 @@ -package chess.domain;public class Player { -} diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/Score.java index a8981266fd5..57d8fe83163 100644 --- a/src/main/java/chess/domain/Score.java +++ b/src/main/java/chess/domain/Score.java @@ -1,2 +1,57 @@ -package chess.domain;public class Score { +package chess.domain; + +import chess.domain.piece.Pawn; +import chess.domain.piece.Piece; +import chess.domain.piece.TeamColor; +import chess.domain.position.Position; + +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Score { + private final Map score; + + private Score(Map score) { + this.score = score; + } + + public static Score calculate(Map board) { + Map score = Arrays.stream(TeamColor.values()) + .collect(Collectors.toMap(Function.identity(), + color -> sumScoreExceptPawn(color, board) + sumScorePawn(color, board))); + return new Score(score); + } + + private static Double sumScoreExceptPawn(TeamColor color, Map board) { + return board.values() + .stream() + .filter(piece -> piece.isSameTeam(color)) + .filter(piece -> !piece.isPawn()) + .mapToDouble(Piece::getValue) + .sum(); + } + + private static Double sumScorePawn(TeamColor color, Map board) { + return IntStream.range(0, 8) + .map(file -> countPawnByEachFile(file, color, board)) + .mapToDouble(Pawn::calculateScore) + .sum(); + } + + private static int countPawnByEachFile(int file, TeamColor color, Map board) { + return (int) IntStream.range(0, 8) + .mapToObj(rank -> board.get(Position.of(rank, file))) + .filter(piece -> !Objects.isNull(piece)) + .filter(Piece::isPawn) + .filter(piece -> piece.isSameTeam(color)) + .count(); + } + + public Double getScore(TeamColor teamColor) { + return score.get(teamColor); + } } diff --git a/src/main/java/chess/domain/piece/Bishop.java b/src/main/java/chess/domain/piece/Bishop.java index 67f49f23916..afbe7ba9267 100644 --- a/src/main/java/chess/domain/piece/Bishop.java +++ b/src/main/java/chess/domain/piece/Bishop.java @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getDiagonalDirections(), BISHOP_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/King.java b/src/main/java/chess/domain/piece/King.java index 16187a60df8..f0ceee12069 100644 --- a/src/main/java/chess/domain/piece/King.java +++ b/src/main/java/chess/domain/piece/King.java @@ -5,6 +5,7 @@ public class King extends Piece { private static final int KING_MAX_MOVE_COUNT = 1; + private static final Double VALUE = 0.0; public King(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -21,4 +22,9 @@ public boolean canMove(final Position source, final Position target, final Piece public boolean isKing() { return true; } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Knight.java b/src/main/java/chess/domain/piece/Knight.java index 047a0adc6c0..4e57bd926d7 100644 --- a/src/main/java/chess/domain/piece/Knight.java +++ b/src/main/java/chess/domain/piece/Knight.java @@ -15,4 +15,9 @@ public boolean canMove(final Position source, final Position target, final Piece final int fileGap = target.getFile() - source.getFile(); return Math.abs(rankGap * fileGap) == 2; } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index 0b8f06ac4b6..a69d51e455f 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -7,10 +7,28 @@ public abstract class Pawn extends Piece { protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; private static final Double VALUE = 1.0; private static final Double VALUE_SAME_FILE = 0.5; + private static final int PAWN_COUNT_CRITERION_FOR_SCORING = 1; Pawn(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); } abstract boolean canAttack(Position source, Position target, Piece piece); + + public static Double calculateScore(int count) { + if (count == PAWN_COUNT_CRITERION_FOR_SCORING) { + return VALUE; + } + return VALUE_SAME_FILE * count; + } + + @Override + public boolean isPawn() { + return true; + } + + @Override + public Double getValue() { + return null; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index fe328bf0f0f..f08b7affe9d 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -27,6 +27,12 @@ public boolean isKing() { return false; } + public boolean isPawn() { + return false; + } + + public abstract Double getValue(); + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/main/java/chess/domain/piece/Queen.java b/src/main/java/chess/domain/piece/Queen.java index 8541a8189ba..65c9d5bd2ba 100644 --- a/src/main/java/chess/domain/piece/Queen.java +++ b/src/main/java/chess/domain/piece/Queen.java @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getAllDirections(), QUEEN_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Rook.java b/src/main/java/chess/domain/piece/Rook.java index 86dd94b1ccd..23b5e24df5c 100644 --- a/src/main/java/chess/domain/piece/Rook.java +++ b/src/main/java/chess/domain/piece/Rook.java @@ -5,7 +5,7 @@ public class Rook extends Piece { private static final int ROOK_MAX_MOVE_COUNT = 8; - private static final Double Value = 5.0; + private static final Double VALUE = 5.0; public Rook(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getFourDirections(), ROOK_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/test/java/chess/domain/ScoreTest.java b/src/test/java/chess/domain/ScoreTest.java new file mode 100644 index 00000000000..009b5a1ade2 --- /dev/null +++ b/src/test/java/chess/domain/ScoreTest.java @@ -0,0 +1,65 @@ +package chess.domain; + +import chess.domain.piece.*; +import chess.domain.position.Position; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class ScoreTest { + @DisplayName("Pawn 이 한 File 에 하나 있으면 1점으로 계산된다") + @Test + void onePawninFile() { + Map board = new HashMap<>(); + board.put(Position.of(0, 1), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(0, 2), new BlackPawn(PieceType.PAWN)); + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(2.0); + } + + @DisplayName("Pawn 이 한 File 에 두개 이상 있으면 각각 0.5점으로 계산된다.") + @Test + void TwoPawninSameFile() { + Map board = new HashMap<>(); + board.put(Position.of(0, 1), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(1, 1), new BlackPawn(PieceType.PAWN)); + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(1.0); + } + + @DisplayName("Queen, Rook, Bishop, Knight 점수 계산 테스트(Pawn 제외)") + @Test + void allPieceExceptPawn() { + Map board = new HashMap<>(); + board.put(Position.of(1, 1), new Queen(PieceType.QUEEN, TeamColor.BLACK)); + board.put(Position.of(3, 4), new Rook(PieceType.ROOK, TeamColor.BLACK)); + board.put(Position.of(2, 6), new Bishop(PieceType.BISHOP, TeamColor.BLACK)); + board.put(Position.of(7, 7), new Knight(PieceType.KNIGHT, TeamColor.BLACK)); + + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(19.5); + } + + @DisplayName("Queen, Rook, Bishop, Knight 점수 계산 테스트(같은 File 에 Pawn 2개 있을 때)") + @Test + void allPieceWithTwoPawnInSameFile() { + Map board = new HashMap<>(); + board.put(Position.of(1, 1), new Queen(PieceType.QUEEN, TeamColor.BLACK)); + board.put(Position.of(3, 4), new Rook(PieceType.ROOK, TeamColor.BLACK)); + board.put(Position.of(2, 6), new Bishop(PieceType.BISHOP, TeamColor.BLACK)); + board.put(Position.of(7, 7), new Knight(PieceType.KNIGHT, TeamColor.BLACK)); + board.put(Position.of(5, 5), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(4, 5), new BlackPawn(PieceType.PAWN)); + + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(20.5); + } +} From a8083173a11c828bdf04cc34fb9c4db7fce634d3 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:07:04 +0900 Subject: [PATCH 07/71] =?UTF-8?q?feat=20:=20status=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=90=EC=88=98=20=EB=B0=8F=20=EC=96=B4=EB=8A=90?= =?UTF-8?q?=20=EC=A7=84=EC=98=81=EC=9D=B4=20=EC=9D=B4=EA=B2=BC=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 --- README.md | 2 +- src/main/java/chess/controller/ScoreDto.java | 32 ++++++++++++++++++- src/main/java/chess/controller/state/End.java | 6 ++-- .../java/chess/controller/state/Status.java | 6 ++-- src/main/java/chess/view/OutputView.java | 8 +++++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1f0e8d78a2c..ebd6a85cbbe 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## ✔ 3단계 기능 요구사항 - [x] King 이 잡혔을 때 게임 종료 -- [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 +- [x] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 - [x] 점수 계산 - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index 1977c763948..6bd656862fb 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -1,2 +1,32 @@ -package chess.controller;public class ScoreDto { +package chess.controller; + +import chess.domain.Score; +import chess.domain.piece.TeamColor; + +public class ScoreDto { + private final Double whiteScore; + private final Double blackScore; + + public ScoreDto(Score score) { + whiteScore = score.getScore(TeamColor.WHITE); + blackScore = score.getScore(TeamColor.BLACK); + } + + public Double getWhiteScore() { + return whiteScore; + } + + public Double getBlackScore() { + return blackScore; + } + + public String getWinner() { + if (whiteScore == blackScore) { + return "무승부"; + } + if (whiteScore > blackScore) { + return "White"; + } + return "Black"; + } } diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 31b96259df1..b08358837f2 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -1,8 +1,10 @@ package chess.controller.state; import chess.controller.Command; +import chess.controller.ScoreDto; import chess.domain.Score; import chess.domain.chess.ChessGame; +import chess.view.OutputView; public final class End implements State { @Override @@ -16,8 +18,8 @@ public boolean isRun() { } public State run(ChessGame chessGame) { - Score score = new Score(); - System.out.println("status"); + Score score = Score.calculate(chessGame.getChessBoard()); + OutputView.printStatus(new ScoreDto(score)); return new End(); } } diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index 690700ebd2b..8ddffcd828a 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -1,9 +1,11 @@ package chess.controller.state; import chess.controller.Command; +import chess.controller.ScoreDto; import chess.domain.Score; import chess.domain.chess.ChessGame; import chess.domain.piece.TeamColor; +import chess.view.OutputView; public class Status implements State { private final ChessGame chessGame; @@ -15,8 +17,8 @@ public Status(ChessGame chessGame, TeamColor teamColor) { } State run() { - Score score = new Score(); - System.out.println("status"); + Score score = Score.calculate(chessGame.getChessBoard()); + OutputView.printStatus(new ScoreDto(score)); return new Status(chessGame, teamColor); } diff --git a/src/main/java/chess/view/OutputView.java b/src/main/java/chess/view/OutputView.java index a8fdc85834c..1d55c5b67be 100644 --- a/src/main/java/chess/view/OutputView.java +++ b/src/main/java/chess/view/OutputView.java @@ -1,5 +1,7 @@ package chess.view; +import chess.controller.ScoreDto; + import static chess.controller.state.CommandType.*; public final class OutputView { @@ -17,4 +19,10 @@ public static void printStartMessage() { print(String.format(START_MESSAGE, START.name().toLowerCase(), END.name().toLowerCase(), MOVE.name().toLowerCase())); } + + public static void printStatus(ScoreDto scoreDto) { + print(String.format("Black : %f, White : %f\n우승팀 : %s", + scoreDto.getBlackScore(), scoreDto.getWhiteScore(), scoreDto.getWinner())); + System.out.println(System.lineSeparator()); + } } From 0dd3b82539e4ce3f30a0d8634a3d069b0385409c Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:14:00 +0900 Subject: [PATCH 08/71] =?UTF-8?q?feat=20:=20Camp=20->=20TeamColor=20?= =?UTF-8?q?=EB=A1=9C=20=EC=95=88=EB=B0=94=EB=80=90=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B0=8F=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/ScoreDto.java | 2 +- .../java/chess/controller/state/Start.java | 3 +++ .../java/chess/domain/chess/ChessGame.java | 4 ++-- src/main/java/chess/domain/piece/Pawn.java | 4 ++-- src/main/java/chess/domain/piece/Piece.java | 4 ---- .../java/chess/domain/piece/CampTypeTest.java | 2 +- .../java/chess/domain/piece/PieceTest.java | 22 ++----------------- 8 files changed, 12 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index ebd6a85cbbe..b6758441536 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ - [x] 체스 게임을 진행한다. -### CampType +### TeamColor - [x] 사용자의 진영을 관리한다. - [x] 입력받은 위치의 열이 소문자면 WHITE, 대문자면 BLACK 진영으로 나눈다. diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index 6bd656862fb..ec965177489 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -21,7 +21,7 @@ public Double getBlackScore() { } public String getWinner() { - if (whiteScore == blackScore) { + if (whiteScore.equals(blackScore)) { return "무승부"; } if (whiteScore > blackScore) { diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 1c63848c459..4ebc8e506b4 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -17,6 +17,9 @@ public State checkCommand(final Command command) { if (command.isStart()) { return new Move(chessGame, TeamColor.WHITE); } + if (command.isEnd()) { + return new End(); + } throw new IllegalArgumentException("게임이 시작되지 않았습니다."); } diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/chess/ChessGame.java index 52ec9322796..d428b16140b 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/chess/ChessGame.java @@ -25,7 +25,7 @@ public void play(final Position source, final Position target) { if (piece == null) { throw new IllegalArgumentException("기물이 존재하는 위치를 입력해주세요."); } - validateCamp(piece); + validateTurn(piece); if (!piece.canMove(source, target, chessBoard.getPiece(target)) || !chessBoard.isPossibleRoute(source, target, currentTeamColor)) { throw new IllegalArgumentException("기물 규칙 상 움직일 수 없는 위치입니다."); @@ -33,7 +33,7 @@ public void play(final Position source, final Position target) { movePiece(source, target, piece); } - private void validateCamp(final Piece piece) { + private void validateTurn(final Piece piece) { if (!piece.isSameTeam(currentTeamColor)) { throw new IllegalArgumentException("현재 차례가 아닙니다."); } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index a69d51e455f..a4f17707f60 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -13,8 +13,6 @@ public abstract class Pawn extends Piece { super(pieceType, teamColor); } - abstract boolean canAttack(Position source, Position target, Piece piece); - public static Double calculateScore(int count) { if (count == PAWN_COUNT_CRITERION_FOR_SCORING) { return VALUE; @@ -22,6 +20,8 @@ public static Double calculateScore(int count) { return VALUE_SAME_FILE * count; } + abstract boolean canAttack(Position source, Position target, Piece piece); + @Override public boolean isPawn() { return true; diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index f08b7affe9d..1ea8a351db1 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -11,10 +11,6 @@ public Piece(final PieceType pieceType, final TeamColor teamColor) { this.teamColor = teamColor; } - public boolean compareCamp(final Piece other) { - return teamColor == other.teamColor; - } - public boolean isSameTeam(final TeamColor diffType) { return teamColor == diffType; } diff --git a/src/test/java/chess/domain/piece/CampTypeTest.java b/src/test/java/chess/domain/piece/CampTypeTest.java index 680c25ca8d1..8e914dee7e3 100644 --- a/src/test/java/chess/domain/piece/CampTypeTest.java +++ b/src/test/java/chess/domain/piece/CampTypeTest.java @@ -5,7 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class CampTypeTest { +class TeamColorTest { @ParameterizedTest(name = "입력받은 위치에 따라 진영을 나눈다.") @CsvSource(value = {"a:WHITE", "A:BLACK"}, delimiter = ':') diff --git a/src/test/java/chess/domain/piece/PieceTest.java b/src/test/java/chess/domain/piece/PieceTest.java index 823ecf1a369..e5dd5e915f1 100644 --- a/src/test/java/chess/domain/piece/PieceTest.java +++ b/src/test/java/chess/domain/piece/PieceTest.java @@ -1,8 +1,6 @@ package chess.domain.piece; import chess.domain.position.Position; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; @@ -24,30 +22,14 @@ private static Stream makePosition() { ); } - @Test - @DisplayName("두 개의 체스말이 동일한 진영에 속하는지 판단한다.") - void compareCamp() { - // given - final Piece piece = new WhitePawn(PieceType.PAWN); - final Piece other = new Queen(PieceType.QUEEN, TeamColor.WHITE); - final Piece otherCamp = new King(PieceType.KING, TeamColor.BLACK); - - // when, then - assertThat(piece.compareCamp(other)) - .isTrue(); - - assertThat(piece.compareCamp(otherCamp)) - .isFalse(); - } - @ParameterizedTest(name = "체스말이 입력받은 체스말과 동일한 진영인지 판단한다.") @CsvSource(value = {"WHITE:true", "BLACK:false"}, delimiter = ':') - void isSameCamp(final TeamColor campType, final boolean expected) { + void isSameTeamColor(final TeamColor teamColor, final boolean expected) { // given final Piece piece = new Knight(PieceType.KNIGHT, TeamColor.WHITE); // when, then - assertThat(piece.isSameTeam(campType)) + assertThat(piece.isSameTeam(teamColor)) .isSameAs(expected); } From 0c9985a30bac76f00eeeaf5f97a547b6ad52ea69 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:29:46 +0900 Subject: [PATCH 09/71] =?UTF-8?q?docs=20:=204=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b6758441536..505390c8915 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,36 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) +## ✔ 4단계 기능 요구사항 + +- [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 +- [ ] table + - [ ] piece_type, team_color, rank, file, turn +- [ ] CRUD + - [ ] Create + - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 + - Query : + - [ ] Read + - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - Query : + - [ ] Update + - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 + - Query : + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 + - Query : ## ✔ 3단계 기능 요구사항 + - [x] King 이 잡혔을 때 게임 종료 - [x] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - - [x] commandType 에 status 추가 + - [x] commandType 에 status 추가 - [x] 점수 계산 - - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 - + - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 ## 1단계 피드백 사항 및 추가 수정 사항 + - [x] 출력 시 View 와 Domain 의존성 제거 - DTO 도입 - [x] 매직 넘버 상수화 - [x] 클래스 및 메소드 네이밍 의미있는 표현으로 변경 @@ -23,7 +42,6 @@ - [ ] Readme 에 네이밍 사전, 클래스 다이어그램, 프로그래밍 흐름도 정리하기 - [x] 예외 발생 시 재입력 - ## ✔ 1, 2단계 기능 요구사항 ### ChessBoard From e490901073b5786933c731f28e453484df650cc8 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 23:54:59 +0900 Subject: [PATCH 10/71] =?UTF-8?q?refactor=20:=20package=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=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/chess/controller/ChessController.java | 2 +- src/main/java/chess/controller/ScoreDto.java | 2 +- src/main/java/chess/controller/state/End.java | 4 ++-- src/main/java/chess/controller/state/Move.java | 2 +- src/main/java/chess/controller/state/Start.java | 2 +- src/main/java/chess/controller/state/Status.java | 4 ++-- src/main/java/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/board/ChessBoardFactory.java | 2 +- src/main/java/chess/domain/{chess => game}/ChessGame.java | 2 +- src/main/java/chess/domain/{ => result}/Score.java | 2 +- src/test/java/chess/controller/state/MoveTest.java | 2 +- src/test/java/chess/controller/state/StartTest.java | 2 +- src/test/java/chess/domain/board/ChessBoardTest.java | 2 +- src/test/java/chess/domain/{chess => game}/ChessGameTest.java | 2 +- src/test/java/chess/domain/{ => result}/ScoreTest.java | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/chess/domain/{chess => game}/ChessGame.java (98%) rename src/main/java/chess/domain/{ => result}/Score.java (98%) rename src/test/java/chess/domain/{chess => game}/ChessGameTest.java (98%) rename src/test/java/chess/domain/{ => result}/ScoreTest.java (98%) diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 6a7b72f1052..0cc8ce48d53 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -2,7 +2,7 @@ import chess.controller.state.Start; import chess.controller.state.State; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.position.Position; import chess.view.InputView; diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index ec965177489..aaa77e01e1b 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -1,7 +1,7 @@ package chess.controller; -import chess.domain.Score; import chess.domain.piece.TeamColor; +import chess.domain.result.Score; public class ScoreDto { private final Double whiteScore; diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index b08358837f2..22d0356b315 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -2,8 +2,8 @@ import chess.controller.Command; import chess.controller.ScoreDto; -import chess.domain.Score; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; +import chess.domain.result.Score; import chess.view.OutputView; public final class End implements State { diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index 6ea5d249e6c..c78f60f25ca 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; import chess.domain.position.Position; import chess.domain.position.PositionConverter; diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 4ebc8e506b4..a51872006f0 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; public final class Start implements State { diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index 8ddffcd828a..767703fc38f 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -2,9 +2,9 @@ import chess.controller.Command; import chess.controller.ScoreDto; -import chess.domain.Score; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; +import chess.domain.result.Score; import chess.view.OutputView; public class Status implements State { diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 9d1a474fa36..74827a12437 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.piece.TeamColor; import chess.domain.position.Position; diff --git a/src/main/java/chess/domain/board/ChessBoardFactory.java b/src/main/java/chess/domain/board/ChessBoardFactory.java index 8526f30c60d..c1c4b78872f 100644 --- a/src/main/java/chess/domain/board/ChessBoardFactory.java +++ b/src/main/java/chess/domain/board/ChessBoardFactory.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java similarity index 98% rename from src/main/java/chess/domain/chess/ChessGame.java rename to src/main/java/chess/domain/game/ChessGame.java index d428b16140b..834d6ea38ce 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -1,4 +1,4 @@ -package chess.domain.chess; +package chess.domain.game; import chess.domain.board.ChessBoard; import chess.domain.piece.Piece; diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/result/Score.java similarity index 98% rename from src/main/java/chess/domain/Score.java rename to src/main/java/chess/domain/result/Score.java index 57d8fe83163..38382b735dd 100644 --- a/src/main/java/chess/domain/Score.java +++ b/src/main/java/chess/domain/result/Score.java @@ -1,4 +1,4 @@ -package chess.domain; +package chess.domain.result; import chess.domain.piece.Pawn; import chess.domain.piece.Piece; diff --git a/src/test/java/chess/controller/state/MoveTest.java b/src/test/java/chess/controller/state/MoveTest.java index bf5d3c360d3..53e5d4bf090 100644 --- a/src/test/java/chess/controller/state/MoveTest.java +++ b/src/test/java/chess/controller/state/MoveTest.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/chess/controller/state/StartTest.java b/src/test/java/chess/controller/state/StartTest.java index cae1f85c958..dfdbb82d264 100644 --- a/src/test/java/chess/controller/state/StartTest.java +++ b/src/test/java/chess/controller/state/StartTest.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/chess/domain/board/ChessBoardTest.java b/src/test/java/chess/domain/board/ChessBoardTest.java index 08a8fd5129d..112a5f9b09d 100644 --- a/src/test/java/chess/domain/board/ChessBoardTest.java +++ b/src/test/java/chess/domain/board/ChessBoardTest.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/chess/domain/chess/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java similarity index 98% rename from src/test/java/chess/domain/chess/ChessGameTest.java rename to src/test/java/chess/domain/game/ChessGameTest.java index 21a8ed31ff5..0ca9802cc96 100644 --- a/src/test/java/chess/domain/chess/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -1,4 +1,4 @@ -package chess.domain.chess; +package chess.domain.game; import chess.domain.position.Position; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/chess/domain/ScoreTest.java b/src/test/java/chess/domain/result/ScoreTest.java similarity index 98% rename from src/test/java/chess/domain/ScoreTest.java rename to src/test/java/chess/domain/result/ScoreTest.java index 009b5a1ade2..bf377dd6b04 100644 --- a/src/test/java/chess/domain/ScoreTest.java +++ b/src/test/java/chess/domain/result/ScoreTest.java @@ -1,4 +1,4 @@ -package chess.domain; +package chess.domain.result; import chess.domain.piece.*; import chess.domain.position.Position; From 6e2c09a2ae928f819a75a1229178da29dd065f90 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 00:05:17 +0900 Subject: [PATCH 11/71] =?UTF-8?q?feat=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20ChessBoardFactory=20=EC=BA=90=EC=8B=B1=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0.=20ChessGame=20=EC=9D=84=20=ED=82=A4=EB=A1=9C=20?= =?UTF-8?q?=ED=95=98=EC=97=AC=20ChessBoard=20=EB=A5=BC=20=EC=BA=90?= =?UTF-8?q?=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/chess/domain/board/ChessBoard.java | 11 +++++++++-- .../chess/domain/board/ChessBoardFactory.java | 17 ----------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 74827a12437..f7686589a1d 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -6,9 +6,12 @@ import chess.domain.position.Position; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public final class ChessBoard { public static final int INITIAL_KING_COUNT = 2; + private static final Map CACHE = new ConcurrentHashMap<>(); + private final Map board; private ChessBoard(final Map board) { @@ -16,8 +19,12 @@ private ChessBoard(final Map board) { } public static ChessBoard getInstance(final ChessGame chessGame) { - final Map board = ChessBoardFactory.getInstance(chessGame).createBoard(); - return new ChessBoard(board); + if (CACHE.containsKey(chessGame)) { + return CACHE.get(chessGame); + } + final ChessBoard chessBoard = new ChessBoard(new ChessBoardFactory().createBoard()); + CACHE.put(chessGame, chessBoard); + return chessBoard; } public boolean contains(final Position position) { diff --git a/src/main/java/chess/domain/board/ChessBoardFactory.java b/src/main/java/chess/domain/board/ChessBoardFactory.java index c1c4b78872f..e3b1eee88a4 100644 --- a/src/main/java/chess/domain/board/ChessBoardFactory.java +++ b/src/main/java/chess/domain/board/ChessBoardFactory.java @@ -1,31 +1,14 @@ package chess.domain.board; -import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import static chess.domain.piece.PieceType.*; public final class ChessBoardFactory { - - private static final Map CACHE = new ConcurrentHashMap<>(); - - private ChessBoardFactory() { - } - - static ChessBoardFactory getInstance(final ChessGame chessGame) { - if (CACHE.containsKey(chessGame)) { - return CACHE.get(chessGame); - } - final ChessBoardFactory chessBoardFactory = new ChessBoardFactory(); - CACHE.put(chessGame, chessBoardFactory); - return chessBoardFactory; - } - public Map createBoard() { final Map board = new HashMap<>(); createWhiteArea(board); From 6a351eef4d67fa264748b5370d83631b85dfa247 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 00:18:08 +0900 Subject: [PATCH 12/71] =?UTF-8?q?feat=20:=20king=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=80=EC=84=9C=20=EC=A2=85=EB=A3=8C=EB=90=98=EC=97=88?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EC=97=90=EB=A7=8C=20status=20=EC=97=90=20?= =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5.=20=EC=95=84?= =?UTF-8?q?=EB=8B=90=20=EC=8B=9C=EC=97=90=EB=8A=94=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=EB=A7=8C=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/controller/ScoreDto.java | 10 ---------- src/main/java/chess/controller/state/End.java | 5 +++++ src/main/java/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/game/ChessGame.java | 4 ++++ src/main/java/chess/view/OutputView.java | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index aaa77e01e1b..d6b7b84b0c7 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -19,14 +19,4 @@ public Double getWhiteScore() { public Double getBlackScore() { return blackScore; } - - public String getWinner() { - if (whiteScore.equals(blackScore)) { - return "무승부"; - } - if (whiteScore > blackScore) { - return "White"; - } - return "Black"; - } } diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 22d0356b315..c00312dd7e1 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -3,6 +3,7 @@ import chess.controller.Command; import chess.controller.ScoreDto; import chess.domain.game.ChessGame; +import chess.domain.piece.TeamColor; import chess.domain.result.Score; import chess.view.OutputView; @@ -20,6 +21,10 @@ public boolean isRun() { public State run(ChessGame chessGame) { Score score = Score.calculate(chessGame.getChessBoard()); OutputView.printStatus(new ScoreDto(score)); + if (chessGame.isEnd()) { + TeamColor winner = chessGame.getCurrentTeamColor(); + OutputView.print(winner.name()); + } return new End(); } } diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index f7686589a1d..8ffde999c62 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -11,7 +11,7 @@ public final class ChessBoard { public static final int INITIAL_KING_COUNT = 2; private static final Map CACHE = new ConcurrentHashMap<>(); - + private final Map board; private ChessBoard(final Map board) { diff --git a/src/main/java/chess/domain/game/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java index 834d6ea38ce..c39f4042ca4 100644 --- a/src/main/java/chess/domain/game/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -51,4 +51,8 @@ public Map getChessBoard() { public boolean isEnd() { return chessBoard.checkKingDie(); } + + public TeamColor getCurrentTeamColor() { + return currentTeamColor; + } } diff --git a/src/main/java/chess/view/OutputView.java b/src/main/java/chess/view/OutputView.java index 1d55c5b67be..0951d2a130d 100644 --- a/src/main/java/chess/view/OutputView.java +++ b/src/main/java/chess/view/OutputView.java @@ -21,8 +21,8 @@ public static void printStartMessage() { } public static void printStatus(ScoreDto scoreDto) { - print(String.format("Black : %f, White : %f\n우승팀 : %s", - scoreDto.getBlackScore(), scoreDto.getWhiteScore(), scoreDto.getWinner())); + print(String.format("Black : %f, White : %f", + scoreDto.getBlackScore(), scoreDto.getWhiteScore())); System.out.println(System.lineSeparator()); } } From e80a84b82df9138f8c686e6e222c1a9d7dbb4a5e Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:00:09 +0900 Subject: [PATCH 13/71] =?UTF-8?q?docs=20:=20CRUD=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EB=AC=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 505390c8915..b8120a9d57c 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,39 @@ - [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 - [ ] table - - [ ] piece_type, team_color, rank, file, turn -- [ ] CRUD - - [ ] Create - - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 - - Query : - - [ ] Read - - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 - - Query : - - [ ] Update - - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 - - Query : - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 - - Query : + - [ ] Piece 정보 : piece_type, team_color, rank, file + - [ ] Chessgame 정보 : id, turn + - [ ] CRUD + - [ ] Create + - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 + - [ ] Read + - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - [ ] Update + - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 + - [ ] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 + +- Query +```sql +CREATE TABLE chess_game ( + piece_type VARCHAR(255), + piece_rank VARCHAR(255) NOT NULL, + piece_file VARCHAR(255) NOT NULL, + team VARCHAR(255), + turn VARCHAR(255) NOT NULL +) + +SELECT piece_type, piece_rank, piece_file, team, turn from chess_game; + +INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?); + +DELETE FROM chess_game; + +TRUNCATE TABLE chess_game; + +``` + ## ✔ 3단계 기능 요구사항 From 7244de87f1fb1654cc81267e09116258e631199e Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:00:40 +0900 Subject: [PATCH 14/71] =?UTF-8?q?feat=20:=20DB=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/DBConnection.java | 25 +++++++++++++++++++ src/test/java/chess/dao/DBConnectionTest.java | 18 +++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/main/java/chess/dao/DBConnection.java create mode 100644 src/test/java/chess/dao/DBConnectionTest.java diff --git a/src/main/java/chess/dao/DBConnection.java b/src/main/java/chess/dao/DBConnection.java new file mode 100644 index 00000000000..a8d3d33830c --- /dev/null +++ b/src/main/java/chess/dao/DBConnection.java @@ -0,0 +1,25 @@ +package chess.dao; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class DBConnection { + private static final String SERVER = "localhost:13306"; // MySQL 서버 주소 + private static final String DATABASE = "chess"; // MySQL DATABASE 이름 + private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"; + private static final String USERNAME = "root"; // MySQL 서버 아이디 + private static final String PASSWORD = "root"; // MySQL 서버 비밀번호 + + public Connection getConnection() { + // 드라이버 연결 + try { + return DriverManager.getConnection("jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION, USERNAME, PASSWORD); + } catch (final SQLException e) { + System.err.println("DB 연결 오류:" + e.getMessage()); + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/test/java/chess/dao/DBConnectionTest.java b/src/test/java/chess/dao/DBConnectionTest.java new file mode 100644 index 00000000000..d9f518ef7e2 --- /dev/null +++ b/src/test/java/chess/dao/DBConnectionTest.java @@ -0,0 +1,18 @@ +package chess.dao; + +import org.junit.jupiter.api.Test; + +import java.sql.SQLException; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class DBConnectionTest { + private final DBConnection dbConnection = new DBConnection(); + + @Test + public void connection() throws SQLException { + try (final var connection = dbConnection.getConnection()) { + assertThat(connection).isNotNull(); + } + } +} From 978d9aafc9b5db10694988ee60872eb763d5c833 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:03:10 +0900 Subject: [PATCH 15/71] =?UTF-8?q?feat=20:=20PieceType,=20TeamColor=20?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=94=ED=83=95=EC=9C=BC=EB=A1=9C=20Piece=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=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/chess/domain/piece/Pawn.java | 11 +++++-- src/main/java/chess/domain/piece/Piece.java | 4 +++ .../java/chess/domain/piece/PieceType.java | 29 +++++++++++++++---- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index a4f17707f60..5cb3fcdcf8a 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -2,7 +2,7 @@ import chess.domain.position.Position; -public abstract class Pawn extends Piece { +public class Pawn extends Piece { protected static final int PAWN_MAX_MOVE_COUNT = 1; protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; private static final Double VALUE = 1.0; @@ -20,7 +20,9 @@ public static Double calculateScore(int count) { return VALUE_SAME_FILE * count; } - abstract boolean canAttack(Position source, Position target, Piece piece); + boolean canAttack(Position source, Position target, Piece piece) { + return false; + } @Override public boolean isPawn() { @@ -31,4 +33,9 @@ public boolean isPawn() { public Double getValue() { return null; } + + @Override + public boolean canMove(Position source, Position target, Piece targetPiece) { + return false; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index 1ea8a351db1..80ccad25e11 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -29,6 +29,10 @@ public boolean isPawn() { public abstract Double getValue(); + public TeamColor getTeamColor() { + return teamColor; + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/main/java/chess/domain/piece/PieceType.java b/src/main/java/chess/domain/piece/PieceType.java index e61a1ce622f..d1667a568e9 100644 --- a/src/main/java/chess/domain/piece/PieceType.java +++ b/src/main/java/chess/domain/piece/PieceType.java @@ -1,10 +1,27 @@ package chess.domain.piece; +import java.util.Arrays; +import java.util.function.BiFunction; + public enum PieceType { - QUEEN, - ROOK, - KNIGHT, - PAWN, - BISHOP, - KING + QUEEN(Queen::new), + ROOK(Rook::new), + KNIGHT(Knight::new), + PAWN(Pawn::new), + BISHOP(Bishop::new), + KING(King::new); + + private final BiFunction toPiece; + + PieceType(BiFunction toPiece) { + this.toPiece = toPiece; + } + + public static Piece toPiece(final PieceType pieceType, final TeamColor color) { + return Arrays.stream(values()) + .filter(it -> it.name().equalsIgnoreCase(pieceType.name())) + .map(it -> it.toPiece.apply(pieceType, color)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("기물을 찾을 수 없습니다.")); + } } From 63f6dbdab5768d18b077bcc705ea5211e3f01caf Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:04 +0900 Subject: [PATCH 16/71] =?UTF-8?q?feat=20:=20ChessGameDao=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D=EC=84=B1,=20DB?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0=20=EC=A0=84=20InMemomryChessGameDao=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessGameDao.java | 12 ++++++++++ .../java/chess/dao/InMemoryChessGameDao.java | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/chess/dao/ChessGameDao.java create mode 100644 src/main/java/chess/dao/InMemoryChessGameDao.java diff --git a/src/main/java/chess/dao/ChessGameDao.java b/src/main/java/chess/dao/ChessGameDao.java new file mode 100644 index 00000000000..e83424e2d5f --- /dev/null +++ b/src/main/java/chess/dao/ChessGameDao.java @@ -0,0 +1,12 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public interface ChessGameDao { + void save(ChessGame chessGame); + + ChessGame select(); + + void update(ChessGame chessGame); + +} diff --git a/src/main/java/chess/dao/InMemoryChessGameDao.java b/src/main/java/chess/dao/InMemoryChessGameDao.java new file mode 100644 index 00000000000..d41de03bcbc --- /dev/null +++ b/src/main/java/chess/dao/InMemoryChessGameDao.java @@ -0,0 +1,24 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public class InMemoryChessGameDao implements ChessGameDao { + private ChessGame chessGame; + + @Override + public void save(ChessGame chessGame) { + this.chessGame = chessGame; + + } + + @Override + public ChessGame select() { + return chessGame; + } + + @Override + public void update(ChessGame chessGame) { + this.chessGame = chessGame; + + } +} From 64d46dcf094c9e9ffcc20e32e2bc194d8c4cd627 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:30 +0900 Subject: [PATCH 17/71] =?UTF-8?q?feat=20:=20ChessGameLoader=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessGameLoader.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/chess/dao/ChessGameLoader.java diff --git a/src/main/java/chess/dao/ChessGameLoader.java b/src/main/java/chess/dao/ChessGameLoader.java new file mode 100644 index 00000000000..c01f346cc4b --- /dev/null +++ b/src/main/java/chess/dao/ChessGameLoader.java @@ -0,0 +1,16 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public class ChessGameLoader { + public static ChessGame load(ChessGameDao chessGameDao) { + // 조회 + ChessGame chessGame = chessGameDao.select(); + if (chessGame == null) { + chessGame = new ChessGame(); + // 생성 후 저장 + chessGameDao.save(chessGame); + } + return chessGame; + } +} From 8f875039caab9f3d2ba4f5f941123396fb2cad29 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:57 +0900 Subject: [PATCH 18/71] =?UTF-8?q?feat=20:=20ChessBoard,=20ChessGame=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=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/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/game/ChessGame.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 8ffde999c62..ae8d3cfa665 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -14,7 +14,7 @@ public final class ChessBoard { private final Map board; - private ChessBoard(final Map board) { + public ChessBoard(final Map board) { this.board = board; } diff --git a/src/main/java/chess/domain/game/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java index c39f4042ca4..b9da70dd34e 100644 --- a/src/main/java/chess/domain/game/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -13,6 +13,12 @@ public final class ChessGame { public ChessGame() { this.chessBoard = ChessBoard.getInstance(this); + this.currentTeamColor = TeamColor.WHITE; + } + + public ChessGame(final ChessBoard chessBoard, final TeamColor turn) { + this.chessBoard = chessBoard; + this.currentTeamColor = turn; } public void setUp(final Position source, final Position target, final TeamColor teamColor) { From dc89d3fa1bdafd613e7d2d47adfe0f0601fa3265 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:05:19 +0900 Subject: [PATCH 19/71] =?UTF-8?q?test=20:=20ChessGame=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/domain/game/ChessGameTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/test/java/chess/domain/game/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java index 0ca9802cc96..26b203e818d 100644 --- a/src/test/java/chess/domain/game/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -5,22 +5,21 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatNoException; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; class ChessGameTest { @ParameterizedTest(name = "첫 턴은 백진영의 폰과 나이트만 움직이는지 검증한다.") - @CsvSource(value = {"6:0", "0:3"}, delimiter = ':') + @CsvSource(value = {"1:0", "0:1"}, delimiter = ':') void playMovableFail(final int rank, final int file) { // given final ChessGame chessGame = new ChessGame(); final Position source = Position.of(rank, file); - final Position target = Position.of(5, 0); + final Position target = Position.of(2, 0); // when, then - assertThatThrownBy(() -> chessGame.play(source, target)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + assertThatNoException().isThrownBy(() -> chessGame.play(source, target)); } @ParameterizedTest(name = "첫 턴의 폰은 2칸 이내만 전진할 수 있는지 검증한다.") @@ -34,7 +33,7 @@ void playFirstTurnMovePawnFail(final int rank) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); } @ParameterizedTest(name = "첫 턴의 나이트는 L자로 전진할 수 있는지 검증한다.") @@ -48,6 +47,6 @@ void playFirstTurnMoveKnightFail(final int rank, final int file) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); } } From 79ca4a3445fce31542ebf3806f1bc95a625a67b0 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:05:58 +0900 Subject: [PATCH 20/71] =?UTF-8?q?feat=20:=20ChessBoardDao=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(DB=20connection)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/ChessApplication.java | 3 +- .../chess/controller/ChessController.java | 13 +++- src/main/java/chess/dao/ChessBoardDao.java | 77 +++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/main/java/chess/dao/ChessBoardDao.java diff --git a/src/main/java/chess/ChessApplication.java b/src/main/java/chess/ChessApplication.java index 468aaaf1f63..a8b66b97dd7 100644 --- a/src/main/java/chess/ChessApplication.java +++ b/src/main/java/chess/ChessApplication.java @@ -1,10 +1,11 @@ package chess; import chess.controller.ChessController; +import chess.dao.ChessBoardDao; public class ChessApplication { public static void main(String[] args) { - final ChessController chessController = new ChessController(); + final ChessController chessController = new ChessController(new ChessBoardDao()); chessController.run(); } } diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 0cc8ce48d53..870b94d5abc 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -2,6 +2,8 @@ import chess.controller.state.Start; import chess.controller.state.State; +import chess.dao.ChessGameDao; +import chess.dao.ChessGameLoader; import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.position.Position; @@ -13,10 +15,15 @@ import java.util.function.Consumer; public class ChessController { + private final ChessGameDao chessGameDao; + + public ChessController(final ChessGameDao chessGameDao) { + this.chessGameDao = chessGameDao; + } public void run() { OutputView.printStartMessage(); - final ChessGame chessGame = new ChessGame(); + ChessGame chessGame = ChessGameLoader.load(chessGameDao); play(chessGame, gameStatus -> { if (gameStatus.isRun()) { printChessBoard(chessGame.getChessBoard()); @@ -24,10 +31,12 @@ public void run() { }); } - private void play(final ChessGame chessGame, Consumer consumer) { + private void play(ChessGame chessGame, Consumer consumer) { State gameStatus = new Start(chessGame); while (gameStatus.isRun()) { gameStatus = getStatus(gameStatus); + // 명령 실행 시 마다 업데이트 + chessGameDao.update(chessGame); consumer.accept(gameStatus); } } diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java new file mode 100644 index 00000000000..c331046e84d --- /dev/null +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -0,0 +1,77 @@ +package chess.dao; + +import chess.domain.board.ChessBoard; +import chess.domain.game.ChessGame; +import chess.domain.piece.Piece; +import chess.domain.piece.PieceType; +import chess.domain.piece.TeamColor; +import chess.domain.position.Position; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +public class ChessBoardDao implements ChessGameDao { + private static final DBConnection dbConnection = new DBConnection(); + + @Override + public void save(ChessGame chessGame) { + Map board = chessGame.getChessBoard(); + for (Map.Entry boardEntry : board.entrySet()) { + final var query = "INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?)"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, boardEntry.getValue().getPieceType().name()); + preparedStatement.setString(2, Integer.toString(boardEntry.getKey().getRank())); + preparedStatement.setString(3, Integer.toString(boardEntry.getKey().getFile())); + preparedStatement.setString(4, boardEntry.getValue().getTeamColor().name()); + preparedStatement.setString(5, chessGame.getCurrentTeamColor().name()); + preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public ChessGame select() { + Map board = new HashMap<>(); + TeamColor turn = null; + final var query = "SELECT piece_type, piece_rank, piece_file, team, turn FROM chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + PieceType pieceType = PieceType.valueOf(resultSet.getString("piece_type")); + int rank = Integer.parseInt(resultSet.getString("piece_rank")); + int file = Integer.parseInt(resultSet.getString("piece_file")); + TeamColor teamColor = TeamColor.valueOf(resultSet.getString("team")); + turn = TeamColor.valueOf(resultSet.getString("turn")); + Piece piece = PieceType.toPiece(pieceType, teamColor); + board.put(Position.of(rank, file), piece); + } + } catch (final SQLException e) { + throw new RuntimeException(e); + } + if (board.isEmpty()) { + return null; + } + return new ChessGame(new ChessBoard(board), turn); + } + + @Override + public void update(ChessGame chessGame) { + delete(chessGame); + save(chessGame); + } + + public void delete(ChessGame chessGame) { + final var query = "DELETE from chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } +} From f0cc766a47fab459b9bb1ec94c51e54c460dceea Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:06:56 +0900 Subject: [PATCH 21/71] =?UTF-8?q?feat=20:=20Move=20=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EC=8B=9C=20=ED=98=84=EC=9E=AC=20=ED=8C=80=EC=9D=80=20chessG?= =?UTF-8?q?ame=20=EC=97=90=EC=84=9C=20=EB=B0=9B=EC=95=84=EC=98=A8=20?= =?UTF-8?q?=ED=8C=80=EC=9C=BC=EB=A1=9C=20=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EA=B2=8C=EB=81=94=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/chess/controller/state/Start.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index a51872006f0..2ef14a10b81 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -2,7 +2,6 @@ import chess.controller.Command; import chess.domain.game.ChessGame; -import chess.domain.piece.TeamColor; public final class Start implements State { @@ -15,7 +14,7 @@ public Start(final ChessGame chessGame) { @Override public State checkCommand(final Command command) { if (command.isStart()) { - return new Move(chessGame, TeamColor.WHITE); + return new Move(chessGame, chessGame.getCurrentTeamColor()); } if (command.isEnd()) { return new End(); From 494b1e26da681842edd24dad16c7e547562ee37b Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:07:15 +0900 Subject: [PATCH 22/71] =?UTF-8?q?feat=20:=20CREATE=20TABLE=20chess=5Fgame?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=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/chess/docker/init.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/chess/docker/init.sql diff --git a/src/main/java/chess/docker/init.sql b/src/main/java/chess/docker/init.sql new file mode 100644 index 00000000000..e3a58e2e148 --- /dev/null +++ b/src/main/java/chess/docker/init.sql @@ -0,0 +1,8 @@ +CREATE TABLE chess_game +( + piece_type VARCHAR(255), + piece_rank VARCHAR(255) NOT NULL, + piece_file VARCHAR(255) NOT NULL, + team VARCHAR(255), + turn VARCHAR(255) NOT NULL +); From f1182082af05d504532dac6c0b7fdc8870df792f Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:09:15 +0900 Subject: [PATCH 23/71] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b8120a9d57c..8fd5cb87e76 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,20 @@ ## ✔ 4단계 기능 요구사항 -- [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 +- [x] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 - [ ] table - - [ ] Piece 정보 : piece_type, team_color, rank, file + - [x] Piece 정보 : piece_type, team_color, rank, file - [ ] Chessgame 정보 : id, turn - - [ ] CRUD - - [ ] Create - - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 - - [ ] Read - - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 - - [ ] Update - - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 - - [ ] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 + - [ ] CRUD + - [x] Create + - [x] DB에서 불러 올 체스 게임이 없으면 만든다 + - [x] Read + - [x] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - [x] Update + - [x] 기물을 움직일 때마다 DB 업데이트 해준다 + - [x] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 - Query ```sql From 4500fb4386d5fb844b1a903905afaeea692ad7e2 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 09:46:22 +0900 Subject: [PATCH 24/71] =?UTF-8?q?fix=20:=20=EB=8B=A4=EC=9D=8C=20=EC=B2=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B2=8C=EC=9E=84=EC=9D=B4=20=EC=8B=9C=EC=9E=91?= =?UTF-8?q?=EB=90=A0=20=EB=95=8C=EB=8A=94=20=ED=98=84=EC=9E=AC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EB=90=98=EC=96=B4=20=EC=9E=88=EB=8A=94=20turn=20?= =?UTF-8?q?=EA=B3=BC=20=EB=8B=A4=EB=A5=B8=20=ED=8C=80=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EB=90=98=EC=96=B4=EC=95=BC=20=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessBoardDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index c331046e84d..c47615cf372 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -56,7 +56,7 @@ public ChessGame select() { if (board.isEmpty()) { return null; } - return new ChessGame(new ChessBoard(board), turn); + return new ChessGame(new ChessBoard(board), turn.changeTurn()); } @Override From 798aed2bb2e13520e45f4732324a023d25a05a27 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 09:46:46 +0900 Subject: [PATCH 25/71] =?UTF-8?q?fix=20:=20Select=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EC=8B=9C=20Pawn=20=EC=9D=80=20BlackPawn,?= =?UTF-8?q?=20WhitePawn=20=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=88=A0=EC=84=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=ED=95=B4=EC=95=BC=20=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/PieceType.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/chess/domain/piece/PieceType.java b/src/main/java/chess/domain/piece/PieceType.java index d1667a568e9..f9483a3ab68 100644 --- a/src/main/java/chess/domain/piece/PieceType.java +++ b/src/main/java/chess/domain/piece/PieceType.java @@ -18,10 +18,20 @@ public enum PieceType { } public static Piece toPiece(final PieceType pieceType, final TeamColor color) { + if (pieceType == PAWN) { + return getPawn(color); + } return Arrays.stream(values()) .filter(it -> it.name().equalsIgnoreCase(pieceType.name())) .map(it -> it.toPiece.apply(pieceType, color)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("기물을 찾을 수 없습니다.")); } + + private static Pawn getPawn(TeamColor color) { + if (color == TeamColor.BLACK) { + return new BlackPawn(PieceType.PAWN); + } + return new WhitePawn(PieceType.PAWN); + } } From 8be2aa3257190f87799064abc4eb78c7313ba7b1 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:00:12 +0900 Subject: [PATCH 26/71] =?UTF-8?q?feat=20:=20king=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=80=EC=84=9C=20=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=8B=9C=EC=97=94=20DB=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- src/main/java/chess/controller/ChessController.java | 4 ++++ src/main/java/chess/dao/ChessBoardDao.java | 11 +++++++++++ src/main/java/chess/dao/ChessGameDao.java | 1 + src/main/java/chess/dao/InMemoryChessGameDao.java | 4 ++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8fd5cb87e76..f1f930e4115 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ ## ✔ 4단계 기능 요구사항 - [x] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 -- [ ] table +- [x] table - [x] Piece 정보 : piece_type, team_color, rank, file - - [ ] Chessgame 정보 : id, turn - - [ ] CRUD + - [x] Chessgame 정보 : turn (chessGame id 는 추후 적용 필요) + - [x] CRUD - [x] Create - [x] DB에서 불러 올 체스 게임이 없으면 만든다 - [x] Read @@ -16,8 +16,8 @@ - [x] Update - [x] 기물을 움직일 때마다 DB 업데이트 해준다 - [x] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 + - [x] Delete + - [x] King 이 죽으면 DB 초기화 해준다 - Query ```sql diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 870b94d5abc..93406a2cba6 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -29,6 +29,10 @@ public void run() { printChessBoard(chessGame.getChessBoard()); } }); + if (chessGame.isEnd()) { + // king 이 잡혀서 게임이 종료되면 DB 초기화 + chessGameDao.init(chessGame); + } } private void play(ChessGame chessGame, Consumer consumer) { diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index c47615cf372..eb28e9ac2db 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -74,4 +74,15 @@ public void delete(ChessGame chessGame) { throw new RuntimeException(e); } } + + @Override + public void init(ChessGame chessGame) { + final var query = "TRUNCATE TABLE chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/chess/dao/ChessGameDao.java b/src/main/java/chess/dao/ChessGameDao.java index e83424e2d5f..c92dd97c755 100644 --- a/src/main/java/chess/dao/ChessGameDao.java +++ b/src/main/java/chess/dao/ChessGameDao.java @@ -9,4 +9,5 @@ public interface ChessGameDao { void update(ChessGame chessGame); + void init(ChessGame chessGame); } diff --git a/src/main/java/chess/dao/InMemoryChessGameDao.java b/src/main/java/chess/dao/InMemoryChessGameDao.java index d41de03bcbc..502b27e81e8 100644 --- a/src/main/java/chess/dao/InMemoryChessGameDao.java +++ b/src/main/java/chess/dao/InMemoryChessGameDao.java @@ -19,6 +19,10 @@ public ChessGame select() { @Override public void update(ChessGame chessGame) { this.chessGame = chessGame; + } + @Override + public void init(ChessGame chessGame) { + this.chessGame = null; } } From e8152d3114d9ffa8a064f31d3377abd09c3c6efb Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:07:15 +0900 Subject: [PATCH 27/71] =?UTF-8?q?feat=20:=20chess=5Fgame=20table=20?= =?UTF-8?q?=EC=9D=98=20piece=5Frank,=20piece=5Ffile=20=EC=9E=90=EB=A3=8C?= =?UTF-8?q?=ED=98=95=EC=9D=84=20TINYINT=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/chess/dao/ChessBoardDao.java | 8 ++++---- src/main/java/chess/docker/init.sql | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index eb28e9ac2db..e25e3b2fdc6 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -22,8 +22,8 @@ public void save(ChessGame chessGame) { try (final var connection = dbConnection.getConnection(); final var preparedStatement = connection.prepareStatement(query)) { preparedStatement.setString(1, boardEntry.getValue().getPieceType().name()); - preparedStatement.setString(2, Integer.toString(boardEntry.getKey().getRank())); - preparedStatement.setString(3, Integer.toString(boardEntry.getKey().getFile())); + preparedStatement.setInt(2, boardEntry.getKey().getRank()); + preparedStatement.setInt(3, boardEntry.getKey().getFile()); preparedStatement.setString(4, boardEntry.getValue().getTeamColor().name()); preparedStatement.setString(5, chessGame.getCurrentTeamColor().name()); preparedStatement.executeUpdate(); @@ -43,8 +43,8 @@ public ChessGame select() { final var resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { PieceType pieceType = PieceType.valueOf(resultSet.getString("piece_type")); - int rank = Integer.parseInt(resultSet.getString("piece_rank")); - int file = Integer.parseInt(resultSet.getString("piece_file")); + int rank = resultSet.getInt("piece_rank"); + int file = resultSet.getInt("piece_file"); TeamColor teamColor = TeamColor.valueOf(resultSet.getString("team")); turn = TeamColor.valueOf(resultSet.getString("turn")); Piece piece = PieceType.toPiece(pieceType, teamColor); diff --git a/src/main/java/chess/docker/init.sql b/src/main/java/chess/docker/init.sql index e3a58e2e148..fc7e6bd413b 100644 --- a/src/main/java/chess/docker/init.sql +++ b/src/main/java/chess/docker/init.sql @@ -1,8 +1,8 @@ CREATE TABLE chess_game ( piece_type VARCHAR(255), - piece_rank VARCHAR(255) NOT NULL, - piece_file VARCHAR(255) NOT NULL, + piece_rank TINYINT(10) NOT NULL, + piece_file TINYINT(10) NOT NULL, team VARCHAR(255), turn VARCHAR(255) NOT NULL ); From 66552cd44e49e300f777989a44d004a6cee4719a Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:39:04 +0900 Subject: [PATCH 28/71] =?UTF-8?q?refactor=20:=20source=20=EC=99=80=20targe?= =?UTF-8?q?t=20=EC=9D=98=20=EC=9C=84=EC=B9=98=EA=B0=80=20=EC=83=81?= =?UTF-8?q?=ED=96=A5=20=EB=8C=80=EA=B0=81=EC=84=A0=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=ED=95=98=ED=96=A5=EB=8C=80=EA=B0=81=EC=84=A0=EC=9D=B8=EC=A7=80?= =?UTF-8?q?=20=ED=8C=90=EB=8B=A8=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=9D=84=20Direction=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=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/chess/domain/piece/Direction.java | 9 +++++++++ src/main/java/chess/domain/position/Position.java | 13 ++++++------- src/test/java/chess/domain/game/ChessGameTest.java | 3 +-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/chess/domain/piece/Direction.java b/src/main/java/chess/domain/piece/Direction.java index 8814219d31c..c2d241b0615 100644 --- a/src/main/java/chess/domain/piece/Direction.java +++ b/src/main/java/chess/domain/piece/Direction.java @@ -2,6 +2,7 @@ import chess.domain.position.Position; +import java.util.Arrays; import java.util.List; public enum Direction { @@ -37,4 +38,12 @@ public static List getDiagonalDirections() { public Position calculate(final Position before) { return before.calculate(this.rankMove, this.fileMove); } + + public static Direction findDirection(final int file, final int rank) { + return Arrays.stream(values()) + .filter(it -> it.fileMove == file) + .filter(it -> it.rankMove == rank) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("방향을 찾을 수 없습니다.")); + } } diff --git a/src/main/java/chess/domain/position/Position.java b/src/main/java/chess/domain/position/Position.java index cd97f9c5980..e9c4ac515d9 100644 --- a/src/main/java/chess/domain/position/Position.java +++ b/src/main/java/chess/domain/position/Position.java @@ -1,5 +1,7 @@ package chess.domain.position; +import chess.domain.piece.Direction; + import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -58,16 +60,13 @@ private int getGcdGap(int fileGap, int rankGap) { } public boolean isUpsideDiagonalPosition(Position target) { - int fileGap = target.file - this.file; - int rankGap = target.rank - this.rank; - return Math.abs(fileGap) == 1 && rankGap == 1; + Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); + return direction.equals(Direction.UP_LEFT) || direction.equals(Direction.UP_RIGHT); } public boolean isDownSideDiagonalPosition(Position target) { - int fileGap = target.file - this.file; - int rankGap = target.rank - this.rank; - return Math.abs(fileGap) == 1 && rankGap == -1; - + Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); + return direction.equals(Direction.DOWN_LEFT) || direction.equals(Direction.DOWN_RIGHT); } @Override diff --git a/src/test/java/chess/domain/game/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java index 26b203e818d..3f22db8dd5d 100644 --- a/src/test/java/chess/domain/game/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -32,8 +32,7 @@ void playFirstTurnMovePawnFail(final int rank) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); + .isInstanceOf(IllegalArgumentException.class); } @ParameterizedTest(name = "첫 턴의 나이트는 L자로 전진할 수 있는지 검증한다.") From 853381b334378cce050fa5b1efb044fee447b428 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:40:07 +0900 Subject: [PATCH 29/71] =?UTF-8?q?style=20:=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/Direction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/chess/domain/piece/Direction.java b/src/main/java/chess/domain/piece/Direction.java index c2d241b0615..683b3f91334 100644 --- a/src/main/java/chess/domain/piece/Direction.java +++ b/src/main/java/chess/domain/piece/Direction.java @@ -35,10 +35,6 @@ public static List getDiagonalDirections() { return List.of(UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT); } - public Position calculate(final Position before) { - return before.calculate(this.rankMove, this.fileMove); - } - public static Direction findDirection(final int file, final int rank) { return Arrays.stream(values()) .filter(it -> it.fileMove == file) @@ -46,4 +42,8 @@ public static Direction findDirection(final int file, final int rank) { .findFirst() .orElseThrow(() -> new IllegalArgumentException("방향을 찾을 수 없습니다.")); } + + public Position calculate(final Position before) { + return before.calculate(this.rankMove, this.fileMove); + } } From 71f80eb8a89841dd39ebb9f4c382167ce286bcfb Mon Sep 17 00:00:00 2001 From: yenawee Date: Fri, 24 Mar 2023 17:07:09 +0900 Subject: [PATCH 30/71] =?UTF-8?q?docs=20:=203=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df3c4a89958..356ceee9579 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,18 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) + +## ✔ 2단계 기능 요구사항 +- [ ] King 이 잡혔을 때 게임 종료 +- [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 + - [ ] commandType 에 status 추가 +- [ ] 점수 계산 + - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 + + + + ## 1단계 피드백 사항 및 추가 수정 사항 - [x] 출력 시 View 와 Domain 의존성 제거 - DTO 도입 - [x] 매직 넘버 상수화 @@ -14,7 +26,7 @@ - [x] 예외 발생 시 재입력 -## ✔ 기능 요구사항 +## ✔ 1단계 기능 요구사항 ### ChessBoard From 5b7c3de23ecf2057b94113bb88c9078e75da19b7 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 16:37:04 +0900 Subject: [PATCH 31/71] =?UTF-8?q?feat=20:=20Command=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=97=90=20Status=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/Command.java | 6 ++- .../chess/controller/state/CommandType.java | 2 +- .../java/chess/controller/state/Move.java | 3 ++ .../java/chess/controller/state/Status.java | 42 +++++++++++++++++++ src/main/java/chess/domain/Score.java | 2 + 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/main/java/chess/controller/state/Status.java create mode 100644 src/main/java/chess/domain/Score.java diff --git a/README.md b/README.md index 356ceee9579..8e2700a2774 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## ✔ 2단계 기능 요구사항 - [ ] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - - [ ] commandType 에 status 추가 + - [x] commandType 에 status 추가 - [ ] 점수 계산 - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 diff --git a/src/main/java/chess/controller/Command.java b/src/main/java/chess/controller/Command.java index 8f0d228e055..a6fa325cdc6 100644 --- a/src/main/java/chess/controller/Command.java +++ b/src/main/java/chess/controller/Command.java @@ -9,7 +9,7 @@ public final class Command { public static final int COMMAND_INDEX = 0; public static final int MOVE_COMMAND_SIZE = 3; private static final String COMMAND_ERROR_MESSAGE = "잘못된 명령어 입력입니다."; - + private final CommandType type; private final List commands; @@ -38,6 +38,10 @@ public boolean isEnd() { return type == CommandType.END; } + public boolean isStatus() { + return type == CommandType.STATUS; + } + public boolean isCorrectWhenMove() { return commands.size() == MOVE_COMMAND_SIZE; } diff --git a/src/main/java/chess/controller/state/CommandType.java b/src/main/java/chess/controller/state/CommandType.java index 65dcc25d6c2..887643a3d96 100644 --- a/src/main/java/chess/controller/state/CommandType.java +++ b/src/main/java/chess/controller/state/CommandType.java @@ -1,5 +1,5 @@ package chess.controller.state; public enum CommandType { - START, MOVE, END + START, MOVE, END, STATUS } diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index e1dad06cc3c..092e496ca0d 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -28,6 +28,9 @@ public State checkCommand(final Command command) { if (command.isEnd()) { return new End(); } + if (command.isStatus()) { + return Status.of(chessGame, teamColor); + } validateCommand(command); return move(command); } diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java new file mode 100644 index 00000000000..f81c3e2ca64 --- /dev/null +++ b/src/main/java/chess/controller/state/Status.java @@ -0,0 +1,42 @@ +package chess.controller.state; + +import chess.controller.Command; +import chess.domain.Score; +import chess.domain.chess.ChessGame; +import chess.domain.piece.TeamColor; + +public class Status implements State { + private final ChessGame chessGame; + private final TeamColor teamColor; + + private Status(ChessGame chessGame, TeamColor teamColor) { + this.chessGame = chessGame; + this.teamColor = teamColor; + } + + public static State of(ChessGame chessGame, TeamColor teamColor) { + Score score = new Score(); + System.out.println("status"); + return new Status(chessGame, teamColor); + } + + @Override + public State checkCommand(Command command) { + if (command.isEnd()) { + return new End(); + } + if (command.isMove()) { + Move move = new Move(chessGame, teamColor); + return move.checkCommand(command); + } + if (command.isStatus()) { + return Status.of(chessGame, teamColor); + } + throw new UnsupportedOperationException("end, move 명령어만 입력 가능합니다."); + } + + @Override + public boolean isRun() { + return true; + } +} diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/Score.java new file mode 100644 index 00000000000..a8981266fd5 --- /dev/null +++ b/src/main/java/chess/domain/Score.java @@ -0,0 +1,2 @@ +package chess.domain;public class Score { +} From ebc319eccbf637ba83b4032c1065014bb976e584 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 17:56:54 +0900 Subject: [PATCH 32/71] =?UTF-8?q?feat=20:=20King=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=94=EC=9D=84=20=EB=95=8C=20=EA=B2=8C=EC=9E=84=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/state/End.java | 8 ++++++++ src/main/java/chess/controller/state/Move.java | 7 +++++-- src/main/java/chess/controller/state/Start.java | 11 +++-------- src/main/java/chess/controller/state/Status.java | 8 ++++---- src/main/java/chess/domain/Player.java | 2 ++ src/main/java/chess/domain/board/ChessBoard.java | 7 +++++++ src/main/java/chess/domain/chess/ChessGame.java | 4 ++++ src/main/java/chess/domain/piece/King.java | 5 +++++ src/main/java/chess/domain/piece/Piece.java | 4 ++++ 10 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 src/main/java/chess/domain/Player.java diff --git a/README.md b/README.md index 8e2700a2774..9a06ecb033f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## ✔ 2단계 기능 요구사항 -- [ ] King 이 잡혔을 때 게임 종료 +- [x] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 - [ ] 점수 계산 diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 7e27ce3446e..31b96259df1 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -1,6 +1,8 @@ package chess.controller.state; import chess.controller.Command; +import chess.domain.Score; +import chess.domain.chess.ChessGame; public final class End implements State { @Override @@ -12,4 +14,10 @@ public State checkCommand(final Command command) { public boolean isRun() { return false; } + + public State run(ChessGame chessGame) { + Score score = new Score(); + System.out.println("status"); + return new End(); + } } diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index 092e496ca0d..6ea5d249e6c 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -26,10 +26,10 @@ public State checkCommand(final Command command) { throw new IllegalArgumentException("이미 시작이 완료되었습니다."); } if (command.isEnd()) { - return new End(); + return new End().run(chessGame); } if (command.isStatus()) { - return Status.of(chessGame, teamColor); + return new Status(chessGame, teamColor).run(); } validateCommand(command); return move(command); @@ -40,6 +40,9 @@ private State move(final Command command) { final Position source = PositionConverter.convert(commands.get(SOURCE_INDEX)); final Position target = PositionConverter.convert(commands.get(TARGET_INDEX)); chessGame.setUp(source, target, teamColor); + if (chessGame.isEnd()) { + return new End().run(chessGame); + } return new Move(chessGame, teamColor.changeTurn()); } diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 80604222a44..1c63848c459 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -14,15 +14,10 @@ public Start(final ChessGame chessGame) { @Override public State checkCommand(final Command command) { - if (command.isEnd()) { - return new End(); + if (command.isStart()) { + return new Move(chessGame, TeamColor.WHITE); } - - if (command.isMove()) { - throw new IllegalArgumentException("게임이 시작되지 않았습니다."); - } - - return new Move(chessGame, TeamColor.WHITE); + throw new IllegalArgumentException("게임이 시작되지 않았습니다."); } @Override diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index f81c3e2ca64..690700ebd2b 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -9,12 +9,12 @@ public class Status implements State { private final ChessGame chessGame; private final TeamColor teamColor; - private Status(ChessGame chessGame, TeamColor teamColor) { + public Status(ChessGame chessGame, TeamColor teamColor) { this.chessGame = chessGame; this.teamColor = teamColor; } - public static State of(ChessGame chessGame, TeamColor teamColor) { + State run() { Score score = new Score(); System.out.println("status"); return new Status(chessGame, teamColor); @@ -23,14 +23,14 @@ public static State of(ChessGame chessGame, TeamColor teamColor) { @Override public State checkCommand(Command command) { if (command.isEnd()) { - return new End(); + return new End().run(chessGame); } if (command.isMove()) { Move move = new Move(chessGame, teamColor); return move.checkCommand(command); } if (command.isStatus()) { - return Status.of(chessGame, teamColor); + return run(); } throw new UnsupportedOperationException("end, move 명령어만 입력 가능합니다."); } diff --git a/src/main/java/chess/domain/Player.java b/src/main/java/chess/domain/Player.java new file mode 100644 index 00000000000..b057e741f05 --- /dev/null +++ b/src/main/java/chess/domain/Player.java @@ -0,0 +1,2 @@ +package chess.domain;public class Player { +} diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index f604beeec79..9d1a474fa36 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -8,6 +8,7 @@ import java.util.Map; public final class ChessBoard { + public static final int INITIAL_KING_COUNT = 2; private final Map board; private ChessBoard(final Map board) { @@ -61,4 +62,10 @@ private boolean isObstructed(final Position target, final Position unitPosition, public Map getBoard() { return Map.copyOf(board); } + + public boolean checkKingDie() { + return board.values().stream() + .filter(piece -> piece.isKing()) + .count() != INITIAL_KING_COUNT; + } } diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/chess/ChessGame.java index 06315b978a1..52ec9322796 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/chess/ChessGame.java @@ -47,4 +47,8 @@ private void movePiece(final Position source, final Position target, final Piece public Map getChessBoard() { return chessBoard.getBoard(); } + + public boolean isEnd() { + return chessBoard.checkKingDie(); + } } diff --git a/src/main/java/chess/domain/piece/King.java b/src/main/java/chess/domain/piece/King.java index eceb180f8f1..16187a60df8 100644 --- a/src/main/java/chess/domain/piece/King.java +++ b/src/main/java/chess/domain/piece/King.java @@ -16,4 +16,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getAllDirections(), KING_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public boolean isKing() { + return true; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index b7496aa462e..fe328bf0f0f 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -23,6 +23,10 @@ public PieceType getPieceType() { return pieceType; } + public boolean isKing() { + return false; + } + @Override public boolean equals(final Object o) { if (this == o) return true; From 17a3ef4837c7410d94f2fb6a5fb465e24c63af86 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 18:08:59 +0900 Subject: [PATCH 33/71] =?UTF-8?q?feat=20:=20=EA=B8=B0=EB=AC=BC=EB=B3=84=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/Bishop.java | 1 + src/main/java/chess/domain/piece/Knight.java | 2 ++ src/main/java/chess/domain/piece/Pawn.java | 2 ++ src/main/java/chess/domain/piece/Queen.java | 1 + src/main/java/chess/domain/piece/Rook.java | 1 + 5 files changed, 7 insertions(+) diff --git a/src/main/java/chess/domain/piece/Bishop.java b/src/main/java/chess/domain/piece/Bishop.java index df7a69363bb..67f49f23916 100644 --- a/src/main/java/chess/domain/piece/Bishop.java +++ b/src/main/java/chess/domain/piece/Bishop.java @@ -5,6 +5,7 @@ public class Bishop extends Piece { private static final int BISHOP_MAX_MOVE_COUNT = 8; + private static final Double VALUE = 3.0; public Bishop(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Knight.java b/src/main/java/chess/domain/piece/Knight.java index d6d21eddb9c..047a0adc6c0 100644 --- a/src/main/java/chess/domain/piece/Knight.java +++ b/src/main/java/chess/domain/piece/Knight.java @@ -3,6 +3,8 @@ import chess.domain.position.Position; public class Knight extends Piece { + private static final Double VALUE = 2.5; + public Knight(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index f8dec186878..0b8f06ac4b6 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -5,6 +5,8 @@ public abstract class Pawn extends Piece { protected static final int PAWN_MAX_MOVE_COUNT = 1; protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; + private static final Double VALUE = 1.0; + private static final Double VALUE_SAME_FILE = 0.5; Pawn(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Queen.java b/src/main/java/chess/domain/piece/Queen.java index 111a6ff476b..8541a8189ba 100644 --- a/src/main/java/chess/domain/piece/Queen.java +++ b/src/main/java/chess/domain/piece/Queen.java @@ -5,6 +5,7 @@ public class Queen extends Piece { private static final int QUEEN_MAX_MOVE_COUNT = 8; + private static final Double VALUE = 9.0; public Queen(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); diff --git a/src/main/java/chess/domain/piece/Rook.java b/src/main/java/chess/domain/piece/Rook.java index ca629d06fd1..86dd94b1ccd 100644 --- a/src/main/java/chess/domain/piece/Rook.java +++ b/src/main/java/chess/domain/piece/Rook.java @@ -5,6 +5,7 @@ public class Rook extends Piece { private static final int ROOK_MAX_MOVE_COUNT = 8; + private static final Double Value = 5.0; public Rook(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); From 6b8d5456047105c3f30aa9006494851f5c1dd0ca Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:06:38 +0900 Subject: [PATCH 34/71] =?UTF-8?q?feat=20:=20=EC=A0=90=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++-- src/main/java/chess/controller/ScoreDto.java | 2 + src/main/java/chess/domain/Player.java | 2 - src/main/java/chess/domain/Score.java | 57 ++++++++++++++++- src/main/java/chess/domain/piece/Bishop.java | 5 ++ src/main/java/chess/domain/piece/King.java | 6 ++ src/main/java/chess/domain/piece/Knight.java | 5 ++ src/main/java/chess/domain/piece/Pawn.java | 18 ++++++ src/main/java/chess/domain/piece/Piece.java | 6 ++ src/main/java/chess/domain/piece/Queen.java | 5 ++ src/main/java/chess/domain/piece/Rook.java | 7 ++- src/test/java/chess/domain/ScoreTest.java | 65 ++++++++++++++++++++ 12 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 src/main/java/chess/controller/ScoreDto.java delete mode 100644 src/main/java/chess/domain/Player.java create mode 100644 src/test/java/chess/domain/ScoreTest.java diff --git a/README.md b/README.md index 9a06ecb033f..1f0e8d78a2c 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,13 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) -## ✔ 2단계 기능 요구사항 +## ✔ 3단계 기능 요구사항 - [x] King 이 잡혔을 때 게임 종료 - [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 -- [ ] 점수 계산 - - [ ] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - - [ ] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 - - +- [x] 점수 계산 + - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 ## 1단계 피드백 사항 및 추가 수정 사항 @@ -26,7 +24,7 @@ - [x] 예외 발생 시 재입력 -## ✔ 1단계 기능 요구사항 +## ✔ 1, 2단계 기능 요구사항 ### ChessBoard diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java new file mode 100644 index 00000000000..1977c763948 --- /dev/null +++ b/src/main/java/chess/controller/ScoreDto.java @@ -0,0 +1,2 @@ +package chess.controller;public class ScoreDto { +} diff --git a/src/main/java/chess/domain/Player.java b/src/main/java/chess/domain/Player.java deleted file mode 100644 index b057e741f05..00000000000 --- a/src/main/java/chess/domain/Player.java +++ /dev/null @@ -1,2 +0,0 @@ -package chess.domain;public class Player { -} diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/Score.java index a8981266fd5..57d8fe83163 100644 --- a/src/main/java/chess/domain/Score.java +++ b/src/main/java/chess/domain/Score.java @@ -1,2 +1,57 @@ -package chess.domain;public class Score { +package chess.domain; + +import chess.domain.piece.Pawn; +import chess.domain.piece.Piece; +import chess.domain.piece.TeamColor; +import chess.domain.position.Position; + +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Score { + private final Map score; + + private Score(Map score) { + this.score = score; + } + + public static Score calculate(Map board) { + Map score = Arrays.stream(TeamColor.values()) + .collect(Collectors.toMap(Function.identity(), + color -> sumScoreExceptPawn(color, board) + sumScorePawn(color, board))); + return new Score(score); + } + + private static Double sumScoreExceptPawn(TeamColor color, Map board) { + return board.values() + .stream() + .filter(piece -> piece.isSameTeam(color)) + .filter(piece -> !piece.isPawn()) + .mapToDouble(Piece::getValue) + .sum(); + } + + private static Double sumScorePawn(TeamColor color, Map board) { + return IntStream.range(0, 8) + .map(file -> countPawnByEachFile(file, color, board)) + .mapToDouble(Pawn::calculateScore) + .sum(); + } + + private static int countPawnByEachFile(int file, TeamColor color, Map board) { + return (int) IntStream.range(0, 8) + .mapToObj(rank -> board.get(Position.of(rank, file))) + .filter(piece -> !Objects.isNull(piece)) + .filter(Piece::isPawn) + .filter(piece -> piece.isSameTeam(color)) + .count(); + } + + public Double getScore(TeamColor teamColor) { + return score.get(teamColor); + } } diff --git a/src/main/java/chess/domain/piece/Bishop.java b/src/main/java/chess/domain/piece/Bishop.java index 67f49f23916..afbe7ba9267 100644 --- a/src/main/java/chess/domain/piece/Bishop.java +++ b/src/main/java/chess/domain/piece/Bishop.java @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getDiagonalDirections(), BISHOP_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/King.java b/src/main/java/chess/domain/piece/King.java index 16187a60df8..f0ceee12069 100644 --- a/src/main/java/chess/domain/piece/King.java +++ b/src/main/java/chess/domain/piece/King.java @@ -5,6 +5,7 @@ public class King extends Piece { private static final int KING_MAX_MOVE_COUNT = 1; + private static final Double VALUE = 0.0; public King(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -21,4 +22,9 @@ public boolean canMove(final Position source, final Position target, final Piece public boolean isKing() { return true; } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Knight.java b/src/main/java/chess/domain/piece/Knight.java index 047a0adc6c0..4e57bd926d7 100644 --- a/src/main/java/chess/domain/piece/Knight.java +++ b/src/main/java/chess/domain/piece/Knight.java @@ -15,4 +15,9 @@ public boolean canMove(final Position source, final Position target, final Piece final int fileGap = target.getFile() - source.getFile(); return Math.abs(rankGap * fileGap) == 2; } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index 0b8f06ac4b6..a69d51e455f 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -7,10 +7,28 @@ public abstract class Pawn extends Piece { protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; private static final Double VALUE = 1.0; private static final Double VALUE_SAME_FILE = 0.5; + private static final int PAWN_COUNT_CRITERION_FOR_SCORING = 1; Pawn(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); } abstract boolean canAttack(Position source, Position target, Piece piece); + + public static Double calculateScore(int count) { + if (count == PAWN_COUNT_CRITERION_FOR_SCORING) { + return VALUE; + } + return VALUE_SAME_FILE * count; + } + + @Override + public boolean isPawn() { + return true; + } + + @Override + public Double getValue() { + return null; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index fe328bf0f0f..f08b7affe9d 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -27,6 +27,12 @@ public boolean isKing() { return false; } + public boolean isPawn() { + return false; + } + + public abstract Double getValue(); + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/main/java/chess/domain/piece/Queen.java b/src/main/java/chess/domain/piece/Queen.java index 8541a8189ba..65c9d5bd2ba 100644 --- a/src/main/java/chess/domain/piece/Queen.java +++ b/src/main/java/chess/domain/piece/Queen.java @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getAllDirections(), QUEEN_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/main/java/chess/domain/piece/Rook.java b/src/main/java/chess/domain/piece/Rook.java index 86dd94b1ccd..23b5e24df5c 100644 --- a/src/main/java/chess/domain/piece/Rook.java +++ b/src/main/java/chess/domain/piece/Rook.java @@ -5,7 +5,7 @@ public class Rook extends Piece { private static final int ROOK_MAX_MOVE_COUNT = 8; - private static final Double Value = 5.0; + private static final Double VALUE = 5.0; public Rook(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -17,4 +17,9 @@ public boolean canMove(final Position source, final Position target, final Piece PossibleDestinations.of(source, Direction.getFourDirections(), ROOK_MAX_MOVE_COUNT); return allPositions.contains(target); } + + @Override + public Double getValue() { + return VALUE; + } } diff --git a/src/test/java/chess/domain/ScoreTest.java b/src/test/java/chess/domain/ScoreTest.java new file mode 100644 index 00000000000..009b5a1ade2 --- /dev/null +++ b/src/test/java/chess/domain/ScoreTest.java @@ -0,0 +1,65 @@ +package chess.domain; + +import chess.domain.piece.*; +import chess.domain.position.Position; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class ScoreTest { + @DisplayName("Pawn 이 한 File 에 하나 있으면 1점으로 계산된다") + @Test + void onePawninFile() { + Map board = new HashMap<>(); + board.put(Position.of(0, 1), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(0, 2), new BlackPawn(PieceType.PAWN)); + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(2.0); + } + + @DisplayName("Pawn 이 한 File 에 두개 이상 있으면 각각 0.5점으로 계산된다.") + @Test + void TwoPawninSameFile() { + Map board = new HashMap<>(); + board.put(Position.of(0, 1), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(1, 1), new BlackPawn(PieceType.PAWN)); + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(1.0); + } + + @DisplayName("Queen, Rook, Bishop, Knight 점수 계산 테스트(Pawn 제외)") + @Test + void allPieceExceptPawn() { + Map board = new HashMap<>(); + board.put(Position.of(1, 1), new Queen(PieceType.QUEEN, TeamColor.BLACK)); + board.put(Position.of(3, 4), new Rook(PieceType.ROOK, TeamColor.BLACK)); + board.put(Position.of(2, 6), new Bishop(PieceType.BISHOP, TeamColor.BLACK)); + board.put(Position.of(7, 7), new Knight(PieceType.KNIGHT, TeamColor.BLACK)); + + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(19.5); + } + + @DisplayName("Queen, Rook, Bishop, Knight 점수 계산 테스트(같은 File 에 Pawn 2개 있을 때)") + @Test + void allPieceWithTwoPawnInSameFile() { + Map board = new HashMap<>(); + board.put(Position.of(1, 1), new Queen(PieceType.QUEEN, TeamColor.BLACK)); + board.put(Position.of(3, 4), new Rook(PieceType.ROOK, TeamColor.BLACK)); + board.put(Position.of(2, 6), new Bishop(PieceType.BISHOP, TeamColor.BLACK)); + board.put(Position.of(7, 7), new Knight(PieceType.KNIGHT, TeamColor.BLACK)); + board.put(Position.of(5, 5), new BlackPawn(PieceType.PAWN)); + board.put(Position.of(4, 5), new BlackPawn(PieceType.PAWN)); + + Score score = Score.calculate(board); + + assertThat(score.getScore(TeamColor.BLACK)).isEqualTo(20.5); + } +} From ad007cd8b44afd087531d6095ac6d1052ebb6421 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:07:04 +0900 Subject: [PATCH 35/71] =?UTF-8?q?feat=20:=20status=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=90=EC=88=98=20=EB=B0=8F=20=EC=96=B4=EB=8A=90?= =?UTF-8?q?=20=EC=A7=84=EC=98=81=EC=9D=B4=20=EC=9D=B4=EA=B2=BC=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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 --- README.md | 2 +- src/main/java/chess/controller/ScoreDto.java | 32 ++++++++++++++++++- src/main/java/chess/controller/state/End.java | 6 ++-- .../java/chess/controller/state/Status.java | 6 ++-- src/main/java/chess/view/OutputView.java | 8 +++++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1f0e8d78a2c..ebd6a85cbbe 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## ✔ 3단계 기능 요구사항 - [x] King 이 잡혔을 때 게임 종료 -- [ ] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 +- [x] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - [x] commandType 에 status 추가 - [x] 점수 계산 - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index 1977c763948..6bd656862fb 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -1,2 +1,32 @@ -package chess.controller;public class ScoreDto { +package chess.controller; + +import chess.domain.Score; +import chess.domain.piece.TeamColor; + +public class ScoreDto { + private final Double whiteScore; + private final Double blackScore; + + public ScoreDto(Score score) { + whiteScore = score.getScore(TeamColor.WHITE); + blackScore = score.getScore(TeamColor.BLACK); + } + + public Double getWhiteScore() { + return whiteScore; + } + + public Double getBlackScore() { + return blackScore; + } + + public String getWinner() { + if (whiteScore == blackScore) { + return "무승부"; + } + if (whiteScore > blackScore) { + return "White"; + } + return "Black"; + } } diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 31b96259df1..b08358837f2 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -1,8 +1,10 @@ package chess.controller.state; import chess.controller.Command; +import chess.controller.ScoreDto; import chess.domain.Score; import chess.domain.chess.ChessGame; +import chess.view.OutputView; public final class End implements State { @Override @@ -16,8 +18,8 @@ public boolean isRun() { } public State run(ChessGame chessGame) { - Score score = new Score(); - System.out.println("status"); + Score score = Score.calculate(chessGame.getChessBoard()); + OutputView.printStatus(new ScoreDto(score)); return new End(); } } diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index 690700ebd2b..8ddffcd828a 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -1,9 +1,11 @@ package chess.controller.state; import chess.controller.Command; +import chess.controller.ScoreDto; import chess.domain.Score; import chess.domain.chess.ChessGame; import chess.domain.piece.TeamColor; +import chess.view.OutputView; public class Status implements State { private final ChessGame chessGame; @@ -15,8 +17,8 @@ public Status(ChessGame chessGame, TeamColor teamColor) { } State run() { - Score score = new Score(); - System.out.println("status"); + Score score = Score.calculate(chessGame.getChessBoard()); + OutputView.printStatus(new ScoreDto(score)); return new Status(chessGame, teamColor); } diff --git a/src/main/java/chess/view/OutputView.java b/src/main/java/chess/view/OutputView.java index a8fdc85834c..1d55c5b67be 100644 --- a/src/main/java/chess/view/OutputView.java +++ b/src/main/java/chess/view/OutputView.java @@ -1,5 +1,7 @@ package chess.view; +import chess.controller.ScoreDto; + import static chess.controller.state.CommandType.*; public final class OutputView { @@ -17,4 +19,10 @@ public static void printStartMessage() { print(String.format(START_MESSAGE, START.name().toLowerCase(), END.name().toLowerCase(), MOVE.name().toLowerCase())); } + + public static void printStatus(ScoreDto scoreDto) { + print(String.format("Black : %f, White : %f\n우승팀 : %s", + scoreDto.getBlackScore(), scoreDto.getWhiteScore(), scoreDto.getWinner())); + System.out.println(System.lineSeparator()); + } } From d65f72f3b3b194a7abd26b6315913294f81b0c3f Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:14:00 +0900 Subject: [PATCH 36/71] =?UTF-8?q?feat=20:=20Camp=20->=20TeamColor=20?= =?UTF-8?q?=EB=A1=9C=20=EC=95=88=EB=B0=94=EB=80=90=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B0=8F=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/chess/controller/ScoreDto.java | 2 +- .../java/chess/controller/state/Start.java | 3 +++ .../java/chess/domain/chess/ChessGame.java | 4 ++-- src/main/java/chess/domain/piece/Pawn.java | 4 ++-- src/main/java/chess/domain/piece/Piece.java | 4 ---- .../java/chess/domain/piece/CampTypeTest.java | 2 +- .../java/chess/domain/piece/PieceTest.java | 22 ++----------------- 8 files changed, 12 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index ebd6a85cbbe..b6758441536 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ - [x] 체스 게임을 진행한다. -### CampType +### TeamColor - [x] 사용자의 진영을 관리한다. - [x] 입력받은 위치의 열이 소문자면 WHITE, 대문자면 BLACK 진영으로 나눈다. diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index 6bd656862fb..ec965177489 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -21,7 +21,7 @@ public Double getBlackScore() { } public String getWinner() { - if (whiteScore == blackScore) { + if (whiteScore.equals(blackScore)) { return "무승부"; } if (whiteScore > blackScore) { diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 1c63848c459..4ebc8e506b4 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -17,6 +17,9 @@ public State checkCommand(final Command command) { if (command.isStart()) { return new Move(chessGame, TeamColor.WHITE); } + if (command.isEnd()) { + return new End(); + } throw new IllegalArgumentException("게임이 시작되지 않았습니다."); } diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/chess/ChessGame.java index 52ec9322796..d428b16140b 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/chess/ChessGame.java @@ -25,7 +25,7 @@ public void play(final Position source, final Position target) { if (piece == null) { throw new IllegalArgumentException("기물이 존재하는 위치를 입력해주세요."); } - validateCamp(piece); + validateTurn(piece); if (!piece.canMove(source, target, chessBoard.getPiece(target)) || !chessBoard.isPossibleRoute(source, target, currentTeamColor)) { throw new IllegalArgumentException("기물 규칙 상 움직일 수 없는 위치입니다."); @@ -33,7 +33,7 @@ public void play(final Position source, final Position target) { movePiece(source, target, piece); } - private void validateCamp(final Piece piece) { + private void validateTurn(final Piece piece) { if (!piece.isSameTeam(currentTeamColor)) { throw new IllegalArgumentException("현재 차례가 아닙니다."); } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index a69d51e455f..a4f17707f60 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -13,8 +13,6 @@ public abstract class Pawn extends Piece { super(pieceType, teamColor); } - abstract boolean canAttack(Position source, Position target, Piece piece); - public static Double calculateScore(int count) { if (count == PAWN_COUNT_CRITERION_FOR_SCORING) { return VALUE; @@ -22,6 +20,8 @@ public static Double calculateScore(int count) { return VALUE_SAME_FILE * count; } + abstract boolean canAttack(Position source, Position target, Piece piece); + @Override public boolean isPawn() { return true; diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index f08b7affe9d..1ea8a351db1 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -11,10 +11,6 @@ public Piece(final PieceType pieceType, final TeamColor teamColor) { this.teamColor = teamColor; } - public boolean compareCamp(final Piece other) { - return teamColor == other.teamColor; - } - public boolean isSameTeam(final TeamColor diffType) { return teamColor == diffType; } diff --git a/src/test/java/chess/domain/piece/CampTypeTest.java b/src/test/java/chess/domain/piece/CampTypeTest.java index 680c25ca8d1..8e914dee7e3 100644 --- a/src/test/java/chess/domain/piece/CampTypeTest.java +++ b/src/test/java/chess/domain/piece/CampTypeTest.java @@ -5,7 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class CampTypeTest { +class TeamColorTest { @ParameterizedTest(name = "입력받은 위치에 따라 진영을 나눈다.") @CsvSource(value = {"a:WHITE", "A:BLACK"}, delimiter = ':') diff --git a/src/test/java/chess/domain/piece/PieceTest.java b/src/test/java/chess/domain/piece/PieceTest.java index 823ecf1a369..e5dd5e915f1 100644 --- a/src/test/java/chess/domain/piece/PieceTest.java +++ b/src/test/java/chess/domain/piece/PieceTest.java @@ -1,8 +1,6 @@ package chess.domain.piece; import chess.domain.position.Position; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; @@ -24,30 +22,14 @@ private static Stream makePosition() { ); } - @Test - @DisplayName("두 개의 체스말이 동일한 진영에 속하는지 판단한다.") - void compareCamp() { - // given - final Piece piece = new WhitePawn(PieceType.PAWN); - final Piece other = new Queen(PieceType.QUEEN, TeamColor.WHITE); - final Piece otherCamp = new King(PieceType.KING, TeamColor.BLACK); - - // when, then - assertThat(piece.compareCamp(other)) - .isTrue(); - - assertThat(piece.compareCamp(otherCamp)) - .isFalse(); - } - @ParameterizedTest(name = "체스말이 입력받은 체스말과 동일한 진영인지 판단한다.") @CsvSource(value = {"WHITE:true", "BLACK:false"}, delimiter = ':') - void isSameCamp(final TeamColor campType, final boolean expected) { + void isSameTeamColor(final TeamColor teamColor, final boolean expected) { // given final Piece piece = new Knight(PieceType.KNIGHT, TeamColor.WHITE); // when, then - assertThat(piece.isSameTeam(campType)) + assertThat(piece.isSameTeam(teamColor)) .isSameAs(expected); } From b90ad885d8596e05af18ab232aa81d4d092fade0 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 21:29:46 +0900 Subject: [PATCH 37/71] =?UTF-8?q?docs=20:=204=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b6758441536..505390c8915 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,36 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) +## ✔ 4단계 기능 요구사항 + +- [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 +- [ ] table + - [ ] piece_type, team_color, rank, file, turn +- [ ] CRUD + - [ ] Create + - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 + - Query : + - [ ] Read + - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - Query : + - [ ] Update + - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 + - Query : + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 + - Query : ## ✔ 3단계 기능 요구사항 + - [x] King 이 잡혔을 때 게임 종료 - [x] status 명령 입력 시 점수 출력, 어느 진영이 이겼는지 출력 - - [x] commandType 에 status 추가 + - [x] commandType 에 status 추가 - [x] 점수 계산 - - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 - + - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 + - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 ## 1단계 피드백 사항 및 추가 수정 사항 + - [x] 출력 시 View 와 Domain 의존성 제거 - DTO 도입 - [x] 매직 넘버 상수화 - [x] 클래스 및 메소드 네이밍 의미있는 표현으로 변경 @@ -23,7 +42,6 @@ - [ ] Readme 에 네이밍 사전, 클래스 다이어그램, 프로그래밍 흐름도 정리하기 - [x] 예외 발생 시 재입력 - ## ✔ 1, 2단계 기능 요구사항 ### ChessBoard From f3bde69e3d177e26d57e4f6b9cde5caf750a6249 Mon Sep 17 00:00:00 2001 From: yenawee Date: Sun, 26 Mar 2023 23:54:59 +0900 Subject: [PATCH 38/71] =?UTF-8?q?refactor=20:=20package=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=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/chess/controller/ChessController.java | 2 +- src/main/java/chess/controller/ScoreDto.java | 2 +- src/main/java/chess/controller/state/End.java | 4 ++-- src/main/java/chess/controller/state/Move.java | 2 +- src/main/java/chess/controller/state/Start.java | 2 +- src/main/java/chess/controller/state/Status.java | 4 ++-- src/main/java/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/board/ChessBoardFactory.java | 2 +- src/main/java/chess/domain/{chess => game}/ChessGame.java | 2 +- src/main/java/chess/domain/{ => result}/Score.java | 2 +- src/test/java/chess/controller/state/MoveTest.java | 2 +- src/test/java/chess/controller/state/StartTest.java | 2 +- src/test/java/chess/domain/board/ChessBoardTest.java | 2 +- src/test/java/chess/domain/{chess => game}/ChessGameTest.java | 2 +- src/test/java/chess/domain/{ => result}/ScoreTest.java | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/chess/domain/{chess => game}/ChessGame.java (98%) rename src/main/java/chess/domain/{ => result}/Score.java (98%) rename src/test/java/chess/domain/{chess => game}/ChessGameTest.java (98%) rename src/test/java/chess/domain/{ => result}/ScoreTest.java (98%) diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 6a7b72f1052..0cc8ce48d53 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -2,7 +2,7 @@ import chess.controller.state.Start; import chess.controller.state.State; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.position.Position; import chess.view.InputView; diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index ec965177489..aaa77e01e1b 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -1,7 +1,7 @@ package chess.controller; -import chess.domain.Score; import chess.domain.piece.TeamColor; +import chess.domain.result.Score; public class ScoreDto { private final Double whiteScore; diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index b08358837f2..22d0356b315 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -2,8 +2,8 @@ import chess.controller.Command; import chess.controller.ScoreDto; -import chess.domain.Score; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; +import chess.domain.result.Score; import chess.view.OutputView; public final class End implements State { diff --git a/src/main/java/chess/controller/state/Move.java b/src/main/java/chess/controller/state/Move.java index 6ea5d249e6c..c78f60f25ca 100644 --- a/src/main/java/chess/controller/state/Move.java +++ b/src/main/java/chess/controller/state/Move.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; import chess.domain.position.Position; import chess.domain.position.PositionConverter; diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index 4ebc8e506b4..a51872006f0 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; public final class Start implements State { diff --git a/src/main/java/chess/controller/state/Status.java b/src/main/java/chess/controller/state/Status.java index 8ddffcd828a..767703fc38f 100644 --- a/src/main/java/chess/controller/state/Status.java +++ b/src/main/java/chess/controller/state/Status.java @@ -2,9 +2,9 @@ import chess.controller.Command; import chess.controller.ScoreDto; -import chess.domain.Score; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; +import chess.domain.result.Score; import chess.view.OutputView; public class Status implements State { diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 9d1a474fa36..74827a12437 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.piece.TeamColor; import chess.domain.position.Position; diff --git a/src/main/java/chess/domain/board/ChessBoardFactory.java b/src/main/java/chess/domain/board/ChessBoardFactory.java index 8526f30c60d..c1c4b78872f 100644 --- a/src/main/java/chess/domain/board/ChessBoardFactory.java +++ b/src/main/java/chess/domain/board/ChessBoardFactory.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; diff --git a/src/main/java/chess/domain/chess/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java similarity index 98% rename from src/main/java/chess/domain/chess/ChessGame.java rename to src/main/java/chess/domain/game/ChessGame.java index d428b16140b..834d6ea38ce 100644 --- a/src/main/java/chess/domain/chess/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -1,4 +1,4 @@ -package chess.domain.chess; +package chess.domain.game; import chess.domain.board.ChessBoard; import chess.domain.piece.Piece; diff --git a/src/main/java/chess/domain/Score.java b/src/main/java/chess/domain/result/Score.java similarity index 98% rename from src/main/java/chess/domain/Score.java rename to src/main/java/chess/domain/result/Score.java index 57d8fe83163..38382b735dd 100644 --- a/src/main/java/chess/domain/Score.java +++ b/src/main/java/chess/domain/result/Score.java @@ -1,4 +1,4 @@ -package chess.domain; +package chess.domain.result; import chess.domain.piece.Pawn; import chess.domain.piece.Piece; diff --git a/src/test/java/chess/controller/state/MoveTest.java b/src/test/java/chess/controller/state/MoveTest.java index bf5d3c360d3..53e5d4bf090 100644 --- a/src/test/java/chess/controller/state/MoveTest.java +++ b/src/test/java/chess/controller/state/MoveTest.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.TeamColor; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/chess/controller/state/StartTest.java b/src/test/java/chess/controller/state/StartTest.java index cae1f85c958..dfdbb82d264 100644 --- a/src/test/java/chess/controller/state/StartTest.java +++ b/src/test/java/chess/controller/state/StartTest.java @@ -1,7 +1,7 @@ package chess.controller.state; import chess.controller.Command; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/chess/domain/board/ChessBoardTest.java b/src/test/java/chess/domain/board/ChessBoardTest.java index 08a8fd5129d..112a5f9b09d 100644 --- a/src/test/java/chess/domain/board/ChessBoardTest.java +++ b/src/test/java/chess/domain/board/ChessBoardTest.java @@ -1,6 +1,6 @@ package chess.domain.board; -import chess.domain.chess.ChessGame; +import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/chess/domain/chess/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java similarity index 98% rename from src/test/java/chess/domain/chess/ChessGameTest.java rename to src/test/java/chess/domain/game/ChessGameTest.java index 21a8ed31ff5..0ca9802cc96 100644 --- a/src/test/java/chess/domain/chess/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -1,4 +1,4 @@ -package chess.domain.chess; +package chess.domain.game; import chess.domain.position.Position; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/chess/domain/ScoreTest.java b/src/test/java/chess/domain/result/ScoreTest.java similarity index 98% rename from src/test/java/chess/domain/ScoreTest.java rename to src/test/java/chess/domain/result/ScoreTest.java index 009b5a1ade2..bf377dd6b04 100644 --- a/src/test/java/chess/domain/ScoreTest.java +++ b/src/test/java/chess/domain/result/ScoreTest.java @@ -1,4 +1,4 @@ -package chess.domain; +package chess.domain.result; import chess.domain.piece.*; import chess.domain.position.Position; From 66a295f0c7be32e31955328e60a40cff83aea220 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 00:05:17 +0900 Subject: [PATCH 39/71] =?UTF-8?q?feat=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20ChessBoardFactory=20=EC=BA=90=EC=8B=B1=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0.=20ChessGame=20=EC=9D=84=20=ED=82=A4=EB=A1=9C=20?= =?UTF-8?q?=ED=95=98=EC=97=AC=20ChessBoard=20=EB=A5=BC=20=EC=BA=90?= =?UTF-8?q?=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/chess/domain/board/ChessBoard.java | 11 +++++++++-- .../chess/domain/board/ChessBoardFactory.java | 17 ----------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 74827a12437..f7686589a1d 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -6,9 +6,12 @@ import chess.domain.position.Position; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public final class ChessBoard { public static final int INITIAL_KING_COUNT = 2; + private static final Map CACHE = new ConcurrentHashMap<>(); + private final Map board; private ChessBoard(final Map board) { @@ -16,8 +19,12 @@ private ChessBoard(final Map board) { } public static ChessBoard getInstance(final ChessGame chessGame) { - final Map board = ChessBoardFactory.getInstance(chessGame).createBoard(); - return new ChessBoard(board); + if (CACHE.containsKey(chessGame)) { + return CACHE.get(chessGame); + } + final ChessBoard chessBoard = new ChessBoard(new ChessBoardFactory().createBoard()); + CACHE.put(chessGame, chessBoard); + return chessBoard; } public boolean contains(final Position position) { diff --git a/src/main/java/chess/domain/board/ChessBoardFactory.java b/src/main/java/chess/domain/board/ChessBoardFactory.java index c1c4b78872f..e3b1eee88a4 100644 --- a/src/main/java/chess/domain/board/ChessBoardFactory.java +++ b/src/main/java/chess/domain/board/ChessBoardFactory.java @@ -1,31 +1,14 @@ package chess.domain.board; -import chess.domain.game.ChessGame; import chess.domain.piece.*; import chess.domain.position.Position; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import static chess.domain.piece.PieceType.*; public final class ChessBoardFactory { - - private static final Map CACHE = new ConcurrentHashMap<>(); - - private ChessBoardFactory() { - } - - static ChessBoardFactory getInstance(final ChessGame chessGame) { - if (CACHE.containsKey(chessGame)) { - return CACHE.get(chessGame); - } - final ChessBoardFactory chessBoardFactory = new ChessBoardFactory(); - CACHE.put(chessGame, chessBoardFactory); - return chessBoardFactory; - } - public Map createBoard() { final Map board = new HashMap<>(); createWhiteArea(board); From a72d05d0ef766a8e5e31a6683936324562dc2c6c Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 00:18:08 +0900 Subject: [PATCH 40/71] =?UTF-8?q?feat=20:=20king=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=80=EC=84=9C=20=EC=A2=85=EB=A3=8C=EB=90=98=EC=97=88?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EC=97=90=EB=A7=8C=20status=20=EC=97=90=20?= =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=B6=9C=EB=A0=A5.=20=EC=95=84?= =?UTF-8?q?=EB=8B=90=20=EC=8B=9C=EC=97=90=EB=8A=94=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=EB=A7=8C=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/controller/ScoreDto.java | 10 ---------- src/main/java/chess/controller/state/End.java | 5 +++++ src/main/java/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/game/ChessGame.java | 4 ++++ src/main/java/chess/view/OutputView.java | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/chess/controller/ScoreDto.java b/src/main/java/chess/controller/ScoreDto.java index aaa77e01e1b..d6b7b84b0c7 100644 --- a/src/main/java/chess/controller/ScoreDto.java +++ b/src/main/java/chess/controller/ScoreDto.java @@ -19,14 +19,4 @@ public Double getWhiteScore() { public Double getBlackScore() { return blackScore; } - - public String getWinner() { - if (whiteScore.equals(blackScore)) { - return "무승부"; - } - if (whiteScore > blackScore) { - return "White"; - } - return "Black"; - } } diff --git a/src/main/java/chess/controller/state/End.java b/src/main/java/chess/controller/state/End.java index 22d0356b315..c00312dd7e1 100644 --- a/src/main/java/chess/controller/state/End.java +++ b/src/main/java/chess/controller/state/End.java @@ -3,6 +3,7 @@ import chess.controller.Command; import chess.controller.ScoreDto; import chess.domain.game.ChessGame; +import chess.domain.piece.TeamColor; import chess.domain.result.Score; import chess.view.OutputView; @@ -20,6 +21,10 @@ public boolean isRun() { public State run(ChessGame chessGame) { Score score = Score.calculate(chessGame.getChessBoard()); OutputView.printStatus(new ScoreDto(score)); + if (chessGame.isEnd()) { + TeamColor winner = chessGame.getCurrentTeamColor(); + OutputView.print(winner.name()); + } return new End(); } } diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index f7686589a1d..8ffde999c62 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -11,7 +11,7 @@ public final class ChessBoard { public static final int INITIAL_KING_COUNT = 2; private static final Map CACHE = new ConcurrentHashMap<>(); - + private final Map board; private ChessBoard(final Map board) { diff --git a/src/main/java/chess/domain/game/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java index 834d6ea38ce..c39f4042ca4 100644 --- a/src/main/java/chess/domain/game/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -51,4 +51,8 @@ public Map getChessBoard() { public boolean isEnd() { return chessBoard.checkKingDie(); } + + public TeamColor getCurrentTeamColor() { + return currentTeamColor; + } } diff --git a/src/main/java/chess/view/OutputView.java b/src/main/java/chess/view/OutputView.java index 1d55c5b67be..0951d2a130d 100644 --- a/src/main/java/chess/view/OutputView.java +++ b/src/main/java/chess/view/OutputView.java @@ -21,8 +21,8 @@ public static void printStartMessage() { } public static void printStatus(ScoreDto scoreDto) { - print(String.format("Black : %f, White : %f\n우승팀 : %s", - scoreDto.getBlackScore(), scoreDto.getWhiteScore(), scoreDto.getWinner())); + print(String.format("Black : %f, White : %f", + scoreDto.getBlackScore(), scoreDto.getWhiteScore())); System.out.println(System.lineSeparator()); } } From c883c3ae05ad164b058afabecb6dffdb58ce376a Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:00:09 +0900 Subject: [PATCH 41/71] =?UTF-8?q?docs=20:=20CRUD=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EB=AC=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 505390c8915..b8120a9d57c 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,39 @@ - [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 - [ ] table - - [ ] piece_type, team_color, rank, file, turn -- [ ] CRUD - - [ ] Create - - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 - - Query : - - [ ] Read - - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 - - Query : - - [ ] Update - - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 - - Query : - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 - - Query : + - [ ] Piece 정보 : piece_type, team_color, rank, file + - [ ] Chessgame 정보 : id, turn + - [ ] CRUD + - [ ] Create + - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 + - [ ] Read + - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - [ ] Update + - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 + - [ ] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 + +- Query +```sql +CREATE TABLE chess_game ( + piece_type VARCHAR(255), + piece_rank VARCHAR(255) NOT NULL, + piece_file VARCHAR(255) NOT NULL, + team VARCHAR(255), + turn VARCHAR(255) NOT NULL +) + +SELECT piece_type, piece_rank, piece_file, team, turn from chess_game; + +INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?); + +DELETE FROM chess_game; + +TRUNCATE TABLE chess_game; + +``` + ## ✔ 3단계 기능 요구사항 From 2045f4e806b7cf157d491637b11ddcb4ba1d8603 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:00:40 +0900 Subject: [PATCH 42/71] =?UTF-8?q?feat=20:=20DB=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/DBConnection.java | 25 +++++++++++++++++++ src/test/java/chess/dao/DBConnectionTest.java | 18 +++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/main/java/chess/dao/DBConnection.java create mode 100644 src/test/java/chess/dao/DBConnectionTest.java diff --git a/src/main/java/chess/dao/DBConnection.java b/src/main/java/chess/dao/DBConnection.java new file mode 100644 index 00000000000..a8d3d33830c --- /dev/null +++ b/src/main/java/chess/dao/DBConnection.java @@ -0,0 +1,25 @@ +package chess.dao; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class DBConnection { + private static final String SERVER = "localhost:13306"; // MySQL 서버 주소 + private static final String DATABASE = "chess"; // MySQL DATABASE 이름 + private static final String OPTION = "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"; + private static final String USERNAME = "root"; // MySQL 서버 아이디 + private static final String PASSWORD = "root"; // MySQL 서버 비밀번호 + + public Connection getConnection() { + // 드라이버 연결 + try { + return DriverManager.getConnection("jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION, USERNAME, PASSWORD); + } catch (final SQLException e) { + System.err.println("DB 연결 오류:" + e.getMessage()); + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/test/java/chess/dao/DBConnectionTest.java b/src/test/java/chess/dao/DBConnectionTest.java new file mode 100644 index 00000000000..d9f518ef7e2 --- /dev/null +++ b/src/test/java/chess/dao/DBConnectionTest.java @@ -0,0 +1,18 @@ +package chess.dao; + +import org.junit.jupiter.api.Test; + +import java.sql.SQLException; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class DBConnectionTest { + private final DBConnection dbConnection = new DBConnection(); + + @Test + public void connection() throws SQLException { + try (final var connection = dbConnection.getConnection()) { + assertThat(connection).isNotNull(); + } + } +} From 6da294d152c480a1ef77179b4025b1dd2da43c52 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:03:10 +0900 Subject: [PATCH 43/71] =?UTF-8?q?feat=20:=20PieceType,=20TeamColor=20?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=94=ED=83=95=EC=9C=BC=EB=A1=9C=20Piece=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=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/chess/domain/piece/Pawn.java | 11 +++++-- src/main/java/chess/domain/piece/Piece.java | 4 +++ .../java/chess/domain/piece/PieceType.java | 29 +++++++++++++++---- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index a4f17707f60..5cb3fcdcf8a 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -2,7 +2,7 @@ import chess.domain.position.Position; -public abstract class Pawn extends Piece { +public class Pawn extends Piece { protected static final int PAWN_MAX_MOVE_COUNT = 1; protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; private static final Double VALUE = 1.0; @@ -20,7 +20,9 @@ public static Double calculateScore(int count) { return VALUE_SAME_FILE * count; } - abstract boolean canAttack(Position source, Position target, Piece piece); + boolean canAttack(Position source, Position target, Piece piece) { + return false; + } @Override public boolean isPawn() { @@ -31,4 +33,9 @@ public boolean isPawn() { public Double getValue() { return null; } + + @Override + public boolean canMove(Position source, Position target, Piece targetPiece) { + return false; + } } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index 1ea8a351db1..80ccad25e11 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -29,6 +29,10 @@ public boolean isPawn() { public abstract Double getValue(); + public TeamColor getTeamColor() { + return teamColor; + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/main/java/chess/domain/piece/PieceType.java b/src/main/java/chess/domain/piece/PieceType.java index e61a1ce622f..d1667a568e9 100644 --- a/src/main/java/chess/domain/piece/PieceType.java +++ b/src/main/java/chess/domain/piece/PieceType.java @@ -1,10 +1,27 @@ package chess.domain.piece; +import java.util.Arrays; +import java.util.function.BiFunction; + public enum PieceType { - QUEEN, - ROOK, - KNIGHT, - PAWN, - BISHOP, - KING + QUEEN(Queen::new), + ROOK(Rook::new), + KNIGHT(Knight::new), + PAWN(Pawn::new), + BISHOP(Bishop::new), + KING(King::new); + + private final BiFunction toPiece; + + PieceType(BiFunction toPiece) { + this.toPiece = toPiece; + } + + public static Piece toPiece(final PieceType pieceType, final TeamColor color) { + return Arrays.stream(values()) + .filter(it -> it.name().equalsIgnoreCase(pieceType.name())) + .map(it -> it.toPiece.apply(pieceType, color)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("기물을 찾을 수 없습니다.")); + } } From b4961827c1d259b57a9bb8364daa96cdff1192f4 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:04 +0900 Subject: [PATCH 44/71] =?UTF-8?q?feat=20:=20ChessGameDao=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D=EC=84=B1,=20DB?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0=20=EC=A0=84=20InMemomryChessGameDao=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessGameDao.java | 12 ++++++++++ .../java/chess/dao/InMemoryChessGameDao.java | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/chess/dao/ChessGameDao.java create mode 100644 src/main/java/chess/dao/InMemoryChessGameDao.java diff --git a/src/main/java/chess/dao/ChessGameDao.java b/src/main/java/chess/dao/ChessGameDao.java new file mode 100644 index 00000000000..e83424e2d5f --- /dev/null +++ b/src/main/java/chess/dao/ChessGameDao.java @@ -0,0 +1,12 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public interface ChessGameDao { + void save(ChessGame chessGame); + + ChessGame select(); + + void update(ChessGame chessGame); + +} diff --git a/src/main/java/chess/dao/InMemoryChessGameDao.java b/src/main/java/chess/dao/InMemoryChessGameDao.java new file mode 100644 index 00000000000..d41de03bcbc --- /dev/null +++ b/src/main/java/chess/dao/InMemoryChessGameDao.java @@ -0,0 +1,24 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public class InMemoryChessGameDao implements ChessGameDao { + private ChessGame chessGame; + + @Override + public void save(ChessGame chessGame) { + this.chessGame = chessGame; + + } + + @Override + public ChessGame select() { + return chessGame; + } + + @Override + public void update(ChessGame chessGame) { + this.chessGame = chessGame; + + } +} From d13c399ef34ef1c5f1b526e0025ba4ca1c909ffc Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:30 +0900 Subject: [PATCH 45/71] =?UTF-8?q?feat=20:=20ChessGameLoader=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessGameLoader.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/chess/dao/ChessGameLoader.java diff --git a/src/main/java/chess/dao/ChessGameLoader.java b/src/main/java/chess/dao/ChessGameLoader.java new file mode 100644 index 00000000000..c01f346cc4b --- /dev/null +++ b/src/main/java/chess/dao/ChessGameLoader.java @@ -0,0 +1,16 @@ +package chess.dao; + +import chess.domain.game.ChessGame; + +public class ChessGameLoader { + public static ChessGame load(ChessGameDao chessGameDao) { + // 조회 + ChessGame chessGame = chessGameDao.select(); + if (chessGame == null) { + chessGame = new ChessGame(); + // 생성 후 저장 + chessGameDao.save(chessGame); + } + return chessGame; + } +} From 9e1be36604ae749ba23cb449b8fa0fa833a1e25e Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:04:57 +0900 Subject: [PATCH 46/71] =?UTF-8?q?feat=20:=20ChessBoard,=20ChessGame=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=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/chess/domain/board/ChessBoard.java | 2 +- src/main/java/chess/domain/game/ChessGame.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index 8ffde999c62..ae8d3cfa665 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -14,7 +14,7 @@ public final class ChessBoard { private final Map board; - private ChessBoard(final Map board) { + public ChessBoard(final Map board) { this.board = board; } diff --git a/src/main/java/chess/domain/game/ChessGame.java b/src/main/java/chess/domain/game/ChessGame.java index c39f4042ca4..b9da70dd34e 100644 --- a/src/main/java/chess/domain/game/ChessGame.java +++ b/src/main/java/chess/domain/game/ChessGame.java @@ -13,6 +13,12 @@ public final class ChessGame { public ChessGame() { this.chessBoard = ChessBoard.getInstance(this); + this.currentTeamColor = TeamColor.WHITE; + } + + public ChessGame(final ChessBoard chessBoard, final TeamColor turn) { + this.chessBoard = chessBoard; + this.currentTeamColor = turn; } public void setUp(final Position source, final Position target, final TeamColor teamColor) { From e76dc72f16cbf72e97e3f66517f6b1b20ff6b692 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:05:19 +0900 Subject: [PATCH 47/71] =?UTF-8?q?test=20:=20ChessGame=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/domain/game/ChessGameTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/test/java/chess/domain/game/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java index 0ca9802cc96..26b203e818d 100644 --- a/src/test/java/chess/domain/game/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -5,22 +5,21 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatNoException; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; class ChessGameTest { @ParameterizedTest(name = "첫 턴은 백진영의 폰과 나이트만 움직이는지 검증한다.") - @CsvSource(value = {"6:0", "0:3"}, delimiter = ':') + @CsvSource(value = {"1:0", "0:1"}, delimiter = ':') void playMovableFail(final int rank, final int file) { // given final ChessGame chessGame = new ChessGame(); final Position source = Position.of(rank, file); - final Position target = Position.of(5, 0); + final Position target = Position.of(2, 0); // when, then - assertThatThrownBy(() -> chessGame.play(source, target)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + assertThatNoException().isThrownBy(() -> chessGame.play(source, target)); } @ParameterizedTest(name = "첫 턴의 폰은 2칸 이내만 전진할 수 있는지 검증한다.") @@ -34,7 +33,7 @@ void playFirstTurnMovePawnFail(final int rank) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); } @ParameterizedTest(name = "첫 턴의 나이트는 L자로 전진할 수 있는지 검증한다.") @@ -48,6 +47,6 @@ void playFirstTurnMoveKnightFail(final int rank, final int file) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("현재 차례가 아닙니다."); + .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); } } From 629c160d53674893a879bdbc8f54b1f0e194cfc6 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:05:58 +0900 Subject: [PATCH 48/71] =?UTF-8?q?feat=20:=20ChessBoardDao=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(DB=20connection)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/ChessApplication.java | 3 +- .../chess/controller/ChessController.java | 13 +++- src/main/java/chess/dao/ChessBoardDao.java | 77 +++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/main/java/chess/dao/ChessBoardDao.java diff --git a/src/main/java/chess/ChessApplication.java b/src/main/java/chess/ChessApplication.java index 468aaaf1f63..a8b66b97dd7 100644 --- a/src/main/java/chess/ChessApplication.java +++ b/src/main/java/chess/ChessApplication.java @@ -1,10 +1,11 @@ package chess; import chess.controller.ChessController; +import chess.dao.ChessBoardDao; public class ChessApplication { public static void main(String[] args) { - final ChessController chessController = new ChessController(); + final ChessController chessController = new ChessController(new ChessBoardDao()); chessController.run(); } } diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 0cc8ce48d53..870b94d5abc 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -2,6 +2,8 @@ import chess.controller.state.Start; import chess.controller.state.State; +import chess.dao.ChessGameDao; +import chess.dao.ChessGameLoader; import chess.domain.game.ChessGame; import chess.domain.piece.Piece; import chess.domain.position.Position; @@ -13,10 +15,15 @@ import java.util.function.Consumer; public class ChessController { + private final ChessGameDao chessGameDao; + + public ChessController(final ChessGameDao chessGameDao) { + this.chessGameDao = chessGameDao; + } public void run() { OutputView.printStartMessage(); - final ChessGame chessGame = new ChessGame(); + ChessGame chessGame = ChessGameLoader.load(chessGameDao); play(chessGame, gameStatus -> { if (gameStatus.isRun()) { printChessBoard(chessGame.getChessBoard()); @@ -24,10 +31,12 @@ public void run() { }); } - private void play(final ChessGame chessGame, Consumer consumer) { + private void play(ChessGame chessGame, Consumer consumer) { State gameStatus = new Start(chessGame); while (gameStatus.isRun()) { gameStatus = getStatus(gameStatus); + // 명령 실행 시 마다 업데이트 + chessGameDao.update(chessGame); consumer.accept(gameStatus); } } diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java new file mode 100644 index 00000000000..c331046e84d --- /dev/null +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -0,0 +1,77 @@ +package chess.dao; + +import chess.domain.board.ChessBoard; +import chess.domain.game.ChessGame; +import chess.domain.piece.Piece; +import chess.domain.piece.PieceType; +import chess.domain.piece.TeamColor; +import chess.domain.position.Position; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +public class ChessBoardDao implements ChessGameDao { + private static final DBConnection dbConnection = new DBConnection(); + + @Override + public void save(ChessGame chessGame) { + Map board = chessGame.getChessBoard(); + for (Map.Entry boardEntry : board.entrySet()) { + final var query = "INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?)"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, boardEntry.getValue().getPieceType().name()); + preparedStatement.setString(2, Integer.toString(boardEntry.getKey().getRank())); + preparedStatement.setString(3, Integer.toString(boardEntry.getKey().getFile())); + preparedStatement.setString(4, boardEntry.getValue().getTeamColor().name()); + preparedStatement.setString(5, chessGame.getCurrentTeamColor().name()); + preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public ChessGame select() { + Map board = new HashMap<>(); + TeamColor turn = null; + final var query = "SELECT piece_type, piece_rank, piece_file, team, turn FROM chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + PieceType pieceType = PieceType.valueOf(resultSet.getString("piece_type")); + int rank = Integer.parseInt(resultSet.getString("piece_rank")); + int file = Integer.parseInt(resultSet.getString("piece_file")); + TeamColor teamColor = TeamColor.valueOf(resultSet.getString("team")); + turn = TeamColor.valueOf(resultSet.getString("turn")); + Piece piece = PieceType.toPiece(pieceType, teamColor); + board.put(Position.of(rank, file), piece); + } + } catch (final SQLException e) { + throw new RuntimeException(e); + } + if (board.isEmpty()) { + return null; + } + return new ChessGame(new ChessBoard(board), turn); + } + + @Override + public void update(ChessGame chessGame) { + delete(chessGame); + save(chessGame); + } + + public void delete(ChessGame chessGame) { + final var query = "DELETE from chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } +} From 4ca82a3deb758e33ad7edc6ce057205cf435186b Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:06:56 +0900 Subject: [PATCH 49/71] =?UTF-8?q?feat=20:=20Move=20=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EC=8B=9C=20=ED=98=84=EC=9E=AC=20=ED=8C=80=EC=9D=80=20chessG?= =?UTF-8?q?ame=20=EC=97=90=EC=84=9C=20=EB=B0=9B=EC=95=84=EC=98=A8=20?= =?UTF-8?q?=ED=8C=80=EC=9C=BC=EB=A1=9C=20=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EA=B2=8C=EB=81=94=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/chess/controller/state/Start.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/chess/controller/state/Start.java b/src/main/java/chess/controller/state/Start.java index a51872006f0..2ef14a10b81 100644 --- a/src/main/java/chess/controller/state/Start.java +++ b/src/main/java/chess/controller/state/Start.java @@ -2,7 +2,6 @@ import chess.controller.Command; import chess.domain.game.ChessGame; -import chess.domain.piece.TeamColor; public final class Start implements State { @@ -15,7 +14,7 @@ public Start(final ChessGame chessGame) { @Override public State checkCommand(final Command command) { if (command.isStart()) { - return new Move(chessGame, TeamColor.WHITE); + return new Move(chessGame, chessGame.getCurrentTeamColor()); } if (command.isEnd()) { return new End(); From a038e53f64d700fdf6eec4442471cf819e0f2bd9 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:07:15 +0900 Subject: [PATCH 50/71] =?UTF-8?q?feat=20:=20CREATE=20TABLE=20chess=5Fgame?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=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/chess/docker/init.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/chess/docker/init.sql diff --git a/src/main/java/chess/docker/init.sql b/src/main/java/chess/docker/init.sql new file mode 100644 index 00000000000..e3a58e2e148 --- /dev/null +++ b/src/main/java/chess/docker/init.sql @@ -0,0 +1,8 @@ +CREATE TABLE chess_game +( + piece_type VARCHAR(255), + piece_rank VARCHAR(255) NOT NULL, + piece_file VARCHAR(255) NOT NULL, + team VARCHAR(255), + turn VARCHAR(255) NOT NULL +); From 8b1db28f14be021c9a66f1391db7e9acfd6ca615 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 04:09:15 +0900 Subject: [PATCH 51/71] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=82=AC=ED=95=AD=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b8120a9d57c..8fd5cb87e76 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,20 @@ ## ✔ 4단계 기능 요구사항 -- [ ] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 +- [x] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 - [ ] table - - [ ] Piece 정보 : piece_type, team_color, rank, file + - [x] Piece 정보 : piece_type, team_color, rank, file - [ ] Chessgame 정보 : id, turn - - [ ] CRUD - - [ ] Create - - [ ] DB에서 불러 올 체스 게임이 없으면 만든다 - - [ ] Read - - [ ] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 - - [ ] Update - - [ ] 기물을 움직일 때마다 DB 업데이트 해준다 - - [ ] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 + - [ ] CRUD + - [x] Create + - [x] DB에서 불러 올 체스 게임이 없으면 만든다 + - [x] Read + - [x] DB에 체스 게임 정보가 저장되어 있다면 DB에서 읽어온다 + - [x] Update + - [x] 기물을 움직일 때마다 DB 업데이트 해준다 + - [x] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) + - [ ] Delete + - [ ] King 이 죽으면 DB 초기화 해준다 - Query ```sql From 3c937a6b283a3ba375dd9fb5dc9f12ab9ef2b96f Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 09:46:22 +0900 Subject: [PATCH 52/71] =?UTF-8?q?fix=20:=20=EB=8B=A4=EC=9D=8C=20=EC=B2=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B2=8C=EC=9E=84=EC=9D=B4=20=EC=8B=9C=EC=9E=91?= =?UTF-8?q?=EB=90=A0=20=EB=95=8C=EB=8A=94=20=ED=98=84=EC=9E=AC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EB=90=98=EC=96=B4=20=EC=9E=88=EB=8A=94=20turn=20?= =?UTF-8?q?=EA=B3=BC=20=EB=8B=A4=EB=A5=B8=20=ED=8C=80=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EB=90=98=EC=96=B4=EC=95=BC=20=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/dao/ChessBoardDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index c331046e84d..c47615cf372 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -56,7 +56,7 @@ public ChessGame select() { if (board.isEmpty()) { return null; } - return new ChessGame(new ChessBoard(board), turn); + return new ChessGame(new ChessBoard(board), turn.changeTurn()); } @Override From 157e5a5d8ed5f8fbbd6c048dbb32d120ab678fd0 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 09:46:46 +0900 Subject: [PATCH 53/71] =?UTF-8?q?fix=20:=20Select=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EC=8B=9C=20Pawn=20=EC=9D=80=20BlackPawn,?= =?UTF-8?q?=20WhitePawn=20=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=88=A0=EC=84=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=ED=95=B4=EC=95=BC=20=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/PieceType.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/chess/domain/piece/PieceType.java b/src/main/java/chess/domain/piece/PieceType.java index d1667a568e9..f9483a3ab68 100644 --- a/src/main/java/chess/domain/piece/PieceType.java +++ b/src/main/java/chess/domain/piece/PieceType.java @@ -18,10 +18,20 @@ public enum PieceType { } public static Piece toPiece(final PieceType pieceType, final TeamColor color) { + if (pieceType == PAWN) { + return getPawn(color); + } return Arrays.stream(values()) .filter(it -> it.name().equalsIgnoreCase(pieceType.name())) .map(it -> it.toPiece.apply(pieceType, color)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("기물을 찾을 수 없습니다.")); } + + private static Pawn getPawn(TeamColor color) { + if (color == TeamColor.BLACK) { + return new BlackPawn(PieceType.PAWN); + } + return new WhitePawn(PieceType.PAWN); + } } From 2a2998bb5822a51d742bfc8aa9c19f355de6bd14 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:00:12 +0900 Subject: [PATCH 54/71] =?UTF-8?q?feat=20:=20king=20=EC=9D=B4=20=EC=9E=A1?= =?UTF-8?q?=ED=98=80=EC=84=9C=20=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=8B=9C=EC=97=94=20DB=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- src/main/java/chess/controller/ChessController.java | 4 ++++ src/main/java/chess/dao/ChessBoardDao.java | 11 +++++++++++ src/main/java/chess/dao/ChessGameDao.java | 1 + src/main/java/chess/dao/InMemoryChessGameDao.java | 4 ++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8fd5cb87e76..f1f930e4115 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ ## ✔ 4단계 기능 요구사항 - [x] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 -- [ ] table +- [x] table - [x] Piece 정보 : piece_type, team_color, rank, file - - [ ] Chessgame 정보 : id, turn - - [ ] CRUD + - [x] Chessgame 정보 : turn (chessGame id 는 추후 적용 필요) + - [x] CRUD - [x] Create - [x] DB에서 불러 올 체스 게임이 없으면 만든다 - [x] Read @@ -16,8 +16,8 @@ - [x] Update - [x] 기물을 움직일 때마다 DB 업데이트 해준다 - [x] 우선 delete 후 save 로 구현 (UPDATE 쿼리 사용으로 변경 필요) - - [ ] Delete - - [ ] King 이 죽으면 DB 초기화 해준다 + - [x] Delete + - [x] King 이 죽으면 DB 초기화 해준다 - Query ```sql diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 870b94d5abc..93406a2cba6 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -29,6 +29,10 @@ public void run() { printChessBoard(chessGame.getChessBoard()); } }); + if (chessGame.isEnd()) { + // king 이 잡혀서 게임이 종료되면 DB 초기화 + chessGameDao.init(chessGame); + } } private void play(ChessGame chessGame, Consumer consumer) { diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index c47615cf372..eb28e9ac2db 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -74,4 +74,15 @@ public void delete(ChessGame chessGame) { throw new RuntimeException(e); } } + + @Override + public void init(ChessGame chessGame) { + final var query = "TRUNCATE TABLE chess_game"; + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + final var resultSet = preparedStatement.executeUpdate(); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/chess/dao/ChessGameDao.java b/src/main/java/chess/dao/ChessGameDao.java index e83424e2d5f..c92dd97c755 100644 --- a/src/main/java/chess/dao/ChessGameDao.java +++ b/src/main/java/chess/dao/ChessGameDao.java @@ -9,4 +9,5 @@ public interface ChessGameDao { void update(ChessGame chessGame); + void init(ChessGame chessGame); } diff --git a/src/main/java/chess/dao/InMemoryChessGameDao.java b/src/main/java/chess/dao/InMemoryChessGameDao.java index d41de03bcbc..502b27e81e8 100644 --- a/src/main/java/chess/dao/InMemoryChessGameDao.java +++ b/src/main/java/chess/dao/InMemoryChessGameDao.java @@ -19,6 +19,10 @@ public ChessGame select() { @Override public void update(ChessGame chessGame) { this.chessGame = chessGame; + } + @Override + public void init(ChessGame chessGame) { + this.chessGame = null; } } From 3b4087a836b3acd799bdc94a7340dd1168bb21e7 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:07:15 +0900 Subject: [PATCH 55/71] =?UTF-8?q?feat=20:=20chess=5Fgame=20table=20?= =?UTF-8?q?=EC=9D=98=20piece=5Frank,=20piece=5Ffile=20=EC=9E=90=EB=A3=8C?= =?UTF-8?q?=ED=98=95=EC=9D=84=20TINYINT=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/chess/dao/ChessBoardDao.java | 8 ++++---- src/main/java/chess/docker/init.sql | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index eb28e9ac2db..e25e3b2fdc6 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -22,8 +22,8 @@ public void save(ChessGame chessGame) { try (final var connection = dbConnection.getConnection(); final var preparedStatement = connection.prepareStatement(query)) { preparedStatement.setString(1, boardEntry.getValue().getPieceType().name()); - preparedStatement.setString(2, Integer.toString(boardEntry.getKey().getRank())); - preparedStatement.setString(3, Integer.toString(boardEntry.getKey().getFile())); + preparedStatement.setInt(2, boardEntry.getKey().getRank()); + preparedStatement.setInt(3, boardEntry.getKey().getFile()); preparedStatement.setString(4, boardEntry.getValue().getTeamColor().name()); preparedStatement.setString(5, chessGame.getCurrentTeamColor().name()); preparedStatement.executeUpdate(); @@ -43,8 +43,8 @@ public ChessGame select() { final var resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { PieceType pieceType = PieceType.valueOf(resultSet.getString("piece_type")); - int rank = Integer.parseInt(resultSet.getString("piece_rank")); - int file = Integer.parseInt(resultSet.getString("piece_file")); + int rank = resultSet.getInt("piece_rank"); + int file = resultSet.getInt("piece_file"); TeamColor teamColor = TeamColor.valueOf(resultSet.getString("team")); turn = TeamColor.valueOf(resultSet.getString("turn")); Piece piece = PieceType.toPiece(pieceType, teamColor); diff --git a/src/main/java/chess/docker/init.sql b/src/main/java/chess/docker/init.sql index e3a58e2e148..fc7e6bd413b 100644 --- a/src/main/java/chess/docker/init.sql +++ b/src/main/java/chess/docker/init.sql @@ -1,8 +1,8 @@ CREATE TABLE chess_game ( piece_type VARCHAR(255), - piece_rank VARCHAR(255) NOT NULL, - piece_file VARCHAR(255) NOT NULL, + piece_rank TINYINT(10) NOT NULL, + piece_file TINYINT(10) NOT NULL, team VARCHAR(255), turn VARCHAR(255) NOT NULL ); From d8e9d977754df379d35b8bd7507a3ccf8ef4028f Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:39:04 +0900 Subject: [PATCH 56/71] =?UTF-8?q?refactor=20:=20source=20=EC=99=80=20targe?= =?UTF-8?q?t=20=EC=9D=98=20=EC=9C=84=EC=B9=98=EA=B0=80=20=EC=83=81?= =?UTF-8?q?=ED=96=A5=20=EB=8C=80=EA=B0=81=EC=84=A0=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=ED=95=98=ED=96=A5=EB=8C=80=EA=B0=81=EC=84=A0=EC=9D=B8=EC=A7=80?= =?UTF-8?q?=20=ED=8C=90=EB=8B=A8=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=9D=84=20Direction=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=B4=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/chess/domain/piece/Direction.java | 9 +++++++++ src/main/java/chess/domain/position/Position.java | 13 ++++++------- src/test/java/chess/domain/game/ChessGameTest.java | 3 +-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/chess/domain/piece/Direction.java b/src/main/java/chess/domain/piece/Direction.java index 8814219d31c..c2d241b0615 100644 --- a/src/main/java/chess/domain/piece/Direction.java +++ b/src/main/java/chess/domain/piece/Direction.java @@ -2,6 +2,7 @@ import chess.domain.position.Position; +import java.util.Arrays; import java.util.List; public enum Direction { @@ -37,4 +38,12 @@ public static List getDiagonalDirections() { public Position calculate(final Position before) { return before.calculate(this.rankMove, this.fileMove); } + + public static Direction findDirection(final int file, final int rank) { + return Arrays.stream(values()) + .filter(it -> it.fileMove == file) + .filter(it -> it.rankMove == rank) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("방향을 찾을 수 없습니다.")); + } } diff --git a/src/main/java/chess/domain/position/Position.java b/src/main/java/chess/domain/position/Position.java index cd97f9c5980..e9c4ac515d9 100644 --- a/src/main/java/chess/domain/position/Position.java +++ b/src/main/java/chess/domain/position/Position.java @@ -1,5 +1,7 @@ package chess.domain.position; +import chess.domain.piece.Direction; + import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -58,16 +60,13 @@ private int getGcdGap(int fileGap, int rankGap) { } public boolean isUpsideDiagonalPosition(Position target) { - int fileGap = target.file - this.file; - int rankGap = target.rank - this.rank; - return Math.abs(fileGap) == 1 && rankGap == 1; + Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); + return direction.equals(Direction.UP_LEFT) || direction.equals(Direction.UP_RIGHT); } public boolean isDownSideDiagonalPosition(Position target) { - int fileGap = target.file - this.file; - int rankGap = target.rank - this.rank; - return Math.abs(fileGap) == 1 && rankGap == -1; - + Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); + return direction.equals(Direction.DOWN_LEFT) || direction.equals(Direction.DOWN_RIGHT); } @Override diff --git a/src/test/java/chess/domain/game/ChessGameTest.java b/src/test/java/chess/domain/game/ChessGameTest.java index 26b203e818d..3f22db8dd5d 100644 --- a/src/test/java/chess/domain/game/ChessGameTest.java +++ b/src/test/java/chess/domain/game/ChessGameTest.java @@ -32,8 +32,7 @@ void playFirstTurnMovePawnFail(final int rank) { // when, then assertThatThrownBy(() -> chessGame.play(source, target)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("기물 규칙 상 움직일 수 없는 위치입니다."); + .isInstanceOf(IllegalArgumentException.class); } @ParameterizedTest(name = "첫 턴의 나이트는 L자로 전진할 수 있는지 검증한다.") From d763820a0c78dbb103daf63802f72b88b2af2a89 Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 10:40:07 +0900 Subject: [PATCH 57/71] =?UTF-8?q?style=20:=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/domain/piece/Direction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/chess/domain/piece/Direction.java b/src/main/java/chess/domain/piece/Direction.java index c2d241b0615..683b3f91334 100644 --- a/src/main/java/chess/domain/piece/Direction.java +++ b/src/main/java/chess/domain/piece/Direction.java @@ -35,10 +35,6 @@ public static List getDiagonalDirections() { return List.of(UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT); } - public Position calculate(final Position before) { - return before.calculate(this.rankMove, this.fileMove); - } - public static Direction findDirection(final int file, final int rank) { return Arrays.stream(values()) .filter(it -> it.fileMove == file) @@ -46,4 +42,8 @@ public static Direction findDirection(final int file, final int rank) { .findFirst() .orElseThrow(() -> new IllegalArgumentException("방향을 찾을 수 없습니다.")); } + + public Position calculate(final Position before) { + return before.calculate(this.rankMove, this.fileMove); + } } From 74200e422ba392f6b10ca5b633d2dce4828cb27d Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 14:07:53 +0900 Subject: [PATCH 58/71] =?UTF-8?q?feat=20:=20docker=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=8B=9C=20chessgame=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chess/docker/{ => db/mysql/init}/init.sql | 4 ++-- src/main/java/chess/docker/docker-compose.yml | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) rename src/main/java/chess/docker/{ => db/mysql/init}/init.sql (64%) create mode 100644 src/main/java/chess/docker/docker-compose.yml diff --git a/src/main/java/chess/docker/init.sql b/src/main/java/chess/docker/db/mysql/init/init.sql similarity index 64% rename from src/main/java/chess/docker/init.sql rename to src/main/java/chess/docker/db/mysql/init/init.sql index fc7e6bd413b..5c04c039cb3 100644 --- a/src/main/java/chess/docker/init.sql +++ b/src/main/java/chess/docker/db/mysql/init/init.sql @@ -1,8 +1,8 @@ CREATE TABLE chess_game ( - piece_type VARCHAR(255), + piece_type VARCHAR(255) NOT NULL, piece_rank TINYINT(10) NOT NULL, piece_file TINYINT(10) NOT NULL, - team VARCHAR(255), + team VARCHAR(255) NOT NULL, turn VARCHAR(255) NOT NULL ); diff --git a/src/main/java/chess/docker/docker-compose.yml b/src/main/java/chess/docker/docker-compose.yml new file mode 100644 index 00000000000..f9fa3218791 --- /dev/null +++ b/src/main/java/chess/docker/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3.9' +services: + db: + image: mysql:8.0.28 + platform: linux/x86_64 + restart: always + ports: + - '13306:3306' + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: chess + MYSQL_USER: user + MYSQL_PASSWORD: password + TZ: Asia/Seoul + volumes: + - ./db/mysql/data:/var/lib/mysql + - ./db/mysql/config:/etc/mysql/conf.d + - ./db/mysql/init:/docker-entrypoint-initdb.d From 692af060cb2d1c4f17afddd9ab5c8617880b250f Mon Sep 17 00:00:00 2001 From: yenawee Date: Mon, 27 Mar 2023 16:03:42 +0900 Subject: [PATCH 59/71] =?UTF-8?q?docs=20:=20chess=5Fgame=20table=20?= =?UTF-8?q?=EC=9E=90=EB=A3=8C=ED=98=95=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f1f930e4115..c4bf26d9829 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,10 @@ - Query ```sql CREATE TABLE chess_game ( - piece_type VARCHAR(255), - piece_rank VARCHAR(255) NOT NULL, - piece_file VARCHAR(255) NOT NULL, - team VARCHAR(255), + piece_type VARCHAR(255) NOT NULL, + piece_rank TINYINT(10) NOT NULL, + piece_file TINYINT(10) NOT NULL, + team VARCHAR(255) NOT NULL, turn VARCHAR(255) NOT NULL ) From 8b3b61a0785386c972b7ef60d9ca26f12a322108 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 14:10:13 +0900 Subject: [PATCH 60/71] =?UTF-8?q?.gitignore=20=EC=97=90=20docker=20file=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 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6c018781387..af5c2f4188b 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ out/ ### VS Code ### .vscode/ + +### docker ### +./main/java/chess/docker/db.mysql From 1cbffc1cd99fb742b9f739d781ebdd41b6abf576 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 14:18:30 +0900 Subject: [PATCH 61/71] =?UTF-8?q?docs=20:=203,=204=20=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=82=AC=ED=95=AD=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c4bf26d9829..425e6a2bcba 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,15 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) +## 3, 4 단계 피드백 사항 및 추가 수정사항 +- [ ] Readme 에 도커 환경 세팅 설명 추가 +- [ ] DB connect 연결 에러 발생 시 처리 +- [ ] 매직 넘버 상수화 및 메소드 이름 구체화 +- [ ] Command 처리 로직 수정 +- [ ] 하나의 요청에 대해 하나의 Connection 으로 처리하도록 수정 +- [ ] update 쿼리 수정 + + ## ✔ 4단계 기능 요구사항 - [x] 애플리케이션 재시작 시 이전에 하던 체스 게임을 재시작할 수 있어야 한다 @@ -19,27 +28,6 @@ - [x] Delete - [x] King 이 죽으면 DB 초기화 해준다 -- Query -```sql -CREATE TABLE chess_game ( - piece_type VARCHAR(255) NOT NULL, - piece_rank TINYINT(10) NOT NULL, - piece_file TINYINT(10) NOT NULL, - team VARCHAR(255) NOT NULL, - turn VARCHAR(255) NOT NULL -) - -SELECT piece_type, piece_rank, piece_file, team, turn from chess_game; - -INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?); - -DELETE FROM chess_game; - -TRUNCATE TABLE chess_game; - -``` - - ## ✔ 3단계 기능 요구사항 - [x] King 이 잡혔을 때 게임 종료 @@ -49,7 +37,7 @@ TRUNCATE TABLE chess_game; - [x] Queen : 9, Rook : 5, Bishop : 3, Knight : 2.5 - [x] Pawn : 기본 1. 같은 세로 줄에 같은 색의 폰이 있으면 0.5 -## 1단계 피드백 사항 및 추가 수정 사항 +## 1, 2단계 피드백 사항 및 추가 수정 사항 - [x] 출력 시 View 와 Domain 의존성 제거 - DTO 도입 - [x] 매직 넘버 상수화 From 5e8bd2d8e95422dcd8a52feea254c223c736f3b5 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 14:32:29 +0900 Subject: [PATCH 62/71] =?UTF-8?q?.gitignore=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index af5c2f4188b..25dfdf4c336 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ out/ .vscode/ ### docker ### -./main/java/chess/docker/db.mysql +./src/main/java/chess/docker/db.mysql From b9b29bcfe9fa72a5f9f3ba32da8d7eb21574a919 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 14:45:08 +0900 Subject: [PATCH 63/71] =?UTF-8?q?docs=20:=20readme=20=EC=97=90=20=EB=8F=84?= =?UTF-8?q?=EC=BB=A4=20=ED=99=98=EA=B2=BD=20=EC=84=A4=EC=A0=95=20=EB=B0=A9?= =?UTF-8?q?=EB=B2=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++++++- src/main/java/chess/docker/db/mysql/init/init.sql | 8 -------- 2 files changed, 8 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/chess/docker/db/mysql/init/init.sql diff --git a/README.md b/README.md index 425e6a2bcba..6a63d370362 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,15 @@ ## Pair: 져니 [⛄️](http://github.com/cl8d), 제나 [❤️](https://github.com/yenawee) +### 프로그램 실행방법 +./java-chess/src/main/java/chess/docker 경로에서 아래 명령어를 입력해주세요 + +``` +docker-compose -p chess up -d +``` + ## 3, 4 단계 피드백 사항 및 추가 수정사항 -- [ ] Readme 에 도커 환경 세팅 설명 추가 +- [x] Readme 에 도커 환경 세팅 설명 추가 - [ ] DB connect 연결 에러 발생 시 처리 - [ ] 매직 넘버 상수화 및 메소드 이름 구체화 - [ ] Command 처리 로직 수정 diff --git a/src/main/java/chess/docker/db/mysql/init/init.sql b/src/main/java/chess/docker/db/mysql/init/init.sql deleted file mode 100644 index 5c04c039cb3..00000000000 --- a/src/main/java/chess/docker/db/mysql/init/init.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE chess_game -( - piece_type VARCHAR(255) NOT NULL, - piece_rank TINYINT(10) NOT NULL, - piece_file TINYINT(10) NOT NULL, - team VARCHAR(255) NOT NULL, - turn VARCHAR(255) NOT NULL -); From 605c525f1fbfbbe3c1a66ac8f3ab22ec00752d09 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 15:06:49 +0900 Subject: [PATCH 64/71] =?UTF-8?q?feat=20:=20DB=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=ED=96=88=EC=9D=84=20=EB=95=8C=20=EC=BB=A4?= =?UTF-8?q?=EC=8A=A4=ED=85=80=20=EC=98=88=EC=99=B8=20=EB=8D=98=EC=A7=80?= =?UTF-8?q?=EA=B2=8C=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/chess/dao/DBConnection.java | 4 +--- src/main/java/chess/dao/DBConnectionException.java | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 src/main/java/chess/dao/DBConnectionException.java diff --git a/src/main/java/chess/dao/DBConnection.java b/src/main/java/chess/dao/DBConnection.java index a8d3d33830c..9bed3c9cc37 100644 --- a/src/main/java/chess/dao/DBConnection.java +++ b/src/main/java/chess/dao/DBConnection.java @@ -16,9 +16,7 @@ public Connection getConnection() { try { return DriverManager.getConnection("jdbc:mysql://" + SERVER + "/" + DATABASE + OPTION, USERNAME, PASSWORD); } catch (final SQLException e) { - System.err.println("DB 연결 오류:" + e.getMessage()); - e.printStackTrace(); - return null; + throw new DBConnectionException("DB 연결 오류"); } } diff --git a/src/main/java/chess/dao/DBConnectionException.java b/src/main/java/chess/dao/DBConnectionException.java new file mode 100644 index 00000000000..51befa9521c --- /dev/null +++ b/src/main/java/chess/dao/DBConnectionException.java @@ -0,0 +1,7 @@ +package chess.dao; + +public class DBConnectionException extends RuntimeException { + public DBConnectionException(String message) { + super(message); + } +} From 1d238988f9cb24924adf7fac0ae726b039ce6edb Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 15:21:07 +0900 Subject: [PATCH 65/71] =?UTF-8?q?style=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/controller/ChessController.java | 2 -- src/main/java/chess/dao/ChessGameLoader.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 93406a2cba6..632a3260f38 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -30,7 +30,6 @@ public void run() { } }); if (chessGame.isEnd()) { - // king 이 잡혀서 게임이 종료되면 DB 초기화 chessGameDao.init(chessGame); } } @@ -39,7 +38,6 @@ private void play(ChessGame chessGame, Consumer consumer) { State gameStatus = new Start(chessGame); while (gameStatus.isRun()) { gameStatus = getStatus(gameStatus); - // 명령 실행 시 마다 업데이트 chessGameDao.update(chessGame); consumer.accept(gameStatus); } diff --git a/src/main/java/chess/dao/ChessGameLoader.java b/src/main/java/chess/dao/ChessGameLoader.java index c01f346cc4b..33552bdb40c 100644 --- a/src/main/java/chess/dao/ChessGameLoader.java +++ b/src/main/java/chess/dao/ChessGameLoader.java @@ -4,11 +4,9 @@ public class ChessGameLoader { public static ChessGame load(ChessGameDao chessGameDao) { - // 조회 ChessGame chessGame = chessGameDao.select(); if (chessGame == null) { chessGame = new ChessGame(); - // 생성 후 저장 chessGameDao.save(chessGame); } return chessGame; From 19db20e241200885c0efa78ffaa811c89a7b5e67 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 15:29:46 +0900 Subject: [PATCH 66/71] =?UTF-8?q?feat=20:=20Direction=20=EC=97=90=EA=B2=8C?= =?UTF-8?q?=20=EC=83=81=ED=96=A5,=ED=95=98=ED=96=A5=20=EB=8C=80=EA=B0=81?= =?UTF-8?q?=EC=84=A0=EC=9D=B8=EC=A7=80=20=EB=AC=BC=EC=96=B4=EB=B3=B4?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=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/chess/domain/piece/Direction.java | 13 ++++++------- src/main/java/chess/domain/position/Position.java | 6 ++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/chess/domain/piece/Direction.java b/src/main/java/chess/domain/piece/Direction.java index 683b3f91334..55c5b056fde 100644 --- a/src/main/java/chess/domain/piece/Direction.java +++ b/src/main/java/chess/domain/piece/Direction.java @@ -2,7 +2,6 @@ import chess.domain.position.Position; -import java.util.Arrays; import java.util.List; public enum Direction { @@ -35,12 +34,12 @@ public static List getDiagonalDirections() { return List.of(UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT); } - public static Direction findDirection(final int file, final int rank) { - return Arrays.stream(values()) - .filter(it -> it.fileMove == file) - .filter(it -> it.rankMove == rank) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("방향을 찾을 수 없습니다.")); + public static boolean isUpsideDiagonal(final int file, final int rank) { + return (file == UP_LEFT.fileMove || file == UP_RIGHT.fileMove) && rank == UP.rankMove; + } + + public static boolean isDownsideDiagonal(final int file, final int rank) { + return (file == DOWN_LEFT.fileMove || file == DOWN_RIGHT.fileMove) && rank == DOWN.rankMove; } public Position calculate(final Position before) { diff --git a/src/main/java/chess/domain/position/Position.java b/src/main/java/chess/domain/position/Position.java index e9c4ac515d9..faba015f502 100644 --- a/src/main/java/chess/domain/position/Position.java +++ b/src/main/java/chess/domain/position/Position.java @@ -60,13 +60,11 @@ private int getGcdGap(int fileGap, int rankGap) { } public boolean isUpsideDiagonalPosition(Position target) { - Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); - return direction.equals(Direction.UP_LEFT) || direction.equals(Direction.UP_RIGHT); + return Direction.isUpsideDiagonal(target.file - this.file, target.rank - this.rank); } public boolean isDownSideDiagonalPosition(Position target) { - Direction direction = Direction.findDirection(target.file - this.file, target.rank - this.rank); - return direction.equals(Direction.DOWN_LEFT) || direction.equals(Direction.DOWN_RIGHT); + return Direction.isDownsideDiagonal(target.file - this.file, target.rank - this.rank); } @Override From 0b59baaec4b18ea2e6162be99d5980f16a59a252 Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 15:59:14 +0900 Subject: [PATCH 67/71] =?UTF-8?q?feat=20:=20=EB=A7=A4=EC=A7=81=20=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=83=81=EC=88=98=ED=99=94=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/chess/dao/ChessBoardDao.java | 2 +- src/main/java/chess/dao/ChessGameDao.java | 2 +- src/main/java/chess/dao/ChessGameLoader.java | 2 +- src/main/java/chess/dao/InMemoryChessGameDao.java | 2 +- src/main/java/chess/domain/board/ChessBoard.java | 7 ++++--- src/main/java/chess/domain/piece/Bishop.java | 6 +++--- src/main/java/chess/domain/piece/King.java | 6 +++--- src/main/java/chess/domain/piece/Knight.java | 6 +++--- src/main/java/chess/domain/piece/Pawn.java | 10 +++++----- src/main/java/chess/domain/piece/Piece.java | 2 +- src/main/java/chess/domain/piece/Queen.java | 6 +++--- src/main/java/chess/domain/piece/Rook.java | 6 +++--- src/main/java/chess/domain/result/Score.java | 9 ++++++--- 14 files changed, 37 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 6a63d370362..6cc766b1268 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ docker-compose -p chess up -d ## 3, 4 단계 피드백 사항 및 추가 수정사항 - [x] Readme 에 도커 환경 세팅 설명 추가 -- [ ] DB connect 연결 에러 발생 시 처리 -- [ ] 매직 넘버 상수화 및 메소드 이름 구체화 +- [x] DB connect 연결 에러 발생 시 처리 +- [x] 매직 넘버 상수화 및 메소드 이름 구체화 - [ ] Command 처리 로직 수정 - [ ] 하나의 요청에 대해 하나의 Connection 으로 처리하도록 수정 - [ ] update 쿼리 수정 diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index e25e3b2fdc6..39cf9b91f42 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -34,7 +34,7 @@ public void save(ChessGame chessGame) { } @Override - public ChessGame select() { + public ChessGame findChessGame() { Map board = new HashMap<>(); TeamColor turn = null; final var query = "SELECT piece_type, piece_rank, piece_file, team, turn FROM chess_game"; diff --git a/src/main/java/chess/dao/ChessGameDao.java b/src/main/java/chess/dao/ChessGameDao.java index c92dd97c755..441a6cb1793 100644 --- a/src/main/java/chess/dao/ChessGameDao.java +++ b/src/main/java/chess/dao/ChessGameDao.java @@ -5,7 +5,7 @@ public interface ChessGameDao { void save(ChessGame chessGame); - ChessGame select(); + ChessGame findChessGame(); void update(ChessGame chessGame); diff --git a/src/main/java/chess/dao/ChessGameLoader.java b/src/main/java/chess/dao/ChessGameLoader.java index 33552bdb40c..5d4eaa69fbe 100644 --- a/src/main/java/chess/dao/ChessGameLoader.java +++ b/src/main/java/chess/dao/ChessGameLoader.java @@ -4,7 +4,7 @@ public class ChessGameLoader { public static ChessGame load(ChessGameDao chessGameDao) { - ChessGame chessGame = chessGameDao.select(); + ChessGame chessGame = chessGameDao.findChessGame(); if (chessGame == null) { chessGame = new ChessGame(); chessGameDao.save(chessGame); diff --git a/src/main/java/chess/dao/InMemoryChessGameDao.java b/src/main/java/chess/dao/InMemoryChessGameDao.java index 502b27e81e8..021394f0278 100644 --- a/src/main/java/chess/dao/InMemoryChessGameDao.java +++ b/src/main/java/chess/dao/InMemoryChessGameDao.java @@ -12,7 +12,7 @@ public void save(ChessGame chessGame) { } @Override - public ChessGame select() { + public ChessGame findChessGame() { return chessGame; } diff --git a/src/main/java/chess/domain/board/ChessBoard.java b/src/main/java/chess/domain/board/ChessBoard.java index ae8d3cfa665..47b7336b703 100644 --- a/src/main/java/chess/domain/board/ChessBoard.java +++ b/src/main/java/chess/domain/board/ChessBoard.java @@ -71,8 +71,9 @@ public Map getBoard() { } public boolean checkKingDie() { - return board.values().stream() - .filter(piece -> piece.isKing()) - .count() != INITIAL_KING_COUNT; + final double kingCount = board.values().stream() + .filter(Piece::isKing) + .count(); + return kingCount != INITIAL_KING_COUNT; } } diff --git a/src/main/java/chess/domain/piece/Bishop.java b/src/main/java/chess/domain/piece/Bishop.java index afbe7ba9267..d14a5c765d2 100644 --- a/src/main/java/chess/domain/piece/Bishop.java +++ b/src/main/java/chess/domain/piece/Bishop.java @@ -5,7 +5,7 @@ public class Bishop extends Piece { private static final int BISHOP_MAX_MOVE_COUNT = 8; - private static final Double VALUE = 3.0; + private static final Double SCORE_VALUE = 3.0; public Bishop(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -19,7 +19,7 @@ public boolean canMove(final Position source, final Position target, final Piece } @Override - public Double getValue() { - return VALUE; + public Double getScoreValue() { + return SCORE_VALUE; } } diff --git a/src/main/java/chess/domain/piece/King.java b/src/main/java/chess/domain/piece/King.java index f0ceee12069..3d42cf0f7a4 100644 --- a/src/main/java/chess/domain/piece/King.java +++ b/src/main/java/chess/domain/piece/King.java @@ -5,7 +5,7 @@ public class King extends Piece { private static final int KING_MAX_MOVE_COUNT = 1; - private static final Double VALUE = 0.0; + private static final Double SCORE_VALUE = 0.0; public King(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -24,7 +24,7 @@ public boolean isKing() { } @Override - public Double getValue() { - return VALUE; + public Double getScoreValue() { + return SCORE_VALUE; } } diff --git a/src/main/java/chess/domain/piece/Knight.java b/src/main/java/chess/domain/piece/Knight.java index 4e57bd926d7..4f53d35d502 100644 --- a/src/main/java/chess/domain/piece/Knight.java +++ b/src/main/java/chess/domain/piece/Knight.java @@ -3,7 +3,7 @@ import chess.domain.position.Position; public class Knight extends Piece { - private static final Double VALUE = 2.5; + private static final Double SCORE_VALUE = 2.5; public Knight(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -17,7 +17,7 @@ public boolean canMove(final Position source, final Position target, final Piece } @Override - public Double getValue() { - return VALUE; + public Double getScoreValue() { + return SCORE_VALUE; } } diff --git a/src/main/java/chess/domain/piece/Pawn.java b/src/main/java/chess/domain/piece/Pawn.java index 5cb3fcdcf8a..69617be264f 100644 --- a/src/main/java/chess/domain/piece/Pawn.java +++ b/src/main/java/chess/domain/piece/Pawn.java @@ -5,8 +5,8 @@ public class Pawn extends Piece { protected static final int PAWN_MAX_MOVE_COUNT = 1; protected static final int PAWN_FIRST_MAX_MOVE_COUNT = 2; - private static final Double VALUE = 1.0; - private static final Double VALUE_SAME_FILE = 0.5; + private static final Double SCORE_VALUE = 1.0; + private static final Double SCORE_VALUE_SAME_FILE = 0.5; private static final int PAWN_COUNT_CRITERION_FOR_SCORING = 1; Pawn(final PieceType pieceType, final TeamColor teamColor) { @@ -15,9 +15,9 @@ public class Pawn extends Piece { public static Double calculateScore(int count) { if (count == PAWN_COUNT_CRITERION_FOR_SCORING) { - return VALUE; + return SCORE_VALUE; } - return VALUE_SAME_FILE * count; + return SCORE_VALUE_SAME_FILE * count; } boolean canAttack(Position source, Position target, Piece piece) { @@ -30,7 +30,7 @@ public boolean isPawn() { } @Override - public Double getValue() { + public Double getScoreValue() { return null; } diff --git a/src/main/java/chess/domain/piece/Piece.java b/src/main/java/chess/domain/piece/Piece.java index 80ccad25e11..86a4af08632 100644 --- a/src/main/java/chess/domain/piece/Piece.java +++ b/src/main/java/chess/domain/piece/Piece.java @@ -27,7 +27,7 @@ public boolean isPawn() { return false; } - public abstract Double getValue(); + public abstract Double getScoreValue(); public TeamColor getTeamColor() { return teamColor; diff --git a/src/main/java/chess/domain/piece/Queen.java b/src/main/java/chess/domain/piece/Queen.java index 65c9d5bd2ba..51fdc3f7692 100644 --- a/src/main/java/chess/domain/piece/Queen.java +++ b/src/main/java/chess/domain/piece/Queen.java @@ -5,7 +5,7 @@ public class Queen extends Piece { private static final int QUEEN_MAX_MOVE_COUNT = 8; - private static final Double VALUE = 9.0; + private static final Double SCORE_VALUE = 9.0; public Queen(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -19,7 +19,7 @@ public boolean canMove(final Position source, final Position target, final Piece } @Override - public Double getValue() { - return VALUE; + public Double getScoreValue() { + return SCORE_VALUE; } } diff --git a/src/main/java/chess/domain/piece/Rook.java b/src/main/java/chess/domain/piece/Rook.java index 23b5e24df5c..4a2076fafab 100644 --- a/src/main/java/chess/domain/piece/Rook.java +++ b/src/main/java/chess/domain/piece/Rook.java @@ -5,7 +5,7 @@ public class Rook extends Piece { private static final int ROOK_MAX_MOVE_COUNT = 8; - private static final Double VALUE = 5.0; + private static final Double SCORE_VALUE = 5.0; public Rook(final PieceType pieceType, final TeamColor teamColor) { super(pieceType, teamColor); @@ -19,7 +19,7 @@ public boolean canMove(final Position source, final Position target, final Piece } @Override - public Double getValue() { - return VALUE; + public Double getScoreValue() { + return SCORE_VALUE; } } diff --git a/src/main/java/chess/domain/result/Score.java b/src/main/java/chess/domain/result/Score.java index 38382b735dd..8e79e9e678a 100644 --- a/src/main/java/chess/domain/result/Score.java +++ b/src/main/java/chess/domain/result/Score.java @@ -13,6 +13,9 @@ import java.util.stream.IntStream; public class Score { + private static final int START_INDEX = 0; + private static final int END_INDEX = 8; + private final Map score; private Score(Map score) { @@ -31,19 +34,19 @@ private static Double sumScoreExceptPawn(TeamColor color, Map b .stream() .filter(piece -> piece.isSameTeam(color)) .filter(piece -> !piece.isPawn()) - .mapToDouble(Piece::getValue) + .mapToDouble(Piece::getScoreValue) .sum(); } private static Double sumScorePawn(TeamColor color, Map board) { - return IntStream.range(0, 8) + return IntStream.range(START_INDEX, END_INDEX) .map(file -> countPawnByEachFile(file, color, board)) .mapToDouble(Pawn::calculateScore) .sum(); } private static int countPawnByEachFile(int file, TeamColor color, Map board) { - return (int) IntStream.range(0, 8) + return (int) IntStream.range(START_INDEX, END_INDEX) .mapToObj(rank -> board.get(Position.of(rank, file))) .filter(piece -> !Objects.isNull(piece)) .filter(Piece::isPawn) From 0309457ccfc59fa71948044d1216a9ce5df48f6f Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 16:11:37 +0900 Subject: [PATCH 68/71] =?UTF-8?q?feat=20:=20=ED=95=98=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=97=90=20=EB=8C=80=ED=95=B4=20=ED=95=98?= =?UTF-8?q?=EB=82=98=EC=9D=98=20Connection=20=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=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 --- README.md | 2 +- src/main/java/chess/dao/ChessBoardDao.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6cc766b1268..7ab06c4eda8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ docker-compose -p chess up -d - [x] DB connect 연결 에러 발생 시 처리 - [x] 매직 넘버 상수화 및 메소드 이름 구체화 - [ ] Command 처리 로직 수정 -- [ ] 하나의 요청에 대해 하나의 Connection 으로 처리하도록 수정 +- [x] 하나의 요청에 대해 하나의 Connection 으로 처리하도록 수정 - [ ] update 쿼리 수정 diff --git a/src/main/java/chess/dao/ChessBoardDao.java b/src/main/java/chess/dao/ChessBoardDao.java index 39cf9b91f42..e94640cfd25 100644 --- a/src/main/java/chess/dao/ChessBoardDao.java +++ b/src/main/java/chess/dao/ChessBoardDao.java @@ -16,20 +16,20 @@ public class ChessBoardDao implements ChessGameDao { @Override public void save(ChessGame chessGame) { + final var query = "INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?)"; Map board = chessGame.getChessBoard(); - for (Map.Entry boardEntry : board.entrySet()) { - final var query = "INSERT INTO chess_game(piece_type, piece_rank, piece_file, team, turn) VALUES (?, ?, ?, ?, ?)"; - try (final var connection = dbConnection.getConnection(); - final var preparedStatement = connection.prepareStatement(query)) { + try (final var connection = dbConnection.getConnection(); + final var preparedStatement = connection.prepareStatement(query)) { + for (Map.Entry boardEntry : board.entrySet()) { preparedStatement.setString(1, boardEntry.getValue().getPieceType().name()); preparedStatement.setInt(2, boardEntry.getKey().getRank()); preparedStatement.setInt(3, boardEntry.getKey().getFile()); preparedStatement.setString(4, boardEntry.getValue().getTeamColor().name()); preparedStatement.setString(5, chessGame.getCurrentTeamColor().name()); preparedStatement.executeUpdate(); - } catch (final SQLException e) { - throw new RuntimeException(e); } + } catch (final SQLException e) { + throw new RuntimeException(e); } } From f1c620589e17a690911a6ea251954ce8e46839df Mon Sep 17 00:00:00 2001 From: yenawee Date: Thu, 30 Mar 2023 23:29:41 +0900 Subject: [PATCH 69/71] =?UTF-8?q?refactor=20:=20chessGamecontroller=20play?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chess/controller/ChessController.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/chess/controller/ChessController.java b/src/main/java/chess/controller/ChessController.java index 632a3260f38..65f95bf3771 100644 --- a/src/main/java/chess/controller/ChessController.java +++ b/src/main/java/chess/controller/ChessController.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; -import java.util.function.Consumer; public class ChessController { private final ChessGameDao chessGameDao; @@ -24,22 +23,18 @@ public ChessController(final ChessGameDao chessGameDao) { public void run() { OutputView.printStartMessage(); ChessGame chessGame = ChessGameLoader.load(chessGameDao); - play(chessGame, gameStatus -> { - if (gameStatus.isRun()) { - printChessBoard(chessGame.getChessBoard()); - } - }); - if (chessGame.isEnd()) { - chessGameDao.init(chessGame); - } + State gameStatus = new Start(chessGame); + play(chessGame, gameStatus); } - private void play(ChessGame chessGame, Consumer consumer) { - State gameStatus = new Start(chessGame); - while (gameStatus.isRun()) { + private void play(ChessGame chessGame, State gameStatus) { + while (!chessGame.isEnd() && gameStatus.isRun()) { gameStatus = getStatus(gameStatus); chessGameDao.update(chessGame); - consumer.accept(gameStatus); + printChessBoard(gameStatus, chessGame.getChessBoard()); + } + if (chessGame.isEnd()) { + chessGameDao.init(chessGame); } } @@ -54,8 +49,10 @@ private State getStatus(State gameStatus) { } } - private void printChessBoard(Map board) { - ChessBoardDto chessBoardDTO = new ChessBoardDto(board); - OutputView.print(chessBoardDTO.getBoardMessage().toString()); + private void printChessBoard(State gameStatus, Map board) { + if (gameStatus.isRun()) { + ChessBoardDto chessBoardDTO = new ChessBoardDto(board); + OutputView.print(chessBoardDTO.getBoardMessage().toString()); + } } } From 456dfffd22b9d13c351d3dcbaa108f7b7aa2f984 Mon Sep 17 00:00:00 2001 From: yenawee Date: Fri, 31 Mar 2023 00:12:00 +0900 Subject: [PATCH 70/71] =?UTF-8?q?feat=20:=20init.sql=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/chess/docker/db/mysql/init/init.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/chess/docker/db/mysql/init/init.sql diff --git a/src/main/java/chess/docker/db/mysql/init/init.sql b/src/main/java/chess/docker/db/mysql/init/init.sql new file mode 100644 index 00000000000..a2f8a60b035 --- /dev/null +++ b/src/main/java/chess/docker/db/mysql/init/init.sql @@ -0,0 +1,7 @@ +CREATE TABLE chess_game ( + piece_type VARCHAR(255) NOT NULL, + piece_rank TINYINT(10) NOT NULL, + piece_file VARCHAR(255) NOT NULL, + team VARCHAR(255) NOT NULL, + turn VARCHAR(255) NOT NULL +) From 00f92086b0f93dccf8b2b0aa4c271e3cc995225a Mon Sep 17 00:00:00 2001 From: yenawee Date: Fri, 31 Mar 2023 00:13:46 +0900 Subject: [PATCH 71/71] =?UTF-8?q?docs=20:=20readme=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 7ab06c4eda8..bd2cdc19102 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ docker-compose -p chess up -d ``` +정지 시에는 아래 명령어를 입력해주세요 +``` +docker-compose -p chess down +``` + ## 3, 4 단계 피드백 사항 및 추가 수정사항 - [x] Readme 에 도커 환경 세팅 설명 추가 - [x] DB connect 연결 에러 발생 시 처리