From fbcdc4a0be067654feaeace961b9fb5aae4d43f5 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:10:49 +0900 Subject: [PATCH 01/48] =?UTF-8?q?feat:=20=EB=B9=84=EC=88=8D=20=EC=9E=A5?= =?UTF-8?q?=EC=95=A0=EB=AC=BC=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=9C=20=EB=AA=A9=EC=A0=81=EC=A7=80=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +++++++++++ src/main/java/chess/Board.java | 5 ++ src/main/java/chess/ChessPositions.java | 14 ++++++ src/main/java/chess/Column.java | 3 +- src/main/java/chess/piece/Bishop.java | 61 ++++++++++++++++++++++- src/main/java/chess/piece/ChessPiece.java | 12 +++++ src/test/java/chess/piece/BishopTest.java | 46 +++++++++++++++++ 7 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 src/main/java/chess/Board.java create mode 100644 src/main/java/chess/ChessPositions.java create mode 100644 src/main/java/chess/piece/ChessPiece.java create mode 100644 src/test/java/chess/piece/BishopTest.java diff --git a/README.md b/README.md index 8102f91c870..d90e9e3a540 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,31 @@ ## 우아한테크코스 코드리뷰 - [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) + +## 실행 흐름 +1. 보드에 있는 기물을 선택하면, 해당 기물이 이동할 수 있는 위치들을 알려준다. +2. 사용자가 위치를 입력하면 해당 기물을 지정 위치로 이동시킨다. +3. 이동 위치에 기물이 존재하는 경우, 해당 기물을 잡아서 점수를 얻을 수 있다. + +## 기물 이동 구현하기 + +- [ ] 비숍 + - [ ] 대각선으로 원하는만큼 이동 가능 + - [ ] 장애물을 통과할 수 없음 +- [ ] 왕 + - [ ] 상, 하, 좌, 우, 대각선 한 칸씩 이동 가능 +- [ ] 나이트 + - [ ] 상, 하, 좌, 우 방향으로 앞으로 두 칸, 대각선으로 한 칸 이동 가능 + - [ ] 장애물을 통과할 수 있음 +- [ ] 폰 + - [ ] 처음 이동할 때는 앞으로 두 칸 이동도 가능 (한 칸만 움직일 수도 있음) + - [ ] 상대 말을 잡을 때는 무조건 대각선으로만 잡을 수 있음 + - [ ] 뒤로는 이동할 수 없음 +- [ ] 여왕 + - [ ] 상, 하, 좌, 우, 대각선 원하는만큼 이동 가능 + - [ ] 장애물을 통과할 수 없음 +- [ ] 룩 + - [ ] 상, 하, 좌, 우 원하는만큼 이동 가능 + - [ ] 장애물을 통과할 수 없음 + +## 기물 배치하기 diff --git a/src/main/java/chess/Board.java b/src/main/java/chess/Board.java new file mode 100644 index 00000000000..64de7489aa7 --- /dev/null +++ b/src/main/java/chess/Board.java @@ -0,0 +1,5 @@ +package chess; + +public class Board { + +} diff --git a/src/main/java/chess/ChessPositions.java b/src/main/java/chess/ChessPositions.java new file mode 100644 index 00000000000..4eb67e43d2e --- /dev/null +++ b/src/main/java/chess/ChessPositions.java @@ -0,0 +1,14 @@ +package chess; + +import chess.piece.ChessPiece; + +import java.util.List; +import java.util.Map; + +public class ChessPositions { + private final Map positions; + + public ChessPositions(Map positions) { + this.positions = positions; + } +} diff --git a/src/main/java/chess/Column.java b/src/main/java/chess/Column.java index b64b4dc77a3..ed0ffc07fcf 100644 --- a/src/main/java/chess/Column.java +++ b/src/main/java/chess/Column.java @@ -1,6 +1,7 @@ package chess; -public enum Column { +public enum +Column { A, B, diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index b14ab70f981..aa028d7d86e 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -1,5 +1,64 @@ package chess.piece; -public class Bishop { +import chess.Color; +import chess.Movement; +import chess.Position; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Bishop implements ChessPiece { + // 대각선으로 원하는만큼 이동 가능 + private final Color color; + private final List movements = List.of( + Movement.LEFT_UP, + Movement.RIGHT_UP, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN + ); + + public Bishop(Color color) { + this.color = color; + } + + public List getAvailableDestinations(Position startPosition, Map positions) { + List destinations = new ArrayList<>(); + + // LEFT_UP + // todo: 이동 가능한 위치(장애물이 없고 보드를 벗어나지 않은 구간)까지 구하기 + Position currentPosition = startPosition; + while (currentPosition.canMoveLeftUp()) { + currentPosition = currentPosition.move(Movement.LEFT_UP); + destinations.add(currentPosition); + } + + // RIGHT_UP + currentPosition = startPosition; + while (currentPosition.canMoveRightUp()) { + currentPosition = currentPosition.move(Movement.RIGHT_UP); + destinations.add(currentPosition); + } + + // LEFT_DOWN + currentPosition = startPosition; + while (currentPosition.canMoveLeftDown()) { + currentPosition = currentPosition.move(Movement.LEFT_DOWN); + destinations.add(currentPosition); + } + + // RIGHT_DOWN + currentPosition = startPosition; + while (currentPosition.canMoveRightDown()) { + currentPosition = currentPosition.move(Movement.RIGHT_DOWN); + destinations.add(currentPosition); + } + + return destinations; + } + + @Override + public Color getColor() { + return color; + } } diff --git a/src/main/java/chess/piece/ChessPiece.java b/src/main/java/chess/piece/ChessPiece.java new file mode 100644 index 00000000000..8c727d4ed21 --- /dev/null +++ b/src/main/java/chess/piece/ChessPiece.java @@ -0,0 +1,12 @@ +package chess.piece; + +import chess.Color; +import chess.Position; + +import java.util.List; +import java.util.Map; + +public interface ChessPiece { + List getAvailableDestinations(Position startPosition, Map positions); + Color getColor(); +} diff --git a/src/test/java/chess/piece/BishopTest.java b/src/test/java/chess/piece/BishopTest.java new file mode 100644 index 00000000000..7183668e313 --- /dev/null +++ b/src/test/java/chess/piece/BishopTest.java @@ -0,0 +1,46 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class BishopTest { + @DisplayName("장애물이 존재하지 않는 경우, 보드를 벗어나지 않는 영역 내에서 모든 대각선 방향으로 움직일 수 있다.") + @Test + void notExistHurdle() { + // given + Map positions = Map.of(); + Bishop bishop = new Bishop(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.ONE, Column.G), + new Position(Row.FIVE, Column.E), + new Position(Row.SIX, Column.F), + new Position(Row.SEVEN, Column.G), + new Position(Row.EIGHT, Column.H), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A) + ); + + // when + List destinations = bishop.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From 46b1bc42db2bb75afc07c23b217bb2484848682e Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:13:33 +0900 Subject: [PATCH 02/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EC=9E=A5=EC=95=A0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EC=9D=98=20=EB=B9=84=EC=88=8D=20=EB=AA=A9?= =?UTF-8?q?=EC=A0=81=EC=A7=80=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/BishopTest.java | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/chess/piece/BishopTest.java b/src/test/java/chess/piece/BishopTest.java index 7183668e313..a00da24af31 100644 --- a/src/test/java/chess/piece/BishopTest.java +++ b/src/test/java/chess/piece/BishopTest.java @@ -43,4 +43,34 @@ void notExistHurdle() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("장애물이 존재하는 경우, 보드를 벗어나지 않는 영역 내에서 장애물을 마주하기 전까지의 모든 대각선 방향으로 움직일 수 있다.") + @Test + void existHurdle() { + // given + Map positions = Map.of( + new Position(Row.SIX, Column.F), new Bishop(Color.WHITE), + new Position(Row.ONE, Column.G), new Bishop(Color.BLACK) + ); + Bishop bishop = new Bishop(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.FIVE, Column.E), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A) + ); + + // when + List destinations = bishop.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 791c67affa71a4390d7ee87cb315ede998c243e0 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:15:01 +0900 Subject: [PATCH 03/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EB=B9=84=EC=88=8D?= =?UTF-8?q?=EC=9D=80=20=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Bishop.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index aa028d7d86e..ed0e54845c4 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -30,6 +30,9 @@ public List getAvailableDestinations(Position startPosition, Map getAvailableDestinations(Position startPosition, Map getAvailableDestinations(Position startPosition, Map getAvailableDestinations(Position startPosition, Map Date: Sat, 22 Mar 2025 14:23:45 +0900 Subject: [PATCH 04/48] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8Frefactor:=20?= =?UTF-8?q?=EB=B9=84=EC=88=8D=20=EB=AA=A9=EC=A0=81=EC=A7=80=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EC=BD=94=EB=93=9C=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Bishop.java | 47 +++++---------------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index ed0e54845c4..5f6ede38eae 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -9,7 +9,6 @@ import java.util.Map; public class Bishop implements ChessPiece { - // 대각선으로 원하는만큼 이동 가능 private final Color color; private final List movements = List.of( Movement.LEFT_UP, @@ -25,45 +24,15 @@ public Bishop(Color color) { public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); - // LEFT_UP - // todo: 이동 가능한 위치(장애물이 없고 보드를 벗어나지 않은 구간)까지 구하기 - Position currentPosition = startPosition; - while (currentPosition.canMoveLeftUp()) { - currentPosition = currentPosition.move(Movement.LEFT_UP); - if (positions.containsKey(currentPosition)) { - break; + for (Movement movement : movements) { + Position currentPosition = startPosition; + while (currentPosition.canMove(movement)) { + currentPosition = currentPosition.move(movement); + if (positions.containsKey(currentPosition)) { + break; + } + destinations.add(currentPosition); } - destinations.add(currentPosition); - } - - // RIGHT_UP - currentPosition = startPosition; - while (currentPosition.canMoveRightUp()) { - currentPosition = currentPosition.move(Movement.RIGHT_UP); - if (positions.containsKey(currentPosition)) { - break; - } - destinations.add(currentPosition); - } - - // LEFT_DOWN - currentPosition = startPosition; - while (currentPosition.canMoveLeftDown()) { - currentPosition = currentPosition.move(Movement.LEFT_DOWN); - if (positions.containsKey(currentPosition)) { - break; - } - destinations.add(currentPosition); - } - - // RIGHT_DOWN - currentPosition = startPosition; - while (currentPosition.canMoveRightDown()) { - currentPosition = currentPosition.move(Movement.RIGHT_DOWN); - if (positions.containsKey(currentPosition)) { - break; - } - destinations.add(currentPosition); } return destinations; From 05572993a02799a0eb5046a9783568922e679547 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:24:21 +0900 Subject: [PATCH 05/48] =?UTF-8?q?docs(README.md):=20=EB=B9=84=EC=88=8D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=82=AC=ED=95=AD=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d90e9e3a540..4a8cbc085e1 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ ## 기물 이동 구현하기 -- [ ] 비숍 - - [ ] 대각선으로 원하는만큼 이동 가능 - - [ ] 장애물을 통과할 수 없음 +- [x] 비숍 + - [x] 대각선으로 원하는만큼 이동 가능 + - [x] 장애물을 통과할 수 없음 - [ ] 왕 - [ ] 상, 하, 좌, 우, 대각선 한 칸씩 이동 가능 - [ ] 나이트 From bf6346aab69d0d3fee0eec32d3e41d66bddc1df3 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:27:51 +0900 Subject: [PATCH 06/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EC=9E=A5=EC=95=A0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=99=95=EC=9D=80=208=EA=B0=9C=EC=9D=98=20=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=EC=9D=84=20=EB=AA=A9=EC=A0=81=EC=A7=80=EB=A1=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/King.java | 22 ++++++++++++- src/test/java/chess/piece/KingTest.java | 42 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chess/piece/KingTest.java diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index d64210cad13..59a9cbe3e0c 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -1,5 +1,25 @@ package chess.piece; -public class King { +import chess.Color; +import chess.Position; +import java.util.List; +import java.util.Map; + +public class King implements ChessPiece { + private final Color color; + + public King(Color color) { + this.color = color; + } + + @Override + public List getAvailableDestinations(Position startPosition, Map positions) { + return null; + } + + @Override + public Color getColor() { + return color; + } } diff --git a/src/test/java/chess/piece/KingTest.java b/src/test/java/chess/piece/KingTest.java new file mode 100644 index 00000000000..e9f8055f3b7 --- /dev/null +++ b/src/test/java/chess/piece/KingTest.java @@ -0,0 +1,42 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class KingTest { + @DisplayName("장애물이 없는 경우, 8개 방향으로 한 칸씩 이동할 수 있다.") + @Test + void notExistHurdles() { + // given + Map positions = Map.of(); + King king = new King(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.FIVE, Column.D), + new Position(Row.FIVE, Column.E), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.THREE, Column.C), + new Position(Row.THREE, Column.D), + new Position(Row.THREE, Column.E) + ); + + // when + List destinations = king.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From 9034d444431729f171a3fb64b62fccd2e12df4b8 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:37:45 +0900 Subject: [PATCH 07/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EC=9E=A5=EC=95=A0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=99=95=EC=9D=80=208=EA=B0=9C=EC=9D=98=20=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=EC=9D=84=20=EB=AA=A9=EC=A0=81=EC=A7=80=EB=A1=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/King.java | 20 +++++++++++++++++++- src/test/java/chess/piece/KingTest.java | 1 - 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index 59a9cbe3e0c..8e37e333a97 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -1,13 +1,25 @@ package chess.piece; import chess.Color; +import chess.Movement; import chess.Position; +import java.util.ArrayList; import java.util.List; import java.util.Map; public class King implements ChessPiece { private final Color color; + private final List movements = List.of( + Movement.UP, + Movement.DOWN, + Movement.LEFT, + Movement.RIGHT, + Movement.LEFT_UP, + Movement.RIGHT_UP, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN + ); public King(Color color) { this.color = color; @@ -15,7 +27,13 @@ public King(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { - return null; + List destinations = new ArrayList<>(); + for (Movement movement : movements) { + if (startPosition.canMove(movement)) { + destinations.add(startPosition.move(movement)); + } + } + return destinations; } @Override diff --git a/src/test/java/chess/piece/KingTest.java b/src/test/java/chess/piece/KingTest.java index e9f8055f3b7..43fd56e1c0c 100644 --- a/src/test/java/chess/piece/KingTest.java +++ b/src/test/java/chess/piece/KingTest.java @@ -11,7 +11,6 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class KingTest { @DisplayName("장애물이 없는 경우, 8개 방향으로 한 칸씩 이동할 수 있다.") From e2ac7749307149f2f2c83f64cf9ff4081c7852a4 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:40:51 +0900 Subject: [PATCH 08/48] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8Frefactor:=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=99=95=EC=9D=98=20=EB=AA=A9=EC=A0=81?= =?UTF-8?q?=EC=A7=80=20=EB=B0=98=ED=99=98=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/King.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index 8e37e333a97..76651267dc8 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -4,7 +4,6 @@ import chess.Movement; import chess.Position; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -27,13 +26,10 @@ public King(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { - List destinations = new ArrayList<>(); - for (Movement movement : movements) { - if (startPosition.canMove(movement)) { - destinations.add(startPosition.move(movement)); - } - } - return destinations; + return movements.stream() + .filter(startPosition::canMove) + .map(startPosition::move) + .toList(); } @Override From 432c4cddeac9e40576a4a342b2f85de0020d4ada Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:42:52 +0900 Subject: [PATCH 09/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EC=9E=A5=EC=95=A0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=99=95=EC=9D=98=20=EB=AA=A9=EC=A0=81?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/KingTest.java | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/test/java/chess/piece/KingTest.java b/src/test/java/chess/piece/KingTest.java index 43fd56e1c0c..54c01e69374 100644 --- a/src/test/java/chess/piece/KingTest.java +++ b/src/test/java/chess/piece/KingTest.java @@ -38,4 +38,31 @@ void notExistHurdles() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("장애물이 있는 경우, 8개 방향 중에서 장애물이 없는 곳으로 한 칸 이동할 수 있다.") + @Test + void existHurdles() { + // given + Map positions = Map.of( + new Position(Row.FIVE, Column.D), new Bishop(Color.BLACK), + new Position(Row.THREE, Column.C), new King(Color.WHITE) + ); + King king = new King(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.FIVE, Column.E), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.THREE, Column.D), + new Position(Row.THREE, Column.E) + ); + + // when + List destinations = king.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 92e2fd8ba49c0e22804ffe5fe068976014243d50 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:44:45 +0900 Subject: [PATCH 10/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EC=9E=A5=EC=95=A0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=99=95=EC=9D=98=20=EB=AA=A9=EC=A0=81?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/King.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index 76651267dc8..167021921dc 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -29,6 +29,7 @@ public List getAvailableDestinations(Position startPosition, Map !positions.containsKey(position)) .toList(); } From 924ce91a71f20cb5fe3e8a0c5c5a32a3c00d28e8 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:45:38 +0900 Subject: [PATCH 11/48] =?UTF-8?q?docs(README.md):=20=EC=99=95=20=EA=B8=B0?= =?UTF-8?q?=EB=AC=BC=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4a8cbc085e1..0015011b6ec 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,9 @@ - [x] 비숍 - [x] 대각선으로 원하는만큼 이동 가능 - [x] 장애물을 통과할 수 없음 -- [ ] 왕 - - [ ] 상, 하, 좌, 우, 대각선 한 칸씩 이동 가능 +- [x] 왕 + - [x] 상, 하, 좌, 우, 대각선 한 칸씩 이동 가능 + - [x] 장애물을 통과할 수 없음 - [ ] 나이트 - [ ] 상, 하, 좌, 우 방향으로 앞으로 두 칸, 대각선으로 한 칸 이동 가능 - [ ] 장애물을 통과할 수 있음 From 9ad71edadc87444f4de897b0c94ef754d9bf79f0 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:48:25 +0900 Subject: [PATCH 12/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EC=99=95=EC=9D=80=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=88=EB=8A=94=20=EC=9C=84=EC=B9=98=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4=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/piece/KingTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/chess/piece/KingTest.java b/src/test/java/chess/piece/KingTest.java index 54c01e69374..6f91f4efb7a 100644 --- a/src/test/java/chess/piece/KingTest.java +++ b/src/test/java/chess/piece/KingTest.java @@ -39,7 +39,7 @@ void notExistHurdles() { assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } - @DisplayName("장애물이 있는 경우, 8개 방향 중에서 장애물이 없는 곳으로 한 칸 이동할 수 있다.") + @DisplayName("8개 방향 중에서 같은 팀의 기물이 없는 곳으로만 이동할 수 있다.") @Test void existHurdles() { // given @@ -53,6 +53,7 @@ void existHurdles() { new Position(Row.FIVE, Column.E), new Position(Row.FOUR, Column.C), new Position(Row.FOUR, Column.E), + new Position(Row.THREE, Column.C), new Position(Row.THREE, Column.D), new Position(Row.THREE, Column.E) ); From 865996dfb8ea2e99cd04eec3ebaaabd0d3b31f32 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:50:17 +0900 Subject: [PATCH 13/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EC=99=95=EC=9D=80?= =?UTF-8?q?=20=EA=B0=99=EC=9D=80=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=88=EB=8A=94=20=EC=9C=84=EC=B9=98=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/King.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index 167021921dc..fea756e962b 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -29,10 +29,14 @@ public List getAvailableDestinations(Position startPosition, Map !positions.containsKey(position)) + .filter(position -> canMove(position, positions)) .toList(); } + private boolean canMove(Position targetPosition, Map positions) { + return !positions.containsKey(targetPosition) || positions.get(targetPosition).getColor() != color; + } + @Override public Color getColor() { return color; From f0611a727b43090612a0f4913b074585aada5e49 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:53:19 +0900 Subject: [PATCH 14/48] =?UTF-8?q?fix:=20=EB=B9=84=EC=88=8D=EC=9D=98=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=20=EC=A1=B4=EC=9E=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20-=20=EA=B0=99?= =?UTF-8?q?=EC=9D=80=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EC=99=80=20=EB=8B=A4=EB=A5=B8=20=ED=8C=80=EC=9C=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/BishopTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/chess/piece/BishopTest.java b/src/test/java/chess/piece/BishopTest.java index a00da24af31..57c5f58fb91 100644 --- a/src/test/java/chess/piece/BishopTest.java +++ b/src/test/java/chess/piece/BishopTest.java @@ -44,12 +44,12 @@ void notExistHurdle() { assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } - @DisplayName("장애물이 존재하는 경우, 보드를 벗어나지 않는 영역 내에서 장애물을 마주하기 전까지의 모든 대각선 방향으로 움직일 수 있다.") + @DisplayName("이동경로에 같은 팀 기물이 존재하는 경우, 해당 기물들을 마주하기 전까지의 위치로 움직일 수 있다.") @Test - void existHurdle() { + void existSameTeamHurdle() { // given Map positions = Map.of( - new Position(Row.SIX, Column.F), new Bishop(Color.WHITE), + new Position(Row.SIX, Column.F), new Bishop(Color.BLACK), new Position(Row.ONE, Column.G), new Bishop(Color.BLACK) ); Bishop bishop = new Bishop(Color.BLACK); From c7abdf57aae24663e80c6720c5ef2465b10473e7 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 14:55:37 +0900 Subject: [PATCH 15/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EB=B9=84=EC=88=8D=20-?= =?UTF-8?q?=20=EB=8B=A4=EB=A5=B8=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/BishopTest.java | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/test/java/chess/piece/BishopTest.java b/src/test/java/chess/piece/BishopTest.java index 57c5f58fb91..370943e7f5f 100644 --- a/src/test/java/chess/piece/BishopTest.java +++ b/src/test/java/chess/piece/BishopTest.java @@ -73,4 +73,36 @@ void existSameTeamHurdle() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("이동경로에 다른 팀 기물이 존재하는 경우, 해당 기물들의 위치로 움직일 수 있다.") + @Test + void existOtherTeamHurdle() { + // given + Map positions = Map.of( + new Position(Row.SIX, Column.F), new Bishop(Color.WHITE), + new Position(Row.ONE, Column.G), new Bishop(Color.WHITE) + ); + Bishop bishop = new Bishop(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.ONE, Column.G), + new Position(Row.FIVE, Column.E), + new Position(Row.SIX, Column.F), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A) + ); + + // when + List destinations = bishop.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 5b42e3e20c806abcb4c14dc2ac6ad3dce2454417 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:03:24 +0900 Subject: [PATCH 16/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EB=B9=84=EC=88=8D?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=8F=99=20=EA=B2=BD=EB=A1=9C=EC=97=90=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Bishop.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index 5f6ede38eae..a5419846113 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -28,10 +28,14 @@ public List getAvailableDestinations(Position startPosition, Map Date: Sat, 22 Mar 2025 15:17:32 +0900 Subject: [PATCH 17/48] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8Frefactor:=20?= =?UTF-8?q?=EB=B9=84=EC=88=8D=20=EB=AA=A9=EC=A0=81=EC=A7=80=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EC=BD=94=EB=93=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Bishop.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index a5419846113..29d8c9721c3 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -28,12 +28,11 @@ public List getAvailableDestinations(Position startPosition, Map getAvailableDestinations(Position startPosition, Map positions) { + return !positions.containsKey(targetPosition) || canCatch(targetPosition, positions); + } + + private boolean canCatch(Position targetPosition, Map positions) { + return positions.containsKey(targetPosition) && positions.get(targetPosition).getColor() != color; + } + @Override public Color getColor() { return color; From b2b4d8c4f714dfd1254791738fa3cb6656e98ebf Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:42:06 +0900 Subject: [PATCH 18/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EB=82=98=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=EB=8A=94=20=EB=AA=A9=EC=A0=81=EC=A7=80=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=9C=20=EA=B2=BD=EB=A1=9C=20=EC=83=81?= =?UTF-8?q?=EC=9D=98=20=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=84=20=EC=8B=A0?= =?UTF-8?q?=EA=B2=BD=EC=93=B0=EC=A7=80=20=EC=95=8A=EB=8A=94=EB=8B=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Knight.java | 22 +++++++++++- src/test/java/chess/piece/KnightTest.java | 43 +++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chess/piece/KnightTest.java diff --git a/src/main/java/chess/piece/Knight.java b/src/main/java/chess/piece/Knight.java index 2ee7c47a3bc..b1fcf61d0cb 100644 --- a/src/main/java/chess/piece/Knight.java +++ b/src/main/java/chess/piece/Knight.java @@ -1,5 +1,25 @@ package chess.piece; -public class Knight { +import chess.Color; +import chess.Position; +import java.util.List; +import java.util.Map; + +public class Knight implements ChessPiece { + private final Color color; + + public Knight(Color color) { + this.color = color; + } + + @Override + public List getAvailableDestinations(Position startPosition, Map positions) { + return null; + } + + @Override + public Color getColor() { + return color; + } } diff --git a/src/test/java/chess/piece/KnightTest.java b/src/test/java/chess/piece/KnightTest.java new file mode 100644 index 00000000000..248756e1f3e --- /dev/null +++ b/src/test/java/chess/piece/KnightTest.java @@ -0,0 +1,43 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class KnightTest { + @DisplayName("나이트는 목적지를 제외한 경로 상에 장애물 존재 여부와 상관 없이 이동할 수 있다.") + @Test + void noMatterHurdle() { + Map positions = Map.of( + new Position(Row.FIVE, Column.D), new King(Color.WHITE), + new Position(Row.FOUR, Column.C), new Bishop(Color.BLACK) + ); + Knight knight = new Knight(Color.BLACK); + List expected = List.of( + new Position(Row.SIX, Column.C), + new Position(Row.FIVE, Column.B), + new Position(Row.SIX, Column.E), + new Position(Row.FIVE, Column.F), + new Position(Row.THREE, Column.B), + new Position(Row.TWO, Column.C), + new Position(Row.TWO, Column.E), + new Position(Row.THREE, Column.F) + ); + + // when + List destinations = knight.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From 679ac1b6d054d91ec08691a4b4b93d56901d2d9c Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:42:38 +0900 Subject: [PATCH 19/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EB=82=98=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=EB=8A=94=20=EB=AA=A9=EC=A0=81=EC=A7=80=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=9C=20=EA=B2=BD=EB=A1=9C=20=EC=83=81?= =?UTF-8?q?=EC=9D=98=20=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=84=20=EC=8B=A0?= =?UTF-8?q?=EA=B2=BD=EC=93=B0=EC=A7=80=20=EC=95=8A=EB=8A=94=EB=8B=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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/piece/Knight.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Knight.java b/src/main/java/chess/piece/Knight.java index b1fcf61d0cb..f641a8bbfaa 100644 --- a/src/main/java/chess/piece/Knight.java +++ b/src/main/java/chess/piece/Knight.java @@ -1,13 +1,25 @@ package chess.piece; import chess.Color; +import chess.Movement; import chess.Position; +import java.util.ArrayList; import java.util.List; import java.util.Map; public class Knight implements ChessPiece { private final Color color; + private final List movements = List.of( + Movement.UP_UP_LEFT, + Movement.UP_UP_RIGHT, + Movement.DOWN_DOWN_LEFT, + Movement.DOWN_DOWN_RIGHT, + Movement.LEFT_LEFT_UP, + Movement.LEFT_LEFT_DOWN, + Movement.RIGHT_RIGHT_UP, + Movement.RIGHT_RIGHT_DOWN + ); public Knight(Color color) { this.color = color; @@ -15,7 +27,13 @@ public Knight(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { - return null; + List destinations = new ArrayList<>(); + for (Movement movement : movements) { + if (startPosition.canMove(movement)) { + destinations.add(startPosition.move(movement)); + } + } + return destinations; } @Override From e6ce925064ae6950c513b32356467244d5abade6 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:43:39 +0900 Subject: [PATCH 20/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EB=82=98=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=EB=8A=94=20=EB=AA=A9=EC=A0=81=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EB=A1=9C=EB=A7=8C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8B=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/KnightTest.java | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/chess/piece/KnightTest.java b/src/test/java/chess/piece/KnightTest.java index 248756e1f3e..8d233b4b4e6 100644 --- a/src/test/java/chess/piece/KnightTest.java +++ b/src/test/java/chess/piece/KnightTest.java @@ -40,4 +40,30 @@ void noMatterHurdle() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("목적지에 같은 팀의 기물이 있는 경우, 목적지 후보에서 제외된다.") + @Test + void existSameTeamAtDestination() { + Map positions = Map.of( + new Position(Row.SIX, Column.C), new King(Color.BLACK), + new Position(Row.THREE, Column.F), new Bishop(Color.BLACK) + ); + Knight knight = new Knight(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.B), + new Position(Row.SIX, Column.E), + new Position(Row.FIVE, Column.F), + new Position(Row.THREE, Column.B), + new Position(Row.TWO, Column.C), + new Position(Row.TWO, Column.E) + ); + + // when + List destinations = knight.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From bff664df2dd08438db41380caa06c2f12d2c9367 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:47:20 +0900 Subject: [PATCH 21/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EB=82=98=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=EB=8A=94=20=EB=AA=A9=EC=A0=81=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=ED=8C=80=EC=9D=98=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EB=A1=9C=EB=A7=8C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8B=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Knight.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Knight.java b/src/main/java/chess/piece/Knight.java index f641a8bbfaa..7503274aef2 100644 --- a/src/main/java/chess/piece/Knight.java +++ b/src/main/java/chess/piece/Knight.java @@ -29,7 +29,10 @@ public Knight(Color color) { public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); for (Movement movement : movements) { - if (startPosition.canMove(movement)) { + if (startPosition.canMove(movement) + && (!positions.containsKey(startPosition.move(movement)) + || positions.get(startPosition.move(movement)).getColor() != color + )) { destinations.add(startPosition.move(movement)); } } From 877ab3377bd0e68b7d7856252ab6ef5dfe9e72cd Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:52:42 +0900 Subject: [PATCH 22/48] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8Frefactor:=20?= =?UTF-8?q?=EB=AA=A9=EC=A0=81=EC=A7=80=20=EB=8F=84=EB=8B=AC=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=A9=94=EC=84=9C=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 --- src/main/java/chess/piece/Knight.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/chess/piece/Knight.java b/src/main/java/chess/piece/Knight.java index 7503274aef2..f27efd5eb80 100644 --- a/src/main/java/chess/piece/Knight.java +++ b/src/main/java/chess/piece/Knight.java @@ -29,16 +29,17 @@ public Knight(Color color) { public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); for (Movement movement : movements) { - if (startPosition.canMove(movement) - && (!positions.containsKey(startPosition.move(movement)) - || positions.get(startPosition.move(movement)).getColor() != color - )) { + if (startPosition.canMove(movement) && canMove(startPosition.move(movement), positions)) { destinations.add(startPosition.move(movement)); } } return destinations; } + private boolean canMove(Position targetPosition, Map positions) { + return !positions.containsKey(targetPosition) || positions.get(targetPosition).getColor() != color; + } + @Override public Color getColor() { return color; From 912ed7994b093a8bc0081728bb70699cc3f0004a Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 15:56:42 +0900 Subject: [PATCH 23/48] =?UTF-8?q?docs(README.md):=20=EB=82=98=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=AC=BC=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0015011b6ec..c4cd2236187 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,9 @@ - [x] 장애물을 통과할 수 없음 - [x] 왕 - [x] 상, 하, 좌, 우, 대각선 한 칸씩 이동 가능 - - [x] 장애물을 통과할 수 없음 -- [ ] 나이트 - - [ ] 상, 하, 좌, 우 방향으로 앞으로 두 칸, 대각선으로 한 칸 이동 가능 - - [ ] 장애물을 통과할 수 있음 +- [x] 나이트 + - [x] 상, 하, 좌, 우 방향으로 앞으로 한 칸, 대각선으로 한 칸 이동 가능 + - [x] 장애물을 통과할 수 있음 - [ ] 폰 - [ ] 처음 이동할 때는 앞으로 두 칸 이동도 가능 (한 칸만 움직일 수도 있음) - [ ] 상대 말을 잡을 때는 무조건 대각선으로만 잡을 수 있음 @@ -34,3 +33,7 @@ - [ ] 장애물을 통과할 수 없음 ## 기물 배치하기 + +## 기물 잡기 + +- [ ] 기물이 이동한 위치에 다른 팀의 기물이 존재하는 경우 From 1870afda722d6cf5660eef2bed62931a7839d447 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:01:16 +0900 Subject: [PATCH 24/48] =?UTF-8?q?=F0=9F=94=B4red:=20=ED=80=B8=20-=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=AA=A9=EC=A0=81=EC=A7=80=20=EB=B0=98=ED=99=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Queen.java | 22 ++++++++- src/test/java/chess/piece/QueenTest.java | 60 ++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chess/piece/QueenTest.java diff --git a/src/main/java/chess/piece/Queen.java b/src/main/java/chess/piece/Queen.java index 9b547261c4b..ef0d1e24834 100644 --- a/src/main/java/chess/piece/Queen.java +++ b/src/main/java/chess/piece/Queen.java @@ -1,5 +1,25 @@ package chess.piece; -public class Queen { +import chess.Color; +import chess.Position; +import java.util.List; +import java.util.Map; + +public class Queen implements ChessPiece { + private final Color color; + + public Queen(Color color) { + this.color = color; + } + + @Override + public List getAvailableDestinations(Position startPosition, Map positions) { + return null; + } + + @Override + public Color getColor() { + return null; + } } diff --git a/src/test/java/chess/piece/QueenTest.java b/src/test/java/chess/piece/QueenTest.java new file mode 100644 index 00000000000..d792214bc3b --- /dev/null +++ b/src/test/java/chess/piece/QueenTest.java @@ -0,0 +1,60 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class QueenTest { + @DisplayName("장애물이 존재하지 않는 경우, 8개 방향으로 끝까지 이동할 수 있다.") + @Test + void notExistHurdles() { + // given + Map positions = Map.of(); + Queen queen = new Queen(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.ONE, Column.G), + new Position(Row.FIVE, Column.E), + new Position(Row.SIX, Column.F), + new Position(Row.SEVEN, Column.G), + new Position(Row.EIGHT, Column.H), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A), + new Position(Row.EIGHT, Column.D), + new Position(Row.SEVEN, Column.D), + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D), + new Position(Row.THREE, Column.D), + new Position(Row.TWO, Column.D), + new Position(Row.ONE, Column.D), + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G), + new Position(Row.FOUR, Column.H) + ); + + // when + List destinations = queen.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From 6ba197799228503a2557fdb2d6bdacdacf25760e Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:05:26 +0900 Subject: [PATCH 25/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=ED=80=B8=20-=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=AA=A9=EC=A0=81=EC=A7=80=20=EB=B0=98=ED=99=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=86=B5=EA=B3=BC=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Queen.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Queen.java b/src/main/java/chess/piece/Queen.java index ef0d1e24834..08c828a2c41 100644 --- a/src/main/java/chess/piece/Queen.java +++ b/src/main/java/chess/piece/Queen.java @@ -1,13 +1,25 @@ package chess.piece; import chess.Color; +import chess.Movement; import chess.Position; +import java.util.ArrayList; import java.util.List; import java.util.Map; public class Queen implements ChessPiece { private final Color color; + private final List movements = List.of( + Movement.UP, + Movement.DOWN, + Movement.LEFT, + Movement.RIGHT, + Movement.LEFT_UP, + Movement.RIGHT_UP, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN + ); public Queen(Color color) { this.color = color; @@ -15,7 +27,15 @@ public Queen(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { - return null; + List destinations = new ArrayList<>(); + for (Movement movement : movements) { + Position currentPosition = startPosition; + while (currentPosition.canMove(movement)) { + currentPosition = currentPosition.move(movement); + destinations.add(currentPosition); + } + } + return destinations; } @Override From c81e7a235bfd8e5decdd4a0f2b6644c7162258bf Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:05:51 +0900 Subject: [PATCH 26/48] =?UTF-8?q?feat:=20=ED=80=B8=20-=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EB=B0=98=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Queen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Queen.java b/src/main/java/chess/piece/Queen.java index 08c828a2c41..c4d0af934a1 100644 --- a/src/main/java/chess/piece/Queen.java +++ b/src/main/java/chess/piece/Queen.java @@ -40,6 +40,6 @@ public List getAvailableDestinations(Position startPosition, Map Date: Sat, 22 Mar 2025 16:09:24 +0900 Subject: [PATCH 27/48] =?UTF-8?q?=F0=9F=94=B4red:=20=ED=80=B8=20-=20?= =?UTF-8?q?=EC=83=81=EB=8C=80=ED=8E=B8=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/QueenTest.java | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/test/java/chess/piece/QueenTest.java b/src/test/java/chess/piece/QueenTest.java index d792214bc3b..e38f493f308 100644 --- a/src/test/java/chess/piece/QueenTest.java +++ b/src/test/java/chess/piece/QueenTest.java @@ -57,4 +57,48 @@ void notExistHurdles() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("상대편 기물이 존재하는 경우, 8개 방향으로 상대편 기물 위치까지 이동할 수 있다.") + @Test + void moveUntilEnemyPositions() { + // given + Map positions = Map.of( + new Position(Row.FIVE, Column.E), new Bishop(Color.WHITE), + new Position(Row.TWO, Column.D), new Knight(Color.WHITE) + ); + Queen queen = new Queen(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.ONE, Column.G), + new Position(Row.FIVE, Column.E), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A), + new Position(Row.EIGHT, Column.D), + new Position(Row.SEVEN, Column.D), + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D), + new Position(Row.THREE, Column.D), + new Position(Row.TWO, Column.D), + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G), + new Position(Row.FOUR, Column.H) + ); + + // when + List destinations = queen.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From e71345aef1f7e22908e6e394539d618f07430053 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:11:21 +0900 Subject: [PATCH 28/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=ED=80=B8=20-=20?= =?UTF-8?q?=EC=83=81=EB=8C=80=ED=8E=B8=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Queen.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/chess/piece/Queen.java b/src/main/java/chess/piece/Queen.java index c4d0af934a1..6f3d2f49dc5 100644 --- a/src/main/java/chess/piece/Queen.java +++ b/src/main/java/chess/piece/Queen.java @@ -28,16 +28,32 @@ public Queen(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); + for (Movement movement : movements) { Position currentPosition = startPosition; while (currentPosition.canMove(movement)) { currentPosition = currentPosition.move(movement); + if (!canMove(currentPosition, positions)) { + break; + } destinations.add(currentPosition); + if (positions.containsKey(currentPosition)) { + break; + } } } + return destinations; } + private boolean canMove(Position targetPosition, Map positions) { + return !positions.containsKey(targetPosition) || canCatch(targetPosition, positions); + } + + private boolean canCatch(Position targetPosition, Map positions) { + return positions.containsKey(targetPosition) && positions.get(targetPosition).getColor() != color; + } + @Override public Color getColor() { return color; From f1d5ce7175151766fe07f4f01ef57fc10f06f42b Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:13:16 +0900 Subject: [PATCH 29/48] =?UTF-8?q?test(Queen):=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=ED=8E=B8=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/QueenTest.java | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/chess/piece/QueenTest.java b/src/test/java/chess/piece/QueenTest.java index e38f493f308..1a8724b7eab 100644 --- a/src/test/java/chess/piece/QueenTest.java +++ b/src/test/java/chess/piece/QueenTest.java @@ -101,4 +101,46 @@ void moveUntilEnemyPositions() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("같은 팀 기물이 존재하는 경우, 해당 위치 이전까지만 이동할 수 있다.") + @Test + void existSameTeam() { + // given + Map positions = Map.of( + new Position(Row.FIVE, Column.E), new Bishop(Color.BLACK), + new Position(Row.TWO, Column.D), new Knight(Color.BLACK) + ); + Queen queen = new Queen(Color.BLACK); + List expected = List.of( + new Position(Row.FIVE, Column.C), + new Position(Row.SIX, Column.B), + new Position(Row.SEVEN, Column.A), + new Position(Row.THREE, Column.E), + new Position(Row.TWO, Column.F), + new Position(Row.ONE, Column.G), + new Position(Row.THREE, Column.C), + new Position(Row.TWO, Column.B), + new Position(Row.ONE, Column.A), + new Position(Row.EIGHT, Column.D), + new Position(Row.SEVEN, Column.D), + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D), + new Position(Row.THREE, Column.D), + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G), + new Position(Row.FOUR, Column.H) + ); + + // when + List destinations = queen.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 60497516629876746daa872cca32b444fb30eabb Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:14:26 +0900 Subject: [PATCH 30/48] =?UTF-8?q?docs(README.md):=20=EC=97=AC=EC=99=95=20?= =?UTF-8?q?=EA=B8=B0=EB=AC=BC=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c4cd2236187..b5980aca91e 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ - [ ] 처음 이동할 때는 앞으로 두 칸 이동도 가능 (한 칸만 움직일 수도 있음) - [ ] 상대 말을 잡을 때는 무조건 대각선으로만 잡을 수 있음 - [ ] 뒤로는 이동할 수 없음 -- [ ] 여왕 - - [ ] 상, 하, 좌, 우, 대각선 원하는만큼 이동 가능 - - [ ] 장애물을 통과할 수 없음 +- [x] 여왕 + - [x] 상, 하, 좌, 우, 대각선 원하는만큼 이동 가능 + - [x] 장애물을 통과할 수 없음 - [ ] 룩 - [ ] 상, 하, 좌, 우 원하는만큼 이동 가능 - [ ] 장애물을 통과할 수 없음 From 04aa901e5a3c7833312625f6ef172c119a77276f Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:21:32 +0900 Subject: [PATCH 31/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EB=A3=A9=20-=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=81=9D=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Rook.java | 22 ++++++++++- src/test/java/chess/piece/RookTest.java | 51 +++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chess/piece/RookTest.java diff --git a/src/main/java/chess/piece/Rook.java b/src/main/java/chess/piece/Rook.java index 7ed4d08bf03..23533e59282 100644 --- a/src/main/java/chess/piece/Rook.java +++ b/src/main/java/chess/piece/Rook.java @@ -1,5 +1,25 @@ package chess.piece; -public class Rook { +import chess.Color; +import chess.Position; +import java.util.List; +import java.util.Map; + +public class Rook implements ChessPiece { + private final Color color; + + public Rook(Color color) { + this.color = color; + } + + @Override + public List getAvailableDestinations(Position startPosition, Map positions) { + return null; + } + + @Override + public Color getColor() { + return color; + } } diff --git a/src/test/java/chess/piece/RookTest.java b/src/test/java/chess/piece/RookTest.java new file mode 100644 index 00000000000..0e7163a6fc0 --- /dev/null +++ b/src/test/java/chess/piece/RookTest.java @@ -0,0 +1,51 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class RookTest { + @DisplayName("룩 - 장애물이 존재하지 않을 경우 이동 경로 끝까지 이동할 수 있다.") + @Test + void notExistHurdles() { + // given + Position rookPosition = new Position(Row.FOUR, Column.D); + Rook rook = new Rook(Color.BLACK); + Map positions = Map.of( + rookPosition, rook + ); + List expected = List.of( + new Position(Row.EIGHT, Column.D), + new Position(Row.SEVEN, Column.D), + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D), + new Position(Row.THREE, Column.D), + new Position(Row.TWO, Column.D), + new Position(Row.ONE, Column.D), + + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G), + new Position(Row.FOUR, Column.H) + ); + + // when + List destinations = rook.getAvailableDestinations( + rookPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From 55ec868df31ba411637b86b1719ed1526ef92436 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:23:21 +0900 Subject: [PATCH 32/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EB=A3=A9=20-=20?= =?UTF-8?q?=EC=9E=A5=EC=95=A0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=81=9D=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=86=B5=EA=B3=BC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Rook.java | 34 ++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Rook.java b/src/main/java/chess/piece/Rook.java index 23533e59282..6deb806d1f0 100644 --- a/src/main/java/chess/piece/Rook.java +++ b/src/main/java/chess/piece/Rook.java @@ -1,13 +1,21 @@ package chess.piece; import chess.Color; +import chess.Movement; import chess.Position; +import java.util.ArrayList; import java.util.List; import java.util.Map; public class Rook implements ChessPiece { private final Color color; + private final List movements = List.of( + Movement.UP, + Movement.DOWN, + Movement.LEFT, + Movement.RIGHT + ); public Rook(Color color) { this.color = color; @@ -15,7 +23,31 @@ public Rook(Color color) { @Override public List getAvailableDestinations(Position startPosition, Map positions) { - return null; + List destinations = new ArrayList<>(); + + for (Movement movement : movements) { + Position currentPosition = startPosition; + while (currentPosition.canMove(movement)) { + currentPosition = currentPosition.move(movement); + if (!canMove(currentPosition, positions)) { + break; + } + destinations.add(currentPosition); + if (positions.containsKey(currentPosition)) { + break; + } + } + } + + return destinations; + } + + private boolean canMove(Position targetPosition, Map positions) { + return !positions.containsKey(targetPosition) || canCatch(targetPosition, positions); + } + + private boolean canCatch(Position targetPosition, Map positions) { + return positions.containsKey(targetPosition) && positions.get(targetPosition).getColor() != color; } @Override From 2f81746bee6078fd4bc4cb0789623d2b8119aa5f Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:30:15 +0900 Subject: [PATCH 33/48] =?UTF-8?q?test(Rook):=20=EC=9E=A5=EC=95=A0=EB=AC=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/RookTest.java | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/test/java/chess/piece/RookTest.java b/src/test/java/chess/piece/RookTest.java index 0e7163a6fc0..2d56cf38f0c 100644 --- a/src/test/java/chess/piece/RookTest.java +++ b/src/test/java/chess/piece/RookTest.java @@ -48,4 +48,69 @@ void notExistHurdles() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("이동경로에 같은 팀 기물이 존재하는 경우, 해당 기물들을 마주하기 전까지의 위치로 움직일 수 있다.") + @Test + void existSameTeamHurdle() { + // given + Position rookPosition = new Position(Row.FOUR, Column.D); + Rook rook = new Rook(Color.BLACK); + Map positions = Map.of( + rookPosition, rook, + new Position(Row.SIX, Column.D), new Bishop(Color.BLACK), + new Position(Row.FOUR, Column.H), new Bishop(Color.BLACK), + new Position(Row.THREE, Column.D), new Knight(Color.BLACK) + ); + List expected = List.of( + new Position(Row.FIVE, Column.D), + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G) + ); + + // when + List destinations = rook.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } + + @DisplayName("이동경로에 다른 팀 기물이 존재하는 경우, 해당 기물들의 위치로 움직일 수 있다.") + @Test + void existOtherTeamHurdle() { + // given + Position rookPosition = new Position(Row.FOUR, Column.D); + Rook rook = new Rook(Color.BLACK); + Map positions = Map.of( + rookPosition, rook, + new Position(Row.SIX, Column.D), new Bishop(Color.WHITE), + new Position(Row.FOUR, Column.H), new Bishop(Color.WHITE), + new Position(Row.THREE, Column.D), new Knight(Color.WHITE) + ); + List expected = List.of( + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D), + new Position(Row.THREE, Column.D), + new Position(Row.FOUR, Column.A), + new Position(Row.FOUR, Column.B), + new Position(Row.FOUR, Column.C), + new Position(Row.FOUR, Column.E), + new Position(Row.FOUR, Column.F), + new Position(Row.FOUR, Column.G), + new Position(Row.FOUR, Column.H) + ); + + // when + List destinations = rook.getAvailableDestinations( + new Position(Row.FOUR, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 29e872b1b74cb30d5d3b2564f333aca34e9858af Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:30:49 +0900 Subject: [PATCH 34/48] =?UTF-8?q?docs(README.md):=20=EB=A3=A9=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9E=84=20=EA=B5=AC=ED=98=84=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b5980aca91e..27be1288e54 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,9 @@ - [x] 여왕 - [x] 상, 하, 좌, 우, 대각선 원하는만큼 이동 가능 - [x] 장애물을 통과할 수 없음 -- [ ] 룩 - - [ ] 상, 하, 좌, 우 원하는만큼 이동 가능 - - [ ] 장애물을 통과할 수 없음 +- [x] 룩 + - [x] 상, 하, 좌, 우 원하는만큼 이동 가능 + - [x] 장애물을 통과할 수 없음 ## 기물 배치하기 From 4192fc6d82ca13cc4afd81300ac2630adb7d086a Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:43:03 +0900 Subject: [PATCH 35/48] =?UTF-8?q?refactor(ChessPiece):=20move=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=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/piece/Bishop.java | 13 +++++++++++++ src/main/java/chess/piece/ChessPiece.java | 1 + src/main/java/chess/piece/King.java | 13 +++++++++++++ src/main/java/chess/piece/Knight.java | 13 +++++++++++++ src/main/java/chess/piece/Queen.java | 13 +++++++++++++ src/main/java/chess/piece/Rook.java | 13 +++++++++++++ 6 files changed, 66 insertions(+) diff --git a/src/main/java/chess/piece/Bishop.java b/src/main/java/chess/piece/Bishop.java index 29d8c9721c3..472f23963b0 100644 --- a/src/main/java/chess/piece/Bishop.java +++ b/src/main/java/chess/piece/Bishop.java @@ -21,6 +21,19 @@ public Bishop(Color color) { this.color = color; } + @Override + public Position move(Position from, Position to, Map positions) { + if (!isValidPath(from, to, positions)) { + throw new IllegalArgumentException("경로가 유효하지 않습니다."); + } + return to; + } + + private boolean isValidPath(Position from, Position to, Map positions) { + List availableDestinations = getAvailableDestinations(from, positions); + return availableDestinations.contains(to); + } + public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); diff --git a/src/main/java/chess/piece/ChessPiece.java b/src/main/java/chess/piece/ChessPiece.java index 8c727d4ed21..d6e9ab0d98d 100644 --- a/src/main/java/chess/piece/ChessPiece.java +++ b/src/main/java/chess/piece/ChessPiece.java @@ -9,4 +9,5 @@ public interface ChessPiece { List getAvailableDestinations(Position startPosition, Map positions); Color getColor(); + Position move(Position from, Position to, Map positions); } diff --git a/src/main/java/chess/piece/King.java b/src/main/java/chess/piece/King.java index fea756e962b..4ef17367038 100644 --- a/src/main/java/chess/piece/King.java +++ b/src/main/java/chess/piece/King.java @@ -24,6 +24,19 @@ public King(Color color) { this.color = color; } + @Override + public Position move(Position from, Position to, Map positions) { + if (!isValidPath(from, to, positions)) { + throw new IllegalArgumentException("경로가 유효하지 않습니다."); + } + return to; + } + + private boolean isValidPath(Position from, Position to, Map positions) { + List availableDestinations = getAvailableDestinations(from, positions); + return availableDestinations.contains(to); + } + @Override public List getAvailableDestinations(Position startPosition, Map positions) { return movements.stream() diff --git a/src/main/java/chess/piece/Knight.java b/src/main/java/chess/piece/Knight.java index f27efd5eb80..3a340387b0f 100644 --- a/src/main/java/chess/piece/Knight.java +++ b/src/main/java/chess/piece/Knight.java @@ -25,6 +25,19 @@ public Knight(Color color) { this.color = color; } + @Override + public Position move(Position from, Position to, Map positions) { + if (!isValidPath(from, to, positions)) { + throw new IllegalArgumentException("경로가 유효하지 않습니다."); + } + return to; + } + + private boolean isValidPath(Position from, Position to, Map positions) { + List availableDestinations = getAvailableDestinations(from, positions); + return availableDestinations.contains(to); + } + @Override public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); diff --git a/src/main/java/chess/piece/Queen.java b/src/main/java/chess/piece/Queen.java index 6f3d2f49dc5..6d8bfb35e4f 100644 --- a/src/main/java/chess/piece/Queen.java +++ b/src/main/java/chess/piece/Queen.java @@ -25,6 +25,19 @@ public Queen(Color color) { this.color = color; } + @Override + public Position move(Position from, Position to, Map positions) { + if (!isValidPath(from, to, positions)) { + throw new IllegalArgumentException("경로가 유효하지 않습니다."); + } + return to; + } + + private boolean isValidPath(Position from, Position to, Map positions) { + List availableDestinations = getAvailableDestinations(from, positions); + return availableDestinations.contains(to); + } + @Override public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); diff --git a/src/main/java/chess/piece/Rook.java b/src/main/java/chess/piece/Rook.java index 6deb806d1f0..c84dd70313a 100644 --- a/src/main/java/chess/piece/Rook.java +++ b/src/main/java/chess/piece/Rook.java @@ -21,6 +21,19 @@ public Rook(Color color) { this.color = color; } + @Override + public Position move(Position from, Position to, Map positions) { + if (!isValidPath(from, to, positions)) { + throw new IllegalArgumentException("경로가 유효하지 않습니다."); + } + return to; + } + + private boolean isValidPath(Position from, Position to, Map positions) { + List availableDestinations = getAvailableDestinations(from, positions); + return availableDestinations.contains(to); + } + @Override public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); From 5e1fd2b21a94f106b09dbcd2f4bd50aa06945fa1 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:49:47 +0900 Subject: [PATCH 36/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EA=B2=80=EC=9D=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0,=20=EC=95=84?= =?UTF-8?q?=EB=9E=98=20=EB=B0=A9=ED=96=A5=EC=9C=BC=EB=A1=9C=20=EB=91=90=20?= =?UTF-8?q?=EC=B9=B8=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Pawn.java | 30 ++++++++++++++++++++- src/test/java/chess/piece/PawnTest.java | 35 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chess/piece/PawnTest.java diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index c8b6cafa51e..28f846e13ed 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -1,5 +1,33 @@ package chess.piece; -public class Pawn { +import chess.Color; +import chess.Position; +import java.util.List; +import java.util.Map; + +public class Pawn implements ChessPiece { + private final Color color; + private boolean isFirstMove; + + public Pawn(Color color) { + this.color = color; + isFirstMove = true; + } + + @Override + public List getAvailableDestinations(Position startPosition, Map positions) { + return null; + } + + @Override + public Color getColor() { + return null; + } + + @Override + public Position move(Position from, Position to, Map positions) { + isFirstMove = false; + return null; + } } diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java new file mode 100644 index 00000000000..d549283d846 --- /dev/null +++ b/src/test/java/chess/piece/PawnTest.java @@ -0,0 +1,35 @@ +package chess.piece; + +import chess.Color; +import chess.Column; +import chess.Position; +import chess.Row; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class PawnTest { + @DisplayName("BLACK - 처음 움직이는 경우 두 칸까지 전진할 수 있다.") + @Test + void notExistHurdle() { + // given + Map positions = Map.of(); + Pawn pawn = new Pawn(Color.BLACK); + List expected = List.of( + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations( + new Position(Row.SEVEN, Column.D), positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } +} From f8e9aa70d5daa12d233345a579665bdbd9564b87 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 16:50:14 +0900 Subject: [PATCH 37/48] =?UTF-8?q?feat(Pawn):=20color=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Pawn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index 28f846e13ed..d11ffcd8eb0 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -22,7 +22,7 @@ public List getAvailableDestinations(Position startPosition, Map Date: Sat, 22 Mar 2025 17:13:24 +0900 Subject: [PATCH 38/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EA=B2=80=EC=9D=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0,=20=EC=95=84?= =?UTF-8?q?=EB=9E=98=20=EB=B0=A9=ED=96=A5=EC=9C=BC=EB=A1=9C=20=EB=91=90=20?= =?UTF-8?q?=EC=B9=B8=EA=B9=8C=EC=A7=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=86=B5=EA=B3=BC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Pawn.java | 32 +++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index d11ffcd8eb0..945becb0d21 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -1,8 +1,10 @@ package chess.piece; import chess.Color; +import chess.Movement; import chess.Position; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -16,18 +18,36 @@ public Pawn(Color color) { } @Override - public List getAvailableDestinations(Position startPosition, Map positions) { + public Position move(Position from, Position to, Map positions) { + isFirstMove = false; return null; } @Override - public Color getColor() { - return color; + public List getAvailableDestinations(Position startPosition, Map positions) { + List destinations = new ArrayList<>(); + for (Movement movement : getMovements()) { + if (startPosition.canMove(movement)) { + destinations.add(startPosition.move(movement)); + } + } + return destinations; + } + + private List getMovements() { + if (isFirstMove) { + return List.of( + Movement.DOWN, + Movement.DOWN_DOWN + ); + } + return List.of( + Movement.DOWN + ); } @Override - public Position move(Position from, Position to, Map positions) { - isFirstMove = false; - return null; + public Color getColor() { + return color; } } From 4109e7b4ab790b26c456533a3e5007e0ab9d2d74 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 17:14:29 +0900 Subject: [PATCH 39/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EA=B2=80=EC=9D=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0,=20=EC=A0=84?= =?UTF-8?q?=EC=A7=84=20=EB=B0=A9=ED=96=A5=EC=9D=98=20=EB=8C=80=EA=B0=81?= =?UTF-8?q?=EC=84=A0=EC=97=90=20=EC=A0=81=EC=9D=B4=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=ED=95=98=EB=A9=B4=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index d549283d846..10b26188f6c 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -32,4 +32,29 @@ void notExistHurdle() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("BLACK - 전진 방향의 대각선에 상대편 기물이 있는 경우 해당 위치로 이동할 수 있다.") + @Test + void existEnemyAtDiagonal() { + // given + Position pawnPosition = new Position(Row.SEVEN, Column.D); + Pawn pawn = new Pawn(Color.BLACK); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.SIX, Column.C), new Knight(Color.WHITE) + ); + List expected = List.of( + new Position(Row.SIX, Column.C), + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations( + pawnPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 4f411a1d4060670c74eb23a679977eea3788fe99 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 17:23:16 +0900 Subject: [PATCH 40/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=EA=B2=80=EC=9D=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0,=20=EC=A0=84?= =?UTF-8?q?=EC=A7=84=20=EB=B0=A9=ED=96=A5=EC=9D=98=20=EB=8C=80=EA=B0=81?= =?UTF-8?q?=EC=84=A0=EC=97=90=20=EC=A0=81=EC=9D=B4=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=ED=95=98=EB=A9=B4=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=BC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Pawn.java | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index 945becb0d21..0fc94a45bfd 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -27,7 +27,7 @@ public Position move(Position from, Position to, Map posit public List getAvailableDestinations(Position startPosition, Map positions) { List destinations = new ArrayList<>(); for (Movement movement : getMovements()) { - if (startPosition.canMove(movement)) { + if (canMove(startPosition, movement, positions)) { destinations.add(startPosition.move(movement)); } } @@ -38,14 +38,31 @@ private List getMovements() { if (isFirstMove) { return List.of( Movement.DOWN, - Movement.DOWN_DOWN + Movement.DOWN_DOWN, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN ); } return List.of( - Movement.DOWN + Movement.DOWN, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN ); } + private boolean canMove(Position startPosition, Movement movement, Map positions) { + if (!startPosition.canMove(movement)) { + return false; + } + Position targetPosition = startPosition.move(movement); + if (movement.isDiagonal()) { + // 대각선 방향인 경우 - 상대 기물이 존재하는지 확인 + return positions.containsKey(targetPosition) && positions.get(targetPosition).getColor() != color; + } + // 빈 칸 확인 + return !positions.containsKey(targetPosition); + } + @Override public Color getColor() { return color; From 8b9a342e02b7e7363f94a2198879ee4a20724aa5 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 17:24:11 +0900 Subject: [PATCH 41/48] =?UTF-8?q?test(Pawn):=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=ED=8E=B8=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=9D=B4=EB=8F=99=20=EB=B6=88=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index 10b26188f6c..e575a2b3b57 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -57,4 +57,28 @@ void existEnemyAtDiagonal() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("BLACK - 전진 방향의 대각선에 같은편 기물이 있는 경우 해당 위치로 이동할 수 없다.") + @Test + void existSameTeamHurdle() { + // given + Position pawnPosition = new Position(Row.SEVEN, Column.D); + Pawn pawn = new Pawn(Color.BLACK); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.SIX, Column.C), new Knight(Color.BLACK) + ); + List expected = List.of( + new Position(Row.SIX, Column.D), + new Position(Row.FIVE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations( + pawnPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From bc806d0571c4a0f291c116410e83192535800c8e Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 17:28:00 +0900 Subject: [PATCH 42/48] =?UTF-8?q?=F0=9F=94=B4red:=20=ED=95=98=EC=96=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=91=90=20?= =?UTF-8?q?=EC=B9=B8=EA=B9=8C=EC=A7=80=20=EC=A0=84=EC=A7=84=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 30 +++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index e575a2b3b57..6c8f70cecc7 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -17,8 +17,11 @@ class PawnTest { @Test void notExistHurdle() { // given - Map positions = Map.of(); + Position pawnPosition = new Position(Row.SEVEN, Column.D); Pawn pawn = new Pawn(Color.BLACK); + Map positions = Map.of( + pawnPosition, pawn + ); List expected = List.of( new Position(Row.SIX, Column.D), new Position(Row.FIVE, Column.D) @@ -26,7 +29,7 @@ void notExistHurdle() { // when List destinations = pawn.getAvailableDestinations( - new Position(Row.SEVEN, Column.D), positions + pawnPosition, positions ); // then @@ -81,4 +84,27 @@ void existSameTeamHurdle() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("WHITE - 처음 움직이는 경우 두 칸까지 전진할 수 있다.") + @Test + void notExistHurdleWhite() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn + ); + List expected = List.of( + new Position(Row.THREE, Column.D), + new Position(Row.FOUR, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations( + pawnPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From fddb3db2c79bc03ab287ae80d5ba0e32087c8cc0 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 18:53:28 +0900 Subject: [PATCH 43/48] =?UTF-8?q?=F0=9F=9F=A2green:=20=ED=95=98=EC=96=80?= =?UTF-8?q?=EC=83=89=20=ED=8F=B0=EC=9D=B4=20=EC=B2=98=EC=9D=8C=20=EC=9B=80?= =?UTF-8?q?=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EB=91=90=20?= =?UTF-8?q?=EC=B9=B8=EA=B9=8C=EC=A7=80=20=EC=A0=84=EC=A7=84=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=86=B5=EA=B3=BC=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/chess/piece/Pawn.java | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index 0fc94a45bfd..6a82d98073c 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -35,18 +35,33 @@ public List getAvailableDestinations(Position startPosition, Map getMovements() { - if (isFirstMove) { + if (color.isBlack()) { + if (isFirstMove) { + return List.of( + Movement.DOWN, + Movement.DOWN_DOWN, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN + ); + } return List.of( Movement.DOWN, - Movement.DOWN_DOWN, Movement.LEFT_DOWN, Movement.RIGHT_DOWN ); } + if (isFirstMove) { + return List.of( + Movement.UP, + Movement.UP_UP, + Movement.LEFT_UP, + Movement.RIGHT_UP + ); + } return List.of( - Movement.DOWN, - Movement.LEFT_DOWN, - Movement.RIGHT_DOWN + Movement.UP, + Movement.LEFT_UP, + Movement.RIGHT_UP ); } From 8130ee9de9894a66dd8a8de4d02815c6df3dc2fe Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 19:01:44 +0900 Subject: [PATCH 44/48] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8Frefactor:=20?= =?UTF-8?q?=ED=8F=B0=EC=9D=98=20=EC=9B=80=EC=A7=81=EC=9E=84=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=84=9C=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 --- src/main/java/chess/piece/Pawn.java | 43 +++++++++++++++-------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/chess/piece/Pawn.java b/src/main/java/chess/piece/Pawn.java index 6a82d98073c..e96b3a0193f 100644 --- a/src/main/java/chess/piece/Pawn.java +++ b/src/main/java/chess/piece/Pawn.java @@ -5,6 +5,7 @@ import chess.Position; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -36,33 +37,33 @@ public List getAvailableDestinations(Position startPosition, Map getMovements() { if (color.isBlack()) { - if (isFirstMove) { - return List.of( - Movement.DOWN, - Movement.DOWN_DOWN, - Movement.LEFT_DOWN, - Movement.RIGHT_DOWN - ); - } - return List.of( - Movement.DOWN, - Movement.LEFT_DOWN, - Movement.RIGHT_DOWN - ); + return getBlackMovements(); } + return getWhiteMovements(); + } + + private List getBlackMovements() { + List result = new ArrayList<>(List.of( + Movement.DOWN, + Movement.LEFT_DOWN, + Movement.RIGHT_DOWN + )); if (isFirstMove) { - return List.of( - Movement.UP, - Movement.UP_UP, - Movement.LEFT_UP, - Movement.RIGHT_UP - ); + result.add(Movement.DOWN_DOWN); } - return List.of( + return Collections.unmodifiableList(result); + } + + private List getWhiteMovements() { + List result = new ArrayList<>(List.of( Movement.UP, Movement.LEFT_UP, Movement.RIGHT_UP - ); + )); + if (isFirstMove) { + result.add(Movement.UP_UP); + } + return Collections.unmodifiableList(result); } private boolean canMove(Position startPosition, Movement movement, Map positions) { From 329c20d9e47231171212396bdd7b4759756493a1 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 19:08:49 +0900 Subject: [PATCH 45/48] =?UTF-8?q?test(Pawn):=20=ED=95=98=EC=96=80=EC=83=89?= =?UTF-8?q?=20=ED=8F=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index 6c8f70cecc7..727a1efc23b 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -107,4 +107,53 @@ void notExistHurdleWhite() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("WHITE - 전진 방향의 대각선에 상대편 기물이 있는 경우 해당 위치로 이동할 수 있다.") + @Test + void existEnemyAtDiagonal_WHITE() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.THREE, Column.E), new Knight(Color.BLACK) + ); + List expected = List.of( + new Position(Row.THREE, Column.D), + new Position(Row.FOUR, Column.D), + new Position(Row.THREE, Column.E) + ); + + // when + List destinations = pawn.getAvailableDestinations( + pawnPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } + + @DisplayName("WHITE - 전진 방향의 대각선에 같은편 기물이 있는 경우 해당 위치로 이동할 수 없다.") + @Test + void existSameTeamHurdle_WHITE() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.THREE, Column.E), new Knight(Color.WHITE) + ); + List expected = List.of( + new Position(Row.THREE, Column.D), + new Position(Row.FOUR, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations( + pawnPosition, positions + ); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 096bc1ea01222f90289fb1a1aa1115755f72f897 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 19:19:06 +0900 Subject: [PATCH 46/48] =?UTF-8?q?test(Pawn):=20=ED=8F=B0=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EC=9B=80=EC=A7=81=EC=9D=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=A0=A5=EC=9D=B4=20=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 40 +++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index 727a1efc23b..f92337083d9 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -85,6 +85,26 @@ void existSameTeamHurdle() { assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + @DisplayName("BLACK - 이전에 움직인 이력이 있는 경우, 앞으로 한 칸만 전진할 수 있따.") + @Test + void onlyOneForwardMoved_BLACK() { + // given + Pawn pawn = new Pawn(Color.BLACK); + Position previous = new Position(Row.SEVEN, Column.D); + Position current = new Position(Row.SIX, Column.D); + pawn.move(previous, current, Map.of()); + + List expect = List.of( + new Position(Row.FIVE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations(current, Map.of()); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expect); + } + @DisplayName("WHITE - 처음 움직이는 경우 두 칸까지 전진할 수 있다.") @Test void notExistHurdleWhite() { @@ -156,4 +176,24 @@ void existSameTeamHurdle_WHITE() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("WHITE - 이전에 움직인 이력이 있는 경우, 앞으로 한 칸만 전진할 수 있따.") + @Test + void onlyOneForwardMoved_WHITE() { + // given + Pawn pawn = new Pawn(Color.WHITE); + Position previous = new Position(Row.TWO, Column.D); + Position current = new Position(Row.THREE, Column.D); + pawn.move(previous, current, Map.of()); + + List expect = List.of( + new Position(Row.FOUR, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations(current, Map.of()); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expect); + } } From 12b2a949124ab38446da5b96e47e93caaa5d2b9b Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 19:26:46 +0900 Subject: [PATCH 47/48] =?UTF-8?q?test(Pawn):=20=ED=8F=B0=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EC=B2=98=EC=9D=8C=20=EC=9B=80=EC=A7=81?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C=20=EB=91=90=20=EC=B9=B8=20=EC=95=9E?= =?UTF-8?q?=EC=97=90=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index f92337083d9..8e407b2e2c2 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -196,4 +196,46 @@ void onlyOneForwardMoved_WHITE() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expect); } + + @DisplayName("처음 움직일 때 두 칸 앞에 적 기물이 존재하는 경우 두 칸 이동이 불가능하다.") + @Test + void firstMoveExistEnemy() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.FOUR, Column.D), new Knight(Color.BLACK) + ); + List expected = List.of( + new Position(Row.THREE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations(pawnPosition, positions); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } + + @DisplayName("처음 움직일 때 두 칸 앞에 같은 팀 기물이 존재하는 경우 두 칸 이동이 불가능하다.") + @Test + void firstMoveExistSameTeam() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.FOUR, Column.D), new Knight(Color.WHITE) + ); + List expected = List.of( + new Position(Row.THREE, Column.D) + ); + + // when + List destinations = pawn.getAvailableDestinations(pawnPosition, positions); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } } From 3932876fa17699c0ac215296b0d9dd60b6197344 Mon Sep 17 00:00:00 2001 From: minSsan Date: Sat, 22 Mar 2025 19:35:49 +0900 Subject: [PATCH 48/48] =?UTF-8?q?=F0=9F=94=B4red:=20=EB=91=90=20=EC=B9=B8?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=EC=8B=9C=20=EB=B0=94=EB=A1=9C=20=EC=95=9E?= =?UTF-8?q?=EC=97=90=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20=EC=A1=B4=EC=9E=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8B=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/chess/piece/PawnTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/chess/piece/PawnTest.java b/src/test/java/chess/piece/PawnTest.java index 8e407b2e2c2..e2d2c1a68fe 100644 --- a/src/test/java/chess/piece/PawnTest.java +++ b/src/test/java/chess/piece/PawnTest.java @@ -238,4 +238,23 @@ void firstMoveExistSameTeam() { // then assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); } + + @DisplayName("이동방향 바로 앞에 상대 기물이 존재하는 경우 움직일 수 없다.") + @Test + void firstMoveExistEnemyFront() { + // given + Position pawnPosition = new Position(Row.TWO, Column.D); + Pawn pawn = new Pawn(Color.WHITE); + Map positions = Map.of( + pawnPosition, pawn, + new Position(Row.THREE, Column.D), new Knight(Color.BLACK) + ); + List expected = List.of(); + + // when + List destinations = pawn.getAvailableDestinations(pawnPosition, positions); + + // then + assertThat(destinations).containsExactlyInAnyOrderElementsOf(expected); + } }