From 8134675391974990817a9ea12c85296e835dfa0b Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 13:33:40 +0900 Subject: [PATCH 01/68] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9775dda0ae..7cac652abb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,30 @@ # java-janggi -장기 미션 저장소 +# 기능 구현 목록 + +## 장기판 생성 +- [ ] 9 * 10 구조의 장기판을 생성한다. + +## 기물 생성 +- [ ] 기물을 생성한다. + - 궁, 사, 마, 상, 차, 포, 졸(병) + - None(장기판에 기물이 올라가있지 않은 상태)의 기물 + +## 보드 초기화 +- [ ] 게임 시작시 장기판과 기물을 올바른 위치에 초기화한다. + - [ ] 오른상(마상마상) 구조로 초기화한다. + - [ ] 기물이 올바른 위치에 놓여있는지 확인한다. + +## 출력 +- [ ] 초기화된 장기판을 출력한다. + +``` + 0 1 2 3 4 5 6 7 8 + 0 [차][마][상][사] . [사][상][마][차] + 1 . . . . [장] . . . . + 2 . [포] . . . . . [포] . + 3 [졸] . [졸] . [졸] . [졸] . [졸] + ... + 9 한나라 기물들 +``` + From 9e207ccb3b337b22b6ed138d05b473f53fe90921 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 15:34:36 +0900 Subject: [PATCH 02/68] =?UTF-8?q?feat:=20=EC=9C=84=EC=B9=98=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Position.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/domain/Position.java diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java new file mode 100644 index 0000000000..daaf533a1b --- /dev/null +++ b/src/main/java/domain/Position.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.Objects; + +public class Position { + + private final int rows; // 행 10 + private final int columns; //열 9 + + public Position(int rows, int columns) { + this.rows = rows; + this.columns = columns; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Position position = (Position) o; + return rows == position.rows && columns == position.columns; + } + + @Override + public int hashCode() { + return Objects.hash(rows, columns); + } +} From 965e09c9836cdd3fa514abe04b721531e79341fd Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 15:59:57 +0900 Subject: [PATCH 03/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Piece.java | 13 +++++++++++++ src/main/java/domain/Team.java | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/domain/Piece.java create mode 100644 src/main/java/domain/Team.java diff --git a/src/main/java/domain/Piece.java b/src/main/java/domain/Piece.java new file mode 100644 index 0000000000..fea32d50f8 --- /dev/null +++ b/src/main/java/domain/Piece.java @@ -0,0 +1,13 @@ +package domain; + +public abstract class Piece { + private final Team team; + + public Piece(Team team) { + this.team = team; + } + + public void canMove(Position targetPosition) { + // moveStrategy.movable(); + } +} diff --git a/src/main/java/domain/Team.java b/src/main/java/domain/Team.java new file mode 100644 index 0000000000..026763e525 --- /dev/null +++ b/src/main/java/domain/Team.java @@ -0,0 +1,6 @@ +package domain; + +public enum Team { + CHO, + HAN +} From 77bd1c9850e9ce8d3d72d7e50a0de9c387d6d5a4 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 16:34:26 +0900 Subject: [PATCH 04/68] =?UTF-8?q?feat:=209*10=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EC=9D=98=20=EC=9E=A5=EA=B8=B0=ED=8C=90=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/domain/Blank.java | 9 +++++++++ src/main/java/domain/JanggiBoard.java | 25 +++++++++++++++++++++++++ src/main/java/domain/Team.java | 3 ++- 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/main/java/domain/Blank.java create mode 100644 src/main/java/domain/JanggiBoard.java diff --git a/README.md b/README.md index 7cac652abb..07ff2c1636 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # 기능 구현 목록 ## 장기판 생성 -- [ ] 9 * 10 구조의 장기판을 생성한다. +- [x] 9 * 10 구조의 장기판을 생성한다. ## 기물 생성 - [ ] 기물을 생성한다. diff --git a/src/main/java/domain/Blank.java b/src/main/java/domain/Blank.java new file mode 100644 index 0000000000..6f774c0d6c --- /dev/null +++ b/src/main/java/domain/Blank.java @@ -0,0 +1,9 @@ +package domain; + +public class Blank extends Piece{ + + public Blank() { + super(Team.NONE); + } + +} diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java new file mode 100644 index 0000000000..0e66f0dd45 --- /dev/null +++ b/src/main/java/domain/JanggiBoard.java @@ -0,0 +1,25 @@ +package domain; + + +import java.util.Map; + +public class JanggiBoard { + private static final int BOARD_ROWS = 10; + private static final int BOARD_COLUMNS = 9; + + private final Map janggiBoard; + + public JanggiBoard(Map janggiBoard) { + this.janggiBoard = janggiBoard; + initializeBoard(); + } + + private void initializeBoard() { + for (int row = 0; row < BOARD_ROWS; row++) { + for (int column = 0; column < BOARD_COLUMNS; column++) { + janggiBoard.put(new Position(row, column), new Blank()); + } + } + } +} + diff --git a/src/main/java/domain/Team.java b/src/main/java/domain/Team.java index 026763e525..d6e9a33e53 100644 --- a/src/main/java/domain/Team.java +++ b/src/main/java/domain/Team.java @@ -2,5 +2,6 @@ public enum Team { CHO, - HAN + HAN, + NONE } From 12c1e87227a953ed7a9820a1a2784a1727a1f78c Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 16:35:23 +0900 Subject: [PATCH 05/68] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 07ff2c1636..5aac1dfc05 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ ## 기물 생성 - [ ] 기물을 생성한다. - - 궁, 사, 마, 상, 차, 포, 졸(병) - - None(장기판에 기물이 올라가있지 않은 상태)의 기물 + - [ ] 궁, 사, 마, 상, 차, 포, 졸(병) + - [x] None(장기판에 기물이 올라가있지 않은 상태)의 기물 ## 보드 초기화 - [ ] 게임 시작시 장기판과 기물을 올바른 위치에 초기화한다. From d2d50c1f42a082edf97fff6ce85aabebc9dd1fb2 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 16:48:33 +0900 Subject: [PATCH 06/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=B2=B4(=EA=B6=81,=EC=82=AC,=EB=A7=88,=EC=83=81,?= =?UTF-8?q?=EC=B0=A8,=ED=8F=AC,=EC=A1=B8(=EB=B3=91))=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/domain/Blank.java | 9 --------- src/main/java/domain/JanggiBoard.java | 3 +++ src/main/java/domain/piece/Blank.java | 11 +++++++++++ src/main/java/domain/piece/Cannon.java | 9 +++++++++ src/main/java/domain/piece/Car.java | 9 +++++++++ src/main/java/domain/piece/Elephant.java | 9 +++++++++ src/main/java/domain/piece/Guard.java | 9 +++++++++ src/main/java/domain/piece/Horse.java | 9 +++++++++ src/main/java/domain/piece/King.java | 10 ++++++++++ src/main/java/domain/piece/Pawn.java | 9 +++++++++ src/main/java/domain/{ => piece}/Piece.java | 5 ++++- 12 files changed, 84 insertions(+), 12 deletions(-) delete mode 100644 src/main/java/domain/Blank.java create mode 100644 src/main/java/domain/piece/Blank.java create mode 100644 src/main/java/domain/piece/Cannon.java create mode 100644 src/main/java/domain/piece/Car.java create mode 100644 src/main/java/domain/piece/Elephant.java create mode 100644 src/main/java/domain/piece/Guard.java create mode 100644 src/main/java/domain/piece/Horse.java create mode 100644 src/main/java/domain/piece/King.java create mode 100644 src/main/java/domain/piece/Pawn.java rename src/main/java/domain/{ => piece}/Piece.java (76%) diff --git a/README.md b/README.md index 5aac1dfc05..f7fdd11bf2 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ - [x] 9 * 10 구조의 장기판을 생성한다. ## 기물 생성 -- [ ] 기물을 생성한다. - - [ ] 궁, 사, 마, 상, 차, 포, 졸(병) +- [x] 기물을 생성한다. + - [x] 궁, 사, 마, 상, 차, 포, 졸(병) - [x] None(장기판에 기물이 올라가있지 않은 상태)의 기물 ## 보드 초기화 diff --git a/src/main/java/domain/Blank.java b/src/main/java/domain/Blank.java deleted file mode 100644 index 6f774c0d6c..0000000000 --- a/src/main/java/domain/Blank.java +++ /dev/null @@ -1,9 +0,0 @@ -package domain; - -public class Blank extends Piece{ - - public Blank() { - super(Team.NONE); - } - -} diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 0e66f0dd45..e1a8d5867e 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -1,6 +1,9 @@ package domain; +import domain.piece.Blank; +import domain.piece.Piece; + import java.util.Map; public class JanggiBoard { diff --git a/src/main/java/domain/piece/Blank.java b/src/main/java/domain/piece/Blank.java new file mode 100644 index 0000000000..96d74ac16f --- /dev/null +++ b/src/main/java/domain/piece/Blank.java @@ -0,0 +1,11 @@ +package domain.piece; + +import domain.Team; + +public class Blank extends Piece { + + public Blank() { + super(Team.NONE); + } + +} diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java new file mode 100644 index 0000000000..b0cf734c49 --- /dev/null +++ b/src/main/java/domain/piece/Cannon.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Cannon extends Piece { + public Cannon(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java new file mode 100644 index 0000000000..ee66a70ed0 --- /dev/null +++ b/src/main/java/domain/piece/Car.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Car extends Piece { + public Car(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java new file mode 100644 index 0000000000..1e629505fe --- /dev/null +++ b/src/main/java/domain/piece/Elephant.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Elephant extends Piece { + public Elephant(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java new file mode 100644 index 0000000000..5d3aea84b2 --- /dev/null +++ b/src/main/java/domain/piece/Guard.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Guard extends Piece { + public Guard(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java new file mode 100644 index 0000000000..b17a39f750 --- /dev/null +++ b/src/main/java/domain/piece/Horse.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Horse extends Piece { + public Horse(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/King.java b/src/main/java/domain/piece/King.java new file mode 100644 index 0000000000..d3b1469f99 --- /dev/null +++ b/src/main/java/domain/piece/King.java @@ -0,0 +1,10 @@ +package domain.piece; + +import domain.Team; + +public class King extends Piece { + + public King(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/piece/Pawn.java b/src/main/java/domain/piece/Pawn.java new file mode 100644 index 0000000000..a51fd8bba1 --- /dev/null +++ b/src/main/java/domain/piece/Pawn.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.Team; + +public class Pawn extends Piece{ + public Pawn(Team team) { + super(team); + } +} diff --git a/src/main/java/domain/Piece.java b/src/main/java/domain/piece/Piece.java similarity index 76% rename from src/main/java/domain/Piece.java rename to src/main/java/domain/piece/Piece.java index fea32d50f8..688eed3165 100644 --- a/src/main/java/domain/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -1,4 +1,7 @@ -package domain; +package domain.piece; + +import domain.Position; +import domain.Team; public abstract class Piece { private final Team team; From 712d8b1762c9f10fcdab33f13d6333efa46de725 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Wed, 25 Mar 2026 20:37:01 +0900 Subject: [PATCH 07/68] =?UTF-8?q?feat:=20=EC=9E=A5=EA=B8=B0=ED=8C=90?= =?UTF-8?q?=EA=B3=BC=20=EA=B8=B0=EB=AC=BC=20=EC=9C=84=EC=B9=98=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++--- src/main/java/domain/JanggiBoard.java | 35 ++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f7fdd11bf2..987ed6909a 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ - [x] None(장기판에 기물이 올라가있지 않은 상태)의 기물 ## 보드 초기화 -- [ ] 게임 시작시 장기판과 기물을 올바른 위치에 초기화한다. - - [ ] 오른상(마상마상) 구조로 초기화한다. +- [x] 게임 시작시 장기판과 기물을 올바른 위치에 초기화한다. + - [x] 오른상(마상마상) 구조로 초기화한다. - [ ] 기물이 올바른 위치에 놓여있는지 확인한다. ## 출력 - [ ] 초기화된 장기판을 출력한다. ``` - 0 1 2 3 4 5 6 7 8 + 0 1 2 3 4 5 6 7 8 0 [차][마][상][사] . [사][상][마][차] 1 . . . . [장] . . . . 2 . [포] . . . . . [포] . diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index e1a8d5867e..20201f7965 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -1,8 +1,6 @@ package domain; - -import domain.piece.Blank; -import domain.piece.Piece; +import domain.piece.*; import java.util.Map; @@ -15,6 +13,7 @@ public class JanggiBoard { public JanggiBoard(Map janggiBoard) { this.janggiBoard = janggiBoard; initializeBoard(); + setupInitialPieces(); } private void initializeBoard() { @@ -24,5 +23,35 @@ private void initializeBoard() { } } } + + private void setupInitialPieces() { + setupTeamPieces(Team.HAN, 0, 1,2, 3); // 한나라 기물 배치 (0~3행 위주) + setupTeamPieces(Team.CHO, 9, 8,7,6); // 초나라 기물 배치 (9~6행 위주) + } + + private void setupTeamPieces(Team team, int baseRow, int kingRow, int cannonRow, int pawnRow) { + // 예시: 차(車) 배치 + janggiBoard.put(new Position(baseRow, 0), new Car(team)); + janggiBoard.put(new Position(baseRow, 8), new Car(team)); + // 마 + janggiBoard.put(new Position(baseRow, 1), new Horse(team)); + janggiBoard.put(new Position(baseRow, 6), new Horse(team)); + // 상 + janggiBoard.put(new Position(baseRow, 2), new Elephant(team)); + janggiBoard.put(new Position(baseRow, 7), new Elephant(team)); + // 사 + janggiBoard.put(new Position(baseRow, 3), new Guard(team)); + janggiBoard.put(new Position(baseRow, 5), new Guard(team)); + // 궁 + janggiBoard.put(new Position(kingRow, 4), new King(team)); + // 예시: 포(包) 배치 + janggiBoard.put(new Position(cannonRow, 1), new Cannon(team)); + janggiBoard.put(new Position(cannonRow, 7), new Cannon(team)); + + // 예시: 졸/병 배치 + for (int col = 0; col < 9; col += 2) { + janggiBoard.put(new Position(pawnRow, col), new Pawn(team)); + } + } } From f7496aca4beaa279d30c90276922ba28a4f01a44 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Thu, 26 Mar 2026 16:59:44 +0900 Subject: [PATCH 08/68] =?UTF-8?q?test:=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=98=AC=EB=B0=94=EB=A5=B8=20=EC=9C=84=EC=B9=98=EC=97=90=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EB=90=98=EC=97=88=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/domain/JanggiBoard.java | 5 + src/main/java/domain/piece/Piece.java | 4 + .../java/janggiBoard/BoardInitialTest.java | 177 ++++++++++++++++++ 4 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/test/java/janggiBoard/BoardInitialTest.java diff --git a/README.md b/README.md index 987ed6909a..bced4d197f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ## 보드 초기화 - [x] 게임 시작시 장기판과 기물을 올바른 위치에 초기화한다. - [x] 오른상(마상마상) 구조로 초기화한다. - - [ ] 기물이 올바른 위치에 놓여있는지 확인한다. + - [x] 기물이 올바른 위치에 놓여있는지 확인한다. ## 출력 - [ ] 초기화된 장기판을 출력한다. diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 20201f7965..47f64b7457 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -2,6 +2,7 @@ import domain.piece.*; +import java.util.Collections; import java.util.Map; public class JanggiBoard { @@ -16,6 +17,10 @@ public JanggiBoard(Map janggiBoard) { setupInitialPieces(); } + public Map getJanggiBoard() { + return Collections.unmodifiableMap(janggiBoard); + } + private void initializeBoard() { for (int row = 0; row < BOARD_ROWS; row++) { for (int column = 0; column < BOARD_COLUMNS; column++) { diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 688eed3165..7ebe43db94 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -10,6 +10,10 @@ public Piece(Team team) { this.team = team; } + public Team getTeam() { + return team; + } + public void canMove(Position targetPosition) { // moveStrategy.movable(); } diff --git a/src/test/java/janggiBoard/BoardInitialTest.java b/src/test/java/janggiBoard/BoardInitialTest.java new file mode 100644 index 0000000000..df7f1dedf8 --- /dev/null +++ b/src/test/java/janggiBoard/BoardInitialTest.java @@ -0,0 +1,177 @@ +package janggiBoard; + +import domain.JanggiBoard; +import domain.Position; +import domain.Team; +import domain.piece.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class BoardInitialTest { + + private JanggiBoard janggiBoard; + + @BeforeEach + void setUp() { + janggiBoard = new JanggiBoard(new LinkedHashMap<>()); + } + + @Test + void 보드_초기화시_90칸이_제대로_생성되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.size()).isEqualTo(90); + } + + @Test + void 한나라_차가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(0, 0))).isInstanceOf(Car.class); + assertThat(board.get(new Position(0, 8))).isInstanceOf(Car.class); + + assertThat(board.get(new Position(0, 0)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(0, 8)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_차가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(9, 0))).isInstanceOf(Car.class); + assertThat(board.get(new Position(9, 8))).isInstanceOf(Car.class); + + assertThat(board.get(new Position(9, 0)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(9, 8)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 한나라_마가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(0, 1))).isInstanceOf(Horse.class); + assertThat(board.get(new Position(0, 6))).isInstanceOf(Horse.class); + + assertThat(board.get(new Position(0, 1)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(0, 6)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_마가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(9, 1))).isInstanceOf(Horse.class); + assertThat(board.get(new Position(9, 6))).isInstanceOf(Horse.class); + + assertThat(board.get(new Position(9, 1)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(9, 6)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 한나라_상이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(0, 2))).isInstanceOf(Elephant.class); + assertThat(board.get(new Position(0, 7))).isInstanceOf(Elephant.class); + + assertThat(board.get(new Position(0, 2)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(0, 7)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_상이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(9, 2))).isInstanceOf(Elephant.class); + assertThat(board.get(new Position(9, 7))).isInstanceOf(Elephant.class); + + assertThat(board.get(new Position(9, 2)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(9, 7)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 한나라_사가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(0, 3))).isInstanceOf(Guard.class); + assertThat(board.get(new Position(0, 5))).isInstanceOf(Guard.class); + + assertThat(board.get(new Position(0, 3)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(0, 5)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_사가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(9, 3))).isInstanceOf(Guard.class); + assertThat(board.get(new Position(9, 5))).isInstanceOf(Guard.class); + + assertThat(board.get(new Position(9, 3)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(9, 5)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 힌나라_궁이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(1, 4))).isInstanceOf(King.class); + assertThat(board.get(new Position(1, 4)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_궁이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(8, 4))).isInstanceOf(King.class); + assertThat(board.get(new Position(8, 4)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 한나라_포가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(2, 1))).isInstanceOf(Cannon.class); + assertThat(board.get(new Position(2, 7))).isInstanceOf(Cannon.class); + + assertThat(board.get(new Position(2, 1)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(2, 7)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_포가_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(7, 1))).isInstanceOf(Cannon.class); + assertThat(board.get(new Position(7, 7))).isInstanceOf(Cannon.class); + + assertThat(board.get(new Position(7, 1)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(7, 7)).getTeam()).isEqualTo(Team.CHO); + } + + @Test + void 한나라_졸이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(3, 0))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(3, 2))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(3, 4))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(3, 6))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(3, 8))).isInstanceOf(Pawn.class); + + assertThat(board.get(new Position(3, 0)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(3, 2)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(3, 4)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(3, 6)).getTeam()).isEqualTo(Team.HAN); + assertThat(board.get(new Position(3, 8)).getTeam()).isEqualTo(Team.HAN); + } + + @Test + void 초나라_졸이_제대로된_위치에_초기화_되었는지_확인한다() { + Map board = janggiBoard.getJanggiBoard(); + assertThat(board.get(new Position(6, 0))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(6, 2))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(6, 4))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(6, 6))).isInstanceOf(Pawn.class); + assertThat(board.get(new Position(6, 8))).isInstanceOf(Pawn.class); + + assertThat(board.get(new Position(6, 0)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(6, 2)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(6, 4)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(6, 6)).getTeam()).isEqualTo(Team.CHO); + assertThat(board.get(new Position(6, 8)).getTeam()).isEqualTo(Team.CHO); + } + + +} From 7e37375ce015731b54401f903c72f08a6c283041 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Thu, 26 Mar 2026 17:22:24 +0900 Subject: [PATCH 09/68] =?UTF-8?q?test:=20=EC=A1=B8=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/BoardInitialTest.java | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/src/test/java/janggiBoard/BoardInitialTest.java b/src/test/java/janggiBoard/BoardInitialTest.java index df7f1dedf8..4609a957c0 100644 --- a/src/test/java/janggiBoard/BoardInitialTest.java +++ b/src/test/java/janggiBoard/BoardInitialTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.*; @@ -108,7 +109,7 @@ void setUp() { } @Test - void 힌나라_궁이_제대로된_위치에_초기화_되었는지_확인한다() { + void 한나라_궁이_제대로된_위치에_초기화_되었는지_확인한다() { Map board = janggiBoard.getJanggiBoard(); assertThat(board.get(new Position(1, 4))).isInstanceOf(King.class); assertThat(board.get(new Position(1, 4)).getTeam()).isEqualTo(Team.HAN); @@ -142,36 +143,30 @@ void setUp() { } @Test - void 한나라_졸이_제대로된_위치에_초기화_되었는지_확인한다() { + void 한나라_졸_위치들을_한번에_검증한다() { Map board = janggiBoard.getJanggiBoard(); - assertThat(board.get(new Position(3, 0))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(3, 2))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(3, 4))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(3, 6))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(3, 8))).isInstanceOf(Pawn.class); - - assertThat(board.get(new Position(3, 0)).getTeam()).isEqualTo(Team.HAN); - assertThat(board.get(new Position(3, 2)).getTeam()).isEqualTo(Team.HAN); - assertThat(board.get(new Position(3, 4)).getTeam()).isEqualTo(Team.HAN); - assertThat(board.get(new Position(3, 6)).getTeam()).isEqualTo(Team.HAN); - assertThat(board.get(new Position(3, 8)).getTeam()).isEqualTo(Team.HAN); + assertThat(List.of(new Position(3, 0), + new Position(3, 2), + new Position(3, 4), + new Position(3,6), + new Position(3,8))) + .allSatisfy(pos -> { + assertThat(board.get(pos)).isInstanceOf(Pawn.class); + assertThat(board.get(pos).getTeam()).isEqualTo(Team.HAN); + }); } @Test - void 초나라_졸이_제대로된_위치에_초기화_되었는지_확인한다() { + void 초나라_졸_위치들을_한번에_검증한다() { Map board = janggiBoard.getJanggiBoard(); - assertThat(board.get(new Position(6, 0))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(6, 2))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(6, 4))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(6, 6))).isInstanceOf(Pawn.class); - assertThat(board.get(new Position(6, 8))).isInstanceOf(Pawn.class); - - assertThat(board.get(new Position(6, 0)).getTeam()).isEqualTo(Team.CHO); - assertThat(board.get(new Position(6, 2)).getTeam()).isEqualTo(Team.CHO); - assertThat(board.get(new Position(6, 4)).getTeam()).isEqualTo(Team.CHO); - assertThat(board.get(new Position(6, 6)).getTeam()).isEqualTo(Team.CHO); - assertThat(board.get(new Position(6, 8)).getTeam()).isEqualTo(Team.CHO); + assertThat(List.of(new Position(6, 0), + new Position(6, 2), + new Position(6, 4), + new Position(6,6), + new Position(6,8))) + .allSatisfy(pos -> { + assertThat(board.get(pos)).isInstanceOf(Pawn.class); + assertThat(board.get(pos).getTeam()).isEqualTo(Team.CHO); + }); } - - } From a0c84319c5818050fd01aedf949e0ce2d5d9aaa5 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Thu, 26 Mar 2026 19:39:53 +0900 Subject: [PATCH 10/68] =?UTF-8?q?docs:=20=EA=B8=B0=EB=AC=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=A0=84=EB=9E=B5=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index bced4d197f..207b6f2ea6 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,19 @@ - [x] 오른상(마상마상) 구조로 초기화한다. - [x] 기물이 올바른 위치에 놓여있는지 확인한다. +## 기물 이동 전략 +- [ ] 기물 이동 전략을 생성한다. + - [ ] 궁,사 : 방향에 관계 없이 한 칸씩 이동할 수 있다. + - [ ] 마 : 방향에 관계 없이 직진 후 대각선으로 한 칸 이동할 수 있다. + - [ ] 이동하는 경로에 기물이 존재해서는 안된다. + - [ ] 상 : 방향에 관계 없이 직진 후 대각선으로 두 칸 이동할 수 있다. + - [ ] 이동하는 경로에 기물이 존재해서는 안된다. + - [ ] 차 : 방향에 관계 없이 원하는만큼 이동할 수 있다. + - [ ] 졸 : 좌,우,앞으로 한 칸씩 이동할 수 있다. + - [ ] 뒤로는 갈 수 없다. + - [ ] 포 : 앞에 기물이 한 개 존재할 때 원하는 곳으로 뛰어넘을 수 있다. + - [ ] 포끼리는 뛰어넘을 수 없다. + ## 출력 - [ ] 초기화된 장기판을 출력한다. From d93b2bab0aebce53c8ab8bd0047e05d14f392879 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Thu, 26 Mar 2026 20:19:09 +0900 Subject: [PATCH 11/68] =?UTF-8?q?docs:=20=EC=A2=8C=ED=91=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=9D=B4=EB=8F=99=20=EC=A0=84=EB=9E=B5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 207b6f2ea6..14bc6fcf24 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,17 @@ - [x] 오른상(마상마상) 구조로 초기화한다. - [x] 기물이 올바른 위치에 놓여있는지 확인한다. +## 좌표 기본 이동 전략 +- [ ] 기본적으로 좌표는 앞,뒤,좌,우,우상,좌상,우하,좌하로 움직일 수 있다. + - [ ] 앞으로 이동하면 (-1,0)만큼 이동한다. + - [ ] 뒤로 이동하면 (1,0)만큼 이동한다. + - [ ] 좌로 이동하면 (0,-1)만큼 이동한다. + - [ ] 우로 이동하면 (0,1)만큼 이동한다. + - [ ] 우상으로 이동하면 (-1,1)만큼 이동한다. + - [ ] 좌상으로 이동하면 (-1,-1)만큼 이동한다. + - [ ] 우하로 이동하면 (1,1)만큼 이동한다. + - [ ] 좌하로 이동하면 (1,-1)만큼 이동한다. + ## 기물 이동 전략 - [ ] 기물 이동 전략을 생성한다. - [ ] 궁,사 : 방향에 관계 없이 한 칸씩 이동할 수 있다. From 493cf17a09a930f630177b23897fd83349a58fac Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 14:06:58 +0900 Subject: [PATCH 12/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=20=EA=B8=B0=EB=B3=B8=20=EC=9D=B4=EB=8F=99=20=EC=A0=84?= =?UTF-8?q?=EB=9E=B5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++------- src/main/java/domain/strategy/Direction.java | 28 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 src/main/java/domain/strategy/Direction.java diff --git a/README.md b/README.md index 14bc6fcf24..1fc941e104 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,15 @@ - [x] 기물이 올바른 위치에 놓여있는지 확인한다. ## 좌표 기본 이동 전략 -- [ ] 기본적으로 좌표는 앞,뒤,좌,우,우상,좌상,우하,좌하로 움직일 수 있다. - - [ ] 앞으로 이동하면 (-1,0)만큼 이동한다. - - [ ] 뒤로 이동하면 (1,0)만큼 이동한다. - - [ ] 좌로 이동하면 (0,-1)만큼 이동한다. - - [ ] 우로 이동하면 (0,1)만큼 이동한다. - - [ ] 우상으로 이동하면 (-1,1)만큼 이동한다. - - [ ] 좌상으로 이동하면 (-1,-1)만큼 이동한다. - - [ ] 우하로 이동하면 (1,1)만큼 이동한다. - - [ ] 좌하로 이동하면 (1,-1)만큼 이동한다. +- [x] 기본적으로 좌표는 앞,뒤,좌,우,우상,좌상,우하,좌하로 움직일 수 있다. + - [x] 앞으로 이동하면 (-1,0)만큼 이동한다. + - [x] 뒤로 이동하면 (1,0)만큼 이동한다. + - [x] 좌로 이동하면 (0,-1)만큼 이동한다. + - [x] 우로 이동하면 (0,1)만큼 이동한다. + - [x] 우상으로 이동하면 (-1,1)만큼 이동한다. + - [x] 좌상으로 이동하면 (-1,-1)만큼 이동한다. + - [x] 우하로 이동하면 (1,1)만큼 이동한다. + - [x] 좌하로 이동하면 (1,-1)만큼 이동한다. ## 기물 이동 전략 - [ ] 기물 이동 전략을 생성한다. @@ -49,6 +49,6 @@ 2 . [포] . . . . . [포] . 3 [졸] . [졸] . [졸] . [졸] . [졸] ... - 9 한나라 기물들 + 9 초나라 기물들 ``` diff --git a/src/main/java/domain/strategy/Direction.java b/src/main/java/domain/strategy/Direction.java new file mode 100644 index 0000000000..d69cef20e1 --- /dev/null +++ b/src/main/java/domain/strategy/Direction.java @@ -0,0 +1,28 @@ +package domain.strategy; + +public enum Direction { + NORTH(-1, 0), + SOUTH(1, 0), + WEST(0, -1), + EAST(0, 1), + NORTH_WEST(-1, -1), + NORTH_EAST(-1, 1), + SOUTH_WEST(1, -1), + SOUTH_EAST(1, 1); + + private final int rowOffset; + private final int colOffset; + + Direction(int rowOffset, int colOffset) { + this.rowOffset = rowOffset; + this.colOffset = colOffset; + } + + public int getRowOffset() { + return rowOffset; + } + + public int getColOffset() { + return colOffset; + } +} From 48991a68edfe828edc19d3a8ac47da7a9045b1f8 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 15:37:46 +0900 Subject: [PATCH 13/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=A0=84=EB=9E=B5=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/domain/Position.java | 8 +++++++ .../java/domain/strategy/CarStrategy.java | 13 ++++++++++++ .../domain/strategy/ElephantStrategy.java | 13 ++++++++++++ .../java/domain/strategy/HorseStrategy.java | 14 +++++++++++++ .../java/domain/strategy/MoveStrategy.java | 9 ++++++++ .../java/domain/strategy/PalaceStrategy.java | 13 ++++++++++++ .../java/domain/strategy/PawnStrategy.java | 21 +++++++++++++++++++ .../java/janggiBoard/MoveStrategyTest.java | 8 +++++++ 8 files changed, 99 insertions(+) create mode 100644 src/main/java/domain/strategy/CarStrategy.java create mode 100644 src/main/java/domain/strategy/ElephantStrategy.java create mode 100644 src/main/java/domain/strategy/HorseStrategy.java create mode 100644 src/main/java/domain/strategy/MoveStrategy.java create mode 100644 src/main/java/domain/strategy/PalaceStrategy.java create mode 100644 src/main/java/domain/strategy/PawnStrategy.java create mode 100644 src/test/java/janggiBoard/MoveStrategyTest.java diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index daaf533a1b..869ac8c148 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -12,6 +12,14 @@ public Position(int rows, int columns) { this.columns = columns; } + public int getRows() { + return rows; + } + + public int getColumns() { + return columns; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java new file mode 100644 index 0000000000..959e963281 --- /dev/null +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -0,0 +1,13 @@ +package domain.strategy; + +import domain.Team; + +import java.util.ArrayList; +import java.util.List; + +public class CarStrategy implements MoveStrategy { + @Override + public List getDirections(Team team) { + return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + } +} diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java new file mode 100644 index 0000000000..2adb5938b5 --- /dev/null +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -0,0 +1,13 @@ +package domain.strategy; + +import domain.Team; + +import java.util.ArrayList; +import java.util.List; + +public class ElephantStrategy implements MoveStrategy{ + @Override + public List getDirections(Team team) { + return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH, Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST)); + } +} diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java new file mode 100644 index 0000000000..70be2f42eb --- /dev/null +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -0,0 +1,14 @@ +package domain.strategy; + +import domain.Position; +import domain.Team; + +import java.util.ArrayList; +import java.util.List; + +public class HorseStrategy implements MoveStrategy{ + @Override + public List getDirections(Team team) { + return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + } +} diff --git a/src/main/java/domain/strategy/MoveStrategy.java b/src/main/java/domain/strategy/MoveStrategy.java new file mode 100644 index 0000000000..a1e44e9aee --- /dev/null +++ b/src/main/java/domain/strategy/MoveStrategy.java @@ -0,0 +1,9 @@ +package domain.strategy; + +import domain.Team; + +import java.util.List; + +public interface MoveStrategy { + List getDirections(Team team); +} diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java new file mode 100644 index 0000000000..3b01b12ae8 --- /dev/null +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -0,0 +1,13 @@ +package domain.strategy; + +import domain.Team; + +import java.util.ArrayList; +import java.util.List; + +public class PalaceStrategy implements MoveStrategy { + @Override + public List getDirections(Team team) { + return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + } +} diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java new file mode 100644 index 0000000000..519af91a03 --- /dev/null +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -0,0 +1,21 @@ +package domain.strategy; + +import domain.Team; + +import java.util.ArrayList; +import java.util.List; + +public class PawnStrategy implements MoveStrategy { + @Override + public List getDirections(Team team) { + List directions = new ArrayList<>(List.of(Direction.EAST, Direction.WEST)); + + if (team == Team.CHO) { + directions.add(Direction.NORTH); + } + if (team == Team.HAN) { + directions.add(Direction.SOUTH); + } + return directions; + } +} diff --git a/src/test/java/janggiBoard/MoveStrategyTest.java b/src/test/java/janggiBoard/MoveStrategyTest.java new file mode 100644 index 0000000000..924e305fe4 --- /dev/null +++ b/src/test/java/janggiBoard/MoveStrategyTest.java @@ -0,0 +1,8 @@ +package janggiBoard; + + + +public class MoveStrategyTest { + + +} From 0fc750199c685faca772109552173b4f919c3be6 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 16:19:20 +0900 Subject: [PATCH 14/68] =?UTF-8?q?feat:=20=EB=A7=88=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=A0=84=EB=9E=B5=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/domain/JanggiBoard.java | 12 ++++++- src/main/java/domain/piece/PieceProvider.java | 7 ++++ .../java/domain/strategy/CarStrategy.java | 9 ++--- .../domain/strategy/ElephantStrategy.java | 8 ++--- .../java/domain/strategy/HorseStrategy.java | 36 ++++++++++++++++--- .../java/domain/strategy/MoveStrategy.java | 5 +-- .../java/domain/strategy/PalaceStrategy.java | 9 ++--- .../java/domain/strategy/PawnStrategy.java | 17 +++------ .../java/janggiBoard/MoveStrategyTest.java | 8 ----- 9 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 src/main/java/domain/piece/PieceProvider.java delete mode 100644 src/test/java/janggiBoard/MoveStrategyTest.java diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 47f64b7457..a86e315952 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -5,7 +5,7 @@ import java.util.Collections; import java.util.Map; -public class JanggiBoard { +public class JanggiBoard implements PieceProvider { private static final int BOARD_ROWS = 10; private static final int BOARD_COLUMNS = 9; @@ -58,5 +58,15 @@ private void setupTeamPieces(Team team, int baseRow, int kingRow, int cannonRow, janggiBoard.put(new Position(pawnRow, col), new Pawn(team)); } } + + @Override + public boolean isBlank(Position position) { + Piece piece = janggiBoard.get(position); + return piece instanceof Blank; + } + + public Piece getPiece(Position position) { + return janggiBoard.get(position); + } } diff --git a/src/main/java/domain/piece/PieceProvider.java b/src/main/java/domain/piece/PieceProvider.java new file mode 100644 index 0000000000..3217fc5476 --- /dev/null +++ b/src/main/java/domain/piece/PieceProvider.java @@ -0,0 +1,7 @@ +package domain.piece; + +import domain.Position; + +public interface PieceProvider { + boolean isBlank(Position position); +} diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index 959e963281..673c6085be 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -1,13 +1,14 @@ package domain.strategy; -import domain.Team; +import domain.Position; +import domain.piece.PieceProvider; -import java.util.ArrayList; import java.util.List; public class CarStrategy implements MoveStrategy { + @Override - public List getDirections(Team team) { - return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + public List getMoveCandidates(Position source, PieceProvider board) { + return List.of(); } } diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index 2adb5938b5..b610049ad8 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -1,13 +1,13 @@ package domain.strategy; -import domain.Team; +import domain.Position; +import domain.piece.PieceProvider; -import java.util.ArrayList; import java.util.List; public class ElephantStrategy implements MoveStrategy{ @Override - public List getDirections(Team team) { - return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH, Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST)); + public List getMoveCandidates(Position source, PieceProvider board) { + return List.of(); } } diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 70be2f42eb..68e22c9367 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -1,14 +1,42 @@ package domain.strategy; import domain.Position; -import domain.Team; +import domain.piece.PieceProvider; import java.util.ArrayList; import java.util.List; -public class HorseStrategy implements MoveStrategy{ +public class HorseStrategy implements MoveStrategy { @Override - public List getDirections(Team team) { - return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + public List getMoveCandidates(Position source, PieceProvider board) { + List candidates = new ArrayList<>(); + + Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + + for (Direction straight : straightDirections) { + int myeokRow = source.getRows() + straight.getRowOffset(); + int myeokCol = source.getColumns() + straight.getColOffset(); + Position myeokPosition = new Position(myeokRow, myeokCol); + + if (board.isBlank(myeokPosition)) { + List diagonals = getDiagonalsFor(straight); + for (Direction diag : diagonals) { + int targetRow = myeokPosition.getRows() + diag.getRowOffset(); + int targetCol = myeokPosition.getColumns() + diag.getColOffset(); + Position targetPosition = new Position(targetRow, targetCol); + + candidates.add(targetPosition); + } + } + } + return candidates; + } + + private List getDiagonalsFor(Direction straight) { + if (straight == Direction.NORTH) return List.of(Direction.NORTH_WEST, Direction.NORTH_EAST); + if (straight == Direction.SOUTH) return List.of(Direction.SOUTH_WEST, Direction.SOUTH_EAST); + if (straight == Direction.WEST) return List.of(Direction.NORTH_WEST, Direction.SOUTH_WEST); + if (straight == Direction.EAST) return List.of(Direction.NORTH_EAST, Direction.SOUTH_EAST); + return List.of(); } } diff --git a/src/main/java/domain/strategy/MoveStrategy.java b/src/main/java/domain/strategy/MoveStrategy.java index a1e44e9aee..92341ef8d8 100644 --- a/src/main/java/domain/strategy/MoveStrategy.java +++ b/src/main/java/domain/strategy/MoveStrategy.java @@ -1,9 +1,10 @@ package domain.strategy; -import domain.Team; +import domain.Position; +import domain.piece.PieceProvider; import java.util.List; public interface MoveStrategy { - List getDirections(Team team); + List getMoveCandidates(Position source, PieceProvider board); } diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index 3b01b12ae8..0c6c58143c 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -1,13 +1,14 @@ package domain.strategy; -import domain.Team; +import domain.Position; +import domain.piece.PieceProvider; -import java.util.ArrayList; import java.util.List; public class PalaceStrategy implements MoveStrategy { + @Override - public List getDirections(Team team) { - return new ArrayList<>(List.of(Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH)); + public List getMoveCandidates(Position source, PieceProvider board) { + return List.of(); } } diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index 519af91a03..79312db012 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -1,21 +1,14 @@ package domain.strategy; -import domain.Team; +import domain.Position; +import domain.piece.PieceProvider; -import java.util.ArrayList; import java.util.List; public class PawnStrategy implements MoveStrategy { - @Override - public List getDirections(Team team) { - List directions = new ArrayList<>(List.of(Direction.EAST, Direction.WEST)); - if (team == Team.CHO) { - directions.add(Direction.NORTH); - } - if (team == Team.HAN) { - directions.add(Direction.SOUTH); - } - return directions; + @Override + public List getMoveCandidates(Position source, PieceProvider board) { + return List.of(); } } diff --git a/src/test/java/janggiBoard/MoveStrategyTest.java b/src/test/java/janggiBoard/MoveStrategyTest.java deleted file mode 100644 index 924e305fe4..0000000000 --- a/src/test/java/janggiBoard/MoveStrategyTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package janggiBoard; - - - -public class MoveStrategyTest { - - -} From 4aa9b33083c6f264f191d1f80b2a11aae0d1cb9a Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 16:19:38 +0900 Subject: [PATCH 15/68] =?UTF-8?q?test:=20=EB=A7=88=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/HorseStrategyTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/test/java/janggiBoard/HorseStrategyTest.java diff --git a/src/test/java/janggiBoard/HorseStrategyTest.java b/src/test/java/janggiBoard/HorseStrategyTest.java new file mode 100644 index 0000000000..55174f68c0 --- /dev/null +++ b/src/test/java/janggiBoard/HorseStrategyTest.java @@ -0,0 +1,76 @@ +package janggiBoard; + + +import domain.Position; +import domain.piece.PieceProvider; +import domain.strategy.HorseStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class HorseStrategyTest { + private HorseStrategy horseStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + void setUp() { + horseStrategy = new HorseStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 먀_주변에_장애물_없으면_8가지_후보_모두_반환() { + Position source = new Position(5, 5); + // 모든 위치를 비어있는 상태(Blank)로 설정 + testBoard.setAllBlank(true); + + List candidates = horseStrategy.getMoveCandidates(source, testBoard); + + assertThat(candidates).hasSize(8) + .containsExactlyInAnyOrder( + new Position(3, 4), new Position(3, 6), // 북쪽 기반 + new Position(7, 4), new Position(7, 6), // 남쪽 기반 + new Position(4, 3), new Position(6, 3), // 서쪽 기반 + new Position(4, 7), new Position(6, 7) // 동쪽 기반 + ); + } + + @Test + void 북쪽_멱이_막혀있으면_복서_북동으로_이동할수_없다(){ + Position source = new Position(5, 5); + testBoard.setAllBlank(true); + + // 북쪽 멱 위치를 막힌 상태로 설정 + testBoard.setBlank(new Position(4, 5), false); + + List candidates = horseStrategy.getMoveCandidates(source, testBoard); + + // 전체 8개 중 북쪽 기반 2개가 제외된 6개만 존재해야 함 + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(3, 4), new Position(3, 6)); + } + + // 테스트를 위한 간단한 PieceProvider 구현체 + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos, boolean isBlank) { + boardState.put(pos, isBlank); + } + + void setAllBlank(boolean isBlank) { + this.defaultState = isBlank; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 36115aad886a021294671e2dbb02112cf350d059 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 17:48:04 +0900 Subject: [PATCH 16/68] =?UTF-8?q?test:=20=EB=A7=88=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/strategy/HorseStrategy.java | 6 +- .../java/janggiBoard/HorseStrategyTest.java | 62 ++++++++++++++----- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 68e22c9367..0cbe3c08df 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -8,14 +8,14 @@ public class HorseStrategy implements MoveStrategy { @Override - public List getMoveCandidates(Position source, PieceProvider board) { + public List getMoveCandidates(Position position, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction straight : straightDirections) { - int myeokRow = source.getRows() + straight.getRowOffset(); - int myeokCol = source.getColumns() + straight.getColOffset(); + int myeokRow = position.getRows() + straight.getRowOffset(); + int myeokCol = position.getColumns() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); if (board.isBlank(myeokPosition)) { diff --git a/src/test/java/janggiBoard/HorseStrategyTest.java b/src/test/java/janggiBoard/HorseStrategyTest.java index 55174f68c0..de754a45e3 100644 --- a/src/test/java/janggiBoard/HorseStrategyTest.java +++ b/src/test/java/janggiBoard/HorseStrategyTest.java @@ -24,12 +24,11 @@ void setUp() { } @Test - void 먀_주변에_장애물_없으면_8가지_후보_모두_반환() { - Position source = new Position(5, 5); - // 모든 위치를 비어있는 상태(Blank)로 설정 - testBoard.setAllBlank(true); + void 마_주변에_장애물_없으면_8가지_후보_모두_반환() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); - List candidates = horseStrategy.getMoveCandidates(source, testBoard); + List candidates = horseStrategy.getMoveCandidates(position, testBoard); assertThat(candidates).hasSize(8) .containsExactlyInAnyOrder( @@ -41,31 +40,64 @@ void setUp() { } @Test - void 북쪽_멱이_막혀있으면_복서_북동으로_이동할수_없다(){ + void 북쪽_멱이_막혀있으면_북서_북동으로_이동할수_없다(){ Position source = new Position(5, 5); - testBoard.setAllBlank(true); + testBoard.setAllBlank(); // 북쪽 멱 위치를 막힌 상태로 설정 - testBoard.setBlank(new Position(4, 5), false); - + testBoard.setBlank(new Position(4, 5)); List candidates = horseStrategy.getMoveCandidates(source, testBoard); - // 전체 8개 중 북쪽 기반 2개가 제외된 6개만 존재해야 함 assertThat(candidates).hasSize(6) .doesNotContain(new Position(3, 4), new Position(3, 6)); } - // 테스트를 위한 간단한 PieceProvider 구현체 + @Test + void 남쪽_멱이_막혀있으면_남서_남동으로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(6, 5)); + List candidates = horseStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(7,4), new Position(7,6)); + } + + @Test + void 서쪽_멱이_막혀있으면_북서_남서로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(5, 4)); + List candidates = horseStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(6,5), new Position(4,3)); + } + + @Test + void 동쪽_멱이_막혀있으면_북동_남동으로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(5, 6)); + List candidates = horseStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(4, 7), new Position(6, 7)); + } + private static class TestPieceProvider implements PieceProvider { private final Map boardState = new HashMap<>(); private boolean defaultState = true; - void setBlank(Position pos, boolean isBlank) { - boardState.put(pos, isBlank); + void setBlank(Position pos) { + boardState.put(pos, false); } - void setAllBlank(boolean isBlank) { - this.defaultState = isBlank; + void setAllBlank() { + this.defaultState = true; } @Override From b9728d8d5c68aac76b0c9512761a40f06ca516e3 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 19:13:09 +0900 Subject: [PATCH 17/68] =?UTF-8?q?test:=20=EB=A7=88=EA=B0=80=20=EB=AA=A9?= =?UTF-8?q?=EC=A0=81=EC=A7=80=EC=97=90=20=EA=B0=88=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/Horse.java | 20 ++++++ .../java/domain/strategy/HorseStrategy.java | 6 +- src/test/java/janggiBoard/HorseTest.java | 64 +++++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/test/java/janggiBoard/HorseTest.java diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index b17a39f750..0aa57b6b7e 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -1,9 +1,29 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.HorseStrategy; +import domain.strategy.MoveStrategy; + +import java.util.List; public class Horse extends Piece { + + private final MoveStrategy moveStrategy; + public Horse(Team team) { super(team); + this.moveStrategy = new HorseStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition)) { + return true; + } + } + return false; } } diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 0cbe3c08df..02d7a82383 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -8,14 +8,14 @@ public class HorseStrategy implements MoveStrategy { @Override - public List getMoveCandidates(Position position, PieceProvider board) { + public List getMoveCandidates(Position currentPosition, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction straight : straightDirections) { - int myeokRow = position.getRows() + straight.getRowOffset(); - int myeokCol = position.getColumns() + straight.getColOffset(); + int myeokRow = currentPosition.getRows() + straight.getRowOffset(); + int myeokCol = currentPosition.getColumns() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); if (board.isBlank(myeokPosition)) { diff --git a/src/test/java/janggiBoard/HorseTest.java b/src/test/java/janggiBoard/HorseTest.java new file mode 100644 index 0000000000..2ec9448d15 --- /dev/null +++ b/src/test/java/janggiBoard/HorseTest.java @@ -0,0 +1,64 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.Horse; +import domain.piece.PieceProvider; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class HorseTest { + private TestPieceProvider testBoard; + private Horse horse; + + @BeforeEach + void setUp() { + horse = new Horse(Team.CHO); + testBoard = new TestPieceProvider(); + } + + @Test + void 마가_목적지에_갈_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(3, 4); + + testBoard.setAllBlank(); + boolean isCanMove = horse.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCanMove).isTrue(); + } + + @Test + void 마가_목적지에_갈_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(3, 4); + + testBoard.setAllBlank(); + testBoard.setBlank(new Position(4, 5)); + + boolean isCanMove = horse.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCanMove).isFalse(); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 468a8a80bde46aec8898f513aa0fda2945e30214 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 19:56:52 +0900 Subject: [PATCH 18/68] =?UTF-8?q?test:=20=EA=B6=81,=20=EC=82=AC=EA=B0=80?= =?UTF-8?q?=20=EA=B7=9C=EC=B9=99=EB=8C=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=EC=A7=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/PalaceStrategyTest.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/java/janggiBoard/PalaceStrategyTest.java diff --git a/src/test/java/janggiBoard/PalaceStrategyTest.java b/src/test/java/janggiBoard/PalaceStrategyTest.java new file mode 100644 index 0000000000..99b737b369 --- /dev/null +++ b/src/test/java/janggiBoard/PalaceStrategyTest.java @@ -0,0 +1,59 @@ +package janggiBoard; + +import domain.Position; +import domain.piece.PieceProvider; +import domain.strategy.PalaceStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class PalaceStrategyTest { + + private PalaceStrategy palaceStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + void setUp() { + palaceStrategy = new PalaceStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 궁과_사가_주변에_장애물이_없다면_8가지_후보_모두_반환() { + Position currentPosition = new Position(5, 5); + testBoard.setAllBlank(); + + List candidates = palaceStrategy.getMoveCandidates(currentPosition, testBoard); + + assertThat(candidates).hasSize(8) + .containsExactlyInAnyOrder( + new Position(4, 5), new Position(4, 4), + new Position(4, 6), new Position(5, 4), + new Position(5, 6), new Position(6, 4), + new Position(6, 5), new Position(6, 6) + ); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 9b9a2cda94be5fad18c785e99d9669f05f347926 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 19:57:15 +0900 Subject: [PATCH 19/68] =?UTF-8?q?feat:=20=EA=B6=81,=20=EC=82=AC=EA=B0=80?= =?UTF-8?q?=20=EA=B7=9C=EC=B9=99=EB=8C=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/strategy/PalaceStrategy.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index 0c6c58143c..893d594bd9 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -3,12 +3,25 @@ import domain.Position; import domain.piece.PieceProvider; +import java.util.ArrayList; import java.util.List; public class PalaceStrategy implements MoveStrategy { @Override - public List getMoveCandidates(Position source, PieceProvider board) { - return List.of(); + public List getMoveCandidates(Position currentPosition, PieceProvider board) { + List candidates = new ArrayList<>(); + + Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST, + Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST}; + + for (Direction direction : directions) { + int targetRow = currentPosition.getRows() + direction.getRowOffset(); + int targetColumns = currentPosition.getColumns() + direction.getColOffset(); + + Position targetPosition = new Position(targetRow, targetColumns); + candidates.add(targetPosition); + } + return candidates; } } From 7f5f6b12496c5c2e99e3066720c623aa06e2164d Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 19:57:41 +0900 Subject: [PATCH 20/68] =?UTF-8?q?refactor:=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/strategy/MoveStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/strategy/MoveStrategy.java b/src/main/java/domain/strategy/MoveStrategy.java index 92341ef8d8..af7dd55fd8 100644 --- a/src/main/java/domain/strategy/MoveStrategy.java +++ b/src/main/java/domain/strategy/MoveStrategy.java @@ -6,5 +6,5 @@ import java.util.List; public interface MoveStrategy { - List getMoveCandidates(Position source, PieceProvider board); + List getMoveCandidates(Position currentPosition, PieceProvider board); } From 111c2774922a4ad07250c086c7316d6fc3d115e2 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:21:19 +0900 Subject: [PATCH 21/68] =?UTF-8?q?feat:=20=EA=B6=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=ED=99=95=EC=9D=B8=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/King.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/domain/piece/King.java b/src/main/java/domain/piece/King.java index d3b1469f99..0adfb05f21 100644 --- a/src/main/java/domain/piece/King.java +++ b/src/main/java/domain/piece/King.java @@ -1,10 +1,30 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.MoveStrategy; +import domain.strategy.PalaceStrategy; + +import java.util.List; public class King extends Piece { + private final MoveStrategy moveStrategy; + public King(Team team) { super(team); + this.moveStrategy = new PalaceStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + return true; + } + } + return false; } } From 41ec251fc79485c814ac9d9611009403dee9c908 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:21:50 +0900 Subject: [PATCH 22/68] =?UTF-8?q?test:=20=EA=B6=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/PalaceTest.java | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/test/java/janggiBoard/PalaceTest.java diff --git a/src/test/java/janggiBoard/PalaceTest.java b/src/test/java/janggiBoard/PalaceTest.java new file mode 100644 index 0000000000..852ad2897a --- /dev/null +++ b/src/test/java/janggiBoard/PalaceTest.java @@ -0,0 +1,65 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.King; +import domain.piece.PieceProvider; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class PalaceTest { + + private TestPieceProvider testBoard; + private King king; + + @BeforeEach + void setUp() { + king = new King(Team.CHO); + testBoard = new TestPieceProvider(); + } + + @Test + void 궁이_목적지에_갈_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(4, 5); + + testBoard.setAllBlank(); + boolean isKingMove = king.canMove(currentPosition, targetPosition, testBoard); + assertThat(isKingMove).isTrue(); + + } + + @Test + void 궁이_목적지에_갈_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(4, 5); + + testBoard.setAllBlank(); + testBoard.setBlank(new Position(4, 5)); + boolean isKingMove = king.canMove(currentPosition, targetPosition, testBoard); + assertThat(isKingMove).isFalse(); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 096de15be041ae35dc48c4cc54eb753e0f0a3a4e Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:28:39 +0900 Subject: [PATCH 23/68] =?UTF-8?q?test:=20=EC=82=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/PalaceTest.java | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/janggiBoard/PalaceTest.java b/src/test/java/janggiBoard/PalaceTest.java index 852ad2897a..40cf100363 100644 --- a/src/test/java/janggiBoard/PalaceTest.java +++ b/src/test/java/janggiBoard/PalaceTest.java @@ -2,6 +2,7 @@ import domain.Position; import domain.Team; +import domain.piece.Guard; import domain.piece.King; import domain.piece.PieceProvider; import org.junit.jupiter.api.BeforeEach; @@ -16,10 +17,12 @@ public class PalaceTest { private TestPieceProvider testBoard; private King king; + private Guard guard; @BeforeEach void setUp() { king = new King(Team.CHO); + guard = new Guard(Team.CHO); testBoard = new TestPieceProvider(); } @@ -45,6 +48,28 @@ void setUp() { assertThat(isKingMove).isFalse(); } + @Test + void 사가_목적지에_갈_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(4, 5); + + testBoard.setAllBlank(); + boolean isGuardMove = guard.canMove(currentPosition, targetPosition, testBoard); + assertThat(isGuardMove).isTrue(); + } + + @Test + void 사가_목적지에_갈_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(4, 5); + + testBoard.setAllBlank(); + testBoard.setBlank(new Position(4, 5)); + boolean isGuardMove = guard.canMove(currentPosition, targetPosition, testBoard); + assertThat(isGuardMove).isFalse(); + } + + private static class TestPieceProvider implements PieceProvider { private final Map boardState = new HashMap<>(); private boolean defaultState = true; From 40cc4e6e570a3604c798b042d56636654a3c2f09 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:29:35 +0900 Subject: [PATCH 24/68] =?UTF-8?q?feat:=20=EC=82=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=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/domain/piece/Guard.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index 5d3aea84b2..38e6f0bd87 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -1,9 +1,29 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.MoveStrategy; +import domain.strategy.PalaceStrategy; + +import java.util.List; public class Guard extends Piece { + private final MoveStrategy moveStrategy; + public Guard(Team team) { super(team); + this.moveStrategy = new PalaceStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + return true; + } + } + return false; } } From 0e76ae1f713051bfc23c7f9897c16cbf6f817903 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:38:47 +0900 Subject: [PATCH 25/68] =?UTF-8?q?feat:=20=EC=A1=B8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/strategy/PawnStrategy.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index 79312db012..dd78c4f116 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -3,12 +3,24 @@ import domain.Position; import domain.piece.PieceProvider; +import java.util.ArrayList; import java.util.List; public class PawnStrategy implements MoveStrategy { @Override - public List getMoveCandidates(Position source, PieceProvider board) { - return List.of(); + public List getMoveCandidates(Position currentPosition, PieceProvider board) { + List candidates = new ArrayList<>(); + + Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + + for (Direction direction : directions) { + int targetRow = currentPosition.getRows() + direction.getRowOffset(); + int targetColumns = currentPosition.getColumns() + direction.getColOffset(); + + Position targetPosition = new Position(targetRow, targetColumns); + candidates.add(targetPosition); + } + return candidates; } } From 896a27dfc2bcc0a1b17c43988a9462a4954e7516 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:39:03 +0900 Subject: [PATCH 26/68] =?UTF-8?q?feat:=20=EC=A1=B8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=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/domain/piece/Pawn.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/domain/piece/Pawn.java b/src/main/java/domain/piece/Pawn.java index a51fd8bba1..1c71586a54 100644 --- a/src/main/java/domain/piece/Pawn.java +++ b/src/main/java/domain/piece/Pawn.java @@ -1,9 +1,29 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.MoveStrategy; +import domain.strategy.PawnStrategy; + +import java.util.List; public class Pawn extends Piece{ + private final MoveStrategy moveStrategy; + public Pawn(Team team) { super(team); + this.moveStrategy = new PawnStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + return true; + } + } + return false; } } From 2b22d013a1309eac61a7f558a3a4ff1104b7d6f6 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:39:23 +0900 Subject: [PATCH 27/68] =?UTF-8?q?test:=20=EC=A1=B8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/PawnStrategyTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/java/janggiBoard/PawnStrategyTest.java diff --git a/src/test/java/janggiBoard/PawnStrategyTest.java b/src/test/java/janggiBoard/PawnStrategyTest.java new file mode 100644 index 0000000000..b9c344b3f5 --- /dev/null +++ b/src/test/java/janggiBoard/PawnStrategyTest.java @@ -0,0 +1,58 @@ +package janggiBoard; + +import domain.Position; +import domain.piece.PieceProvider; +import domain.strategy.PalaceStrategy; +import domain.strategy.PawnStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PawnStrategyTest { + + private PawnStrategy pawnStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + void setUp() { + pawnStrategy = new PawnStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 졸은_4가지_이동_후보_모두_반환() { + Position currentPosition = new Position(5, 5); + testBoard.setAllBlank(); + + List candidates = pawnStrategy.getMoveCandidates(currentPosition, testBoard); + + assertThat(candidates).hasSize(4) + .containsExactlyInAnyOrder( + new Position(4, 5), new Position(6, 5), + new Position(5, 4), new Position(5, 6) + ); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 69059391c1119b8577e37e17e68e4df839d3c792 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 20:39:34 +0900 Subject: [PATCH 28/68] =?UTF-8?q?test:=20=EC=A1=B8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/PawnTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/janggiBoard/PawnTest.java diff --git a/src/test/java/janggiBoard/PawnTest.java b/src/test/java/janggiBoard/PawnTest.java new file mode 100644 index 0000000000..80a01047fc --- /dev/null +++ b/src/test/java/janggiBoard/PawnTest.java @@ -0,0 +1,4 @@ +package janggiBoard; + +public class PawnTest { +} From 056f50166fc067909a52ad7d6dba5e06cbe6671b Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:10:23 +0900 Subject: [PATCH 29/68] =?UTF-8?q?feat:=20=EC=83=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/strategy/ElephantStrategy.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index b610049ad8..1043ab3dc1 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -3,11 +3,46 @@ import domain.Position; import domain.piece.PieceProvider; +import java.util.ArrayList; import java.util.List; public class ElephantStrategy implements MoveStrategy{ + @Override - public List getMoveCandidates(Position source, PieceProvider board) { + public List getMoveCandidates(Position currentPosition, PieceProvider board) { + List candidates = new ArrayList<>(); + Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + + for (Direction straight : straightDirections) { + Position myeok1 = new Position( + currentPosition.getRows() + straight.getRowOffset(), + currentPosition.getColumns() + straight.getColOffset() + ); + + if (!board.isBlank(myeok1)) continue; + + for (Direction diag : getDiagonalsFor(straight)) { + Position myeok2 = new Position( + myeok1.getRows() + diag.getRowOffset(), + myeok1.getColumns() + diag.getColOffset() + ); + + if (!board.isBlank(myeok2)) continue; + + Position target = new Position(myeok2.getRows() + diag.getRowOffset(), + myeok2.getColumns() + diag.getColOffset() + ); + candidates.add(target); + } + } + return candidates; + } + + private List getDiagonalsFor(Direction straight) { + if (straight == Direction.NORTH) return List.of(Direction.NORTH_WEST, Direction.NORTH_EAST); + if (straight == Direction.SOUTH) return List.of(Direction.SOUTH_WEST, Direction.SOUTH_EAST); + if (straight == Direction.WEST) return List.of(Direction.NORTH_WEST, Direction.SOUTH_WEST); + if (straight == Direction.EAST) return List.of(Direction.NORTH_EAST, Direction.SOUTH_EAST); return List.of(); } } From 630fda96ffb3b37597e9787010bb678d18561fb6 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:10:33 +0900 Subject: [PATCH 30/68] =?UTF-8?q?feat:=20=EC=83=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../janggiBoard/ElephantStrategyTest.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/test/java/janggiBoard/ElephantStrategyTest.java diff --git a/src/test/java/janggiBoard/ElephantStrategyTest.java b/src/test/java/janggiBoard/ElephantStrategyTest.java new file mode 100644 index 0000000000..451b8876d2 --- /dev/null +++ b/src/test/java/janggiBoard/ElephantStrategyTest.java @@ -0,0 +1,108 @@ +package janggiBoard; + +import domain.Position; +import domain.piece.PieceProvider; +import domain.strategy.ElephantStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ElephantStrategyTest { + + private ElephantStrategy elephantStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + public void setUp() { + elephantStrategy = new ElephantStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 상_주변에_장애물_없으면_8가지_후보_모두_반환() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + List candidates = elephantStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(8) + .containsExactlyInAnyOrder( + new Position(2, 3), new Position(2, 7), // 북쪽 기반 + new Position(3, 8), new Position(7, 8), // 남쪽 기반 + new Position(8, 3), new Position(8, 7), // 서쪽 기반 + new Position(3, 2), new Position(7, 2) // 동쪽 기반 + ); + } + + @Test + void 북쪽_멱이_막혀있으면_북서_북동으로_이동할수_없다(){ + Position source = new Position(5, 5); + testBoard.setAllBlank(); + + // 북쪽 멱 위치를 막힌 상태로 설정 + testBoard.setBlank(new Position(4, 5)); + List candidates = elephantStrategy.getMoveCandidates(source, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(2, 3), new Position(2, 7)); + } + + @Test + void 남쪽_멱이_막혀있으면_남서_남동으로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(6, 5)); + List candidates = elephantStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(8,3), new Position(8,7)); + } + + @Test + void 서쪽_멱이_막혀있으면_북서_남서로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(5, 4)); + List candidates = elephantStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(3,2), new Position(7,2)); + } + + @Test + void 동쪽_멱이_막혀있으면_북동_남동으로_이동할수_없다() { + Position position = new Position(5, 5); + testBoard.setAllBlank(); + + testBoard.setBlank(new Position(5, 6)); + List candidates = elephantStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(6) + .doesNotContain(new Position(3, 8), new Position(7, 8)); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From dcf8b75a4daccb3d962db77ae08c76eeb1a795fe Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:16:57 +0900 Subject: [PATCH 31/68] =?UTF-8?q?feat:=20=EC=83=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=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/domain/piece/Elephant.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index 1e629505fe..a7ab27facd 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -1,9 +1,28 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.ElephantStrategy; +import domain.strategy.MoveStrategy; + +import java.util.List; public class Elephant extends Piece { + private final MoveStrategy moveStrategy; + public Elephant(Team team) { super(team); + this.moveStrategy = new ElephantStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition)) { + return true; + } + } + return false; } } From ff92e86ec511a1b114f3ad38042a27ac76ffa10d Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:17:11 +0900 Subject: [PATCH 32/68] =?UTF-8?q?test:=20=EC=83=81=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/ElephantTest.java | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/janggiBoard/ElephantTest.java diff --git a/src/test/java/janggiBoard/ElephantTest.java b/src/test/java/janggiBoard/ElephantTest.java new file mode 100644 index 0000000000..3b739a3e19 --- /dev/null +++ b/src/test/java/janggiBoard/ElephantTest.java @@ -0,0 +1,66 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.Elephant; +import domain.piece.Horse; +import domain.piece.PieceProvider; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ElephantTest { + + private TestPieceProvider testBoard; + private Elephant elephant; + + @BeforeEach + void setUp() { + elephant = new Elephant(Team.CHO); + testBoard = new TestPieceProvider(); + } + + @Test + void 마가_목적지에_갈_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(3, 8); + + testBoard.setAllBlank(); + boolean isCanMove = elephant.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCanMove).isTrue(); + } + + @Test + void 마가_목적지에_갈_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(3, 8); + + testBoard.setAllBlank(); + testBoard.setBlank(new Position(5, 6)); + + boolean isCanMove = elephant.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCanMove).isFalse(); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From e16f42b1ef0e45b11ecd542fab00a7bb8f59c548 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:43:50 +0900 Subject: [PATCH 33/68] =?UTF-8?q?test:=20=EC=B0=A8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/strategy/CarStrategy.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index 673c6085be..9e5239208b 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -3,12 +3,41 @@ import domain.Position; import domain.piece.PieceProvider; +import java.util.ArrayList; import java.util.List; public class CarStrategy implements MoveStrategy { @Override - public List getMoveCandidates(Position source, PieceProvider board) { - return List.of(); + public List getMoveCandidates(Position currentPosition, PieceProvider board) { + List candidates = new ArrayList<>(); + Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + + for (Direction direction : straightDirections) { + addPathCandidates(currentPosition, direction, board, candidates); + } + + return candidates; + } + + private void addPathCandidates(Position currentPosition, Direction direction, PieceProvider board, List candidatePositions) { + Position next = currentPosition; + + while (true) { + int nextRows = next.getRows() + direction.getRowOffset(); + int nextColumns = next.getColumns() + direction.getColOffset(); + + if (nextRows < 0 || nextRows >= 10 || nextColumns < 0 || nextColumns >= 9) { + break; + } + + next = new Position(nextRows, nextColumns); + if (board.isBlank(next)) { + candidatePositions.add(next); + continue; + } + candidatePositions.add(next); + break; + } } } From 5dde166a702255e220af9c453c869e81f638210f Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 21:43:59 +0900 Subject: [PATCH 34/68] =?UTF-8?q?test:=20=EC=B0=A8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/CarStrategyTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/janggiBoard/CarStrategyTest.java diff --git a/src/test/java/janggiBoard/CarStrategyTest.java b/src/test/java/janggiBoard/CarStrategyTest.java new file mode 100644 index 0000000000..94f254e420 --- /dev/null +++ b/src/test/java/janggiBoard/CarStrategyTest.java @@ -0,0 +1,73 @@ +package janggiBoard; + +import domain.Position; +import domain.piece.PieceProvider; +import domain.strategy.CarStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CarStrategyTest { + + private CarStrategy carStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + void setUp() { + carStrategy = new CarStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 차는_상하좌우_직선_모든칸_후보로_반환한다() { + Position position = new Position(5, 4); + testBoard.setAllBlank(); + + List candidates = carStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).hasSize(17); + assertThat(candidates).contains(new Position(0, 4), + new Position(9, 4), + new Position(5, 0), + new Position(5, 8)); + } + + @Test + void 이동경로에_장애물_있으면_그_지점까지_이동후_전진하지_않는다() { + Position position = new Position(5, 4); + testBoard.setAllBlank(); + + Position obstacle = new Position(3, 4); + testBoard.setBlank(obstacle); + + List candidates = carStrategy.getMoveCandidates(position, testBoard); + + assertThat(candidates).contains(new Position(4, 4), new Position(3, 4)); + assertThat(candidates).doesNotContain(new Position(2, 4), + new Position(1, 4), + new Position(0, 4)); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position position) { + boardState.put(position, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From 10fb620006549ea2bd82e0c01c4685510dd2a557 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 22:17:16 +0900 Subject: [PATCH 35/68] =?UTF-8?q?test:=20=EC=B0=A8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=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/domain/piece/Car.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java index ee66a70ed0..60f080c4c4 100644 --- a/src/main/java/domain/piece/Car.java +++ b/src/main/java/domain/piece/Car.java @@ -1,9 +1,28 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.CarStrategy; +import domain.strategy.MoveStrategy; + +import java.util.List; public class Car extends Piece { + private final MoveStrategy moveStrategy; + public Car(Team team) { super(team); + this.moveStrategy = new CarStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition)) { + return true; + } + } + return false; } } From f67b4c8b5d25da9c2f5c49eb846b012faadff46a Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Fri, 27 Mar 2026 22:17:25 +0900 Subject: [PATCH 36/68] =?UTF-8?q?test:=20=EC=B0=A8=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/CarTest.java | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/test/java/janggiBoard/CarTest.java diff --git a/src/test/java/janggiBoard/CarTest.java b/src/test/java/janggiBoard/CarTest.java new file mode 100644 index 0000000000..e9155217bd --- /dev/null +++ b/src/test/java/janggiBoard/CarTest.java @@ -0,0 +1,67 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.Car; +import domain.piece.PieceProvider; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class CarTest { + + private Car car; + private TestPieceProvider testBoard; + + @BeforeEach + public void setUp() { + car = new Car(Team.CHO); + testBoard = new TestPieceProvider(); + } + + @Test + void 차는_목적지에_갈_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(7, 5); + + testBoard.setAllBlank(); + boolean isCarMove = car.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCarMove).isTrue(); + } + + @Test + void 차는_목적지에_갈_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(7, 5); + + testBoard.setAllBlank(); + testBoard.setBlank(new Position(6, 5)); + + boolean isCarMove = car.canMove(currentPosition, targetPosition, testBoard); + + assertThat(isCarMove).isFalse(); + } + + + private static class TestPieceProvider implements PieceProvider { + private final Map boardState = new HashMap<>(); + private boolean defaultState = true; + + void setBlank(Position pos) { + boardState.put(pos, false); + } + + void setAllBlank() { + this.defaultState = true; + } + + @Override + public boolean isBlank(Position position) { + return boardState.getOrDefault(position, defaultState); + } + } +} From c09e0e50a9cd27efe6b29e22094213833a933576 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:13:53 +0900 Subject: [PATCH 37/68] =?UTF-8?q?refactor:=20Piece=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20PieceProvider=EC=97=90=20?= =?UTF-8?q?=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/JanggiBoard.java | 1 + src/main/java/domain/piece/PieceProvider.java | 1 + src/test/java/janggiBoard/CarStrategyTest.java | 7 +++++++ src/test/java/janggiBoard/CarTest.java | 7 +++++++ src/test/java/janggiBoard/ElephantStrategyTest.java | 7 +++++++ src/test/java/janggiBoard/ElephantTest.java | 9 ++++++--- src/test/java/janggiBoard/HorseStrategyTest.java | 7 +++++++ src/test/java/janggiBoard/HorseTest.java | 7 +++++++ src/test/java/janggiBoard/PalaceStrategyTest.java | 7 +++++++ src/test/java/janggiBoard/PalaceTest.java | 9 ++++++--- src/test/java/janggiBoard/PawnStrategyTest.java | 7 +++++++ 11 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index a86e315952..72b5381c1c 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -65,6 +65,7 @@ public boolean isBlank(Position position) { return piece instanceof Blank; } + @Override public Piece getPiece(Position position) { return janggiBoard.get(position); } diff --git a/src/main/java/domain/piece/PieceProvider.java b/src/main/java/domain/piece/PieceProvider.java index 3217fc5476..20b9e98458 100644 --- a/src/main/java/domain/piece/PieceProvider.java +++ b/src/main/java/domain/piece/PieceProvider.java @@ -4,4 +4,5 @@ public interface PieceProvider { boolean isBlank(Position position); + Piece getPiece(Position position); } diff --git a/src/test/java/janggiBoard/CarStrategyTest.java b/src/test/java/janggiBoard/CarStrategyTest.java index 94f254e420..244baf9a2b 100644 --- a/src/test/java/janggiBoard/CarStrategyTest.java +++ b/src/test/java/janggiBoard/CarStrategyTest.java @@ -1,6 +1,8 @@ package janggiBoard; import domain.Position; +import domain.piece.Blank; +import domain.piece.Piece; import domain.piece.PieceProvider; import domain.strategy.CarStrategy; import org.junit.jupiter.api.BeforeEach; @@ -69,5 +71,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/CarTest.java b/src/test/java/janggiBoard/CarTest.java index e9155217bd..1d58f8f0f1 100644 --- a/src/test/java/janggiBoard/CarTest.java +++ b/src/test/java/janggiBoard/CarTest.java @@ -2,7 +2,9 @@ import domain.Position; import domain.Team; +import domain.piece.Blank; import domain.piece.Car; +import domain.piece.Piece; import domain.piece.PieceProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -63,5 +65,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/ElephantStrategyTest.java b/src/test/java/janggiBoard/ElephantStrategyTest.java index 451b8876d2..828e1b4209 100644 --- a/src/test/java/janggiBoard/ElephantStrategyTest.java +++ b/src/test/java/janggiBoard/ElephantStrategyTest.java @@ -1,6 +1,8 @@ package janggiBoard; import domain.Position; +import domain.piece.Blank; +import domain.piece.Piece; import domain.piece.PieceProvider; import domain.strategy.ElephantStrategy; import org.junit.jupiter.api.BeforeEach; @@ -104,5 +106,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/ElephantTest.java b/src/test/java/janggiBoard/ElephantTest.java index 3b739a3e19..3a031f0c32 100644 --- a/src/test/java/janggiBoard/ElephantTest.java +++ b/src/test/java/janggiBoard/ElephantTest.java @@ -2,9 +2,7 @@ import domain.Position; import domain.Team; -import domain.piece.Elephant; -import domain.piece.Horse; -import domain.piece.PieceProvider; +import domain.piece.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -62,5 +60,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/HorseStrategyTest.java b/src/test/java/janggiBoard/HorseStrategyTest.java index de754a45e3..a9c5532c7a 100644 --- a/src/test/java/janggiBoard/HorseStrategyTest.java +++ b/src/test/java/janggiBoard/HorseStrategyTest.java @@ -2,6 +2,8 @@ import domain.Position; +import domain.piece.Blank; +import domain.piece.Piece; import domain.piece.PieceProvider; import domain.strategy.HorseStrategy; import org.junit.jupiter.api.BeforeEach; @@ -104,5 +106,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/HorseTest.java b/src/test/java/janggiBoard/HorseTest.java index 2ec9448d15..1c3e408f86 100644 --- a/src/test/java/janggiBoard/HorseTest.java +++ b/src/test/java/janggiBoard/HorseTest.java @@ -2,7 +2,9 @@ import domain.Position; import domain.Team; +import domain.piece.Blank; import domain.piece.Horse; +import domain.piece.Piece; import domain.piece.PieceProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -60,5 +62,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/PalaceStrategyTest.java b/src/test/java/janggiBoard/PalaceStrategyTest.java index 99b737b369..8eb8a73c54 100644 --- a/src/test/java/janggiBoard/PalaceStrategyTest.java +++ b/src/test/java/janggiBoard/PalaceStrategyTest.java @@ -1,6 +1,8 @@ package janggiBoard; import domain.Position; +import domain.piece.Blank; +import domain.piece.Piece; import domain.piece.PieceProvider; import domain.strategy.PalaceStrategy; import org.junit.jupiter.api.BeforeEach; @@ -55,5 +57,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/PalaceTest.java b/src/test/java/janggiBoard/PalaceTest.java index 40cf100363..152fa2d575 100644 --- a/src/test/java/janggiBoard/PalaceTest.java +++ b/src/test/java/janggiBoard/PalaceTest.java @@ -2,9 +2,7 @@ import domain.Position; import domain.Team; -import domain.piece.Guard; -import domain.piece.King; -import domain.piece.PieceProvider; +import domain.piece.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -86,5 +84,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } diff --git a/src/test/java/janggiBoard/PawnStrategyTest.java b/src/test/java/janggiBoard/PawnStrategyTest.java index b9c344b3f5..21c896775d 100644 --- a/src/test/java/janggiBoard/PawnStrategyTest.java +++ b/src/test/java/janggiBoard/PawnStrategyTest.java @@ -1,6 +1,8 @@ package janggiBoard; import domain.Position; +import domain.piece.Blank; +import domain.piece.Piece; import domain.piece.PieceProvider; import domain.strategy.PalaceStrategy; import domain.strategy.PawnStrategy; @@ -54,5 +56,10 @@ void setAllBlank() { public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + + @Override + public Piece getPiece(Position position) { + return new Blank(); + } } } From ad3cf23761a1004a9c1e789d4248b84d018a3d1e Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:42:13 +0900 Subject: [PATCH 38/68] =?UTF-8?q?feat:=20=ED=8F=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/strategy/CannonStrategy.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/domain/strategy/CannonStrategy.java diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java new file mode 100644 index 0000000000..dd61e0b0ca --- /dev/null +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -0,0 +1,61 @@ +package domain.strategy; + +import domain.Position; +import domain.piece.Cannon; +import domain.piece.PieceProvider; + +import java.util.ArrayList; +import java.util.List; + +public class CannonStrategy implements MoveStrategy{ + + @Override + public List getMoveCandidates(Position currentPosition, PieceProvider board) { + List candidates = new ArrayList<>(); + Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + for (Direction direction : straightDirections) { + addCannonCandidates(currentPosition, direction, board, candidates); + } + return candidates; + } + + private void addCannonCandidates(Position currentPosition, Direction direction, PieceProvider board, List candidatesPosition) { + Position bridge = findFirstPiece(currentPosition, direction, board); + boolean isInstanceOfCannon = board.getPiece(bridge) instanceof Cannon; + if (!isWithinBoard(bridge) || isInstanceOfCannon) { + return; + } + collectTargets(bridge, direction, board, candidatesPosition); + } + + private Position findFirstPiece(Position position, Direction direction, PieceProvider board) { + Position nextPosition = getNext(position, direction); + while (isWithinBoard(nextPosition) && board.isBlank(nextPosition)) { + nextPosition = getNext(nextPosition, direction); + } + return nextPosition; + } + + private Position getNext(Position position, Direction direction) { + int nextRows = position.getRows() + direction.getRowOffset(); + int nextColumns = position.getColumns() + direction.getColOffset(); + return new Position(nextRows, nextColumns); + } + + private void collectTargets(Position bridge, Direction direction, PieceProvider board, List candidates) { + Position target = getNext(bridge, direction); + while (isWithinBoard(target) && board.isBlank(target)) { + candidates.add(target); + target = getNext(target, direction); + } + boolean isInstanceOfCannon = board.getPiece(target) instanceof Cannon; + if (isWithinBoard(target) && !isInstanceOfCannon) { + candidates.add(target); + } + } + + private boolean isWithinBoard(Position position) { + return position.getRows() >= 0 && position.getRows() < 10 && + position.getColumns() >= 0 && position.getColumns() < 9; + } +} From 96a1c5961e8af2f7998becd2fded5da02f18d7b4 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:42:22 +0900 Subject: [PATCH 39/68] =?UTF-8?q?test:=20=ED=8F=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/janggiBoard/CannonStrategyTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/test/java/janggiBoard/CannonStrategyTest.java diff --git a/src/test/java/janggiBoard/CannonStrategyTest.java b/src/test/java/janggiBoard/CannonStrategyTest.java new file mode 100644 index 0000000000..22ae895051 --- /dev/null +++ b/src/test/java/janggiBoard/CannonStrategyTest.java @@ -0,0 +1,87 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.*; +import domain.strategy.CannonStrategy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; + +public class CannonStrategyTest { + + private CannonStrategy cannonStrategy; + private TestPieceProvider testBoard; + + @BeforeEach + public void setUp() { + cannonStrategy = new CannonStrategy(); + testBoard = new TestPieceProvider(); + } + + @Test + void 포가_기물_한개를_넘어_빈칸으로_이동하는지_확인한다() { + Position currentPosition = new Position(0, 0); + testBoard.setPiece(new Position(2, 0), new Guard(Team.CHO)); + + List candidates = cannonStrategy.getMoveCandidates(currentPosition, testBoard); + assertThat(candidates).contains(new Position(3, 0), new Position(9, 0)); + assertThat(candidates).doesNotContain(new Position(1, 0), new Position(2, 0)); + } + + @Test + void 포는_다른포를_건너뛸_수_없다() { + Position currentPosition = new Position(0, 0); + testBoard.setPiece(new Position(2, 0), new Cannon(Team.CHO)); + + List candidates = cannonStrategy.getMoveCandidates(currentPosition, testBoard); + assertThat(candidates.size()).isEqualTo(0); + } + + @Test + void 포는_기물이_없으면_이동할_수_없다() { + Position currentPosition = new Position(0, 0); + testBoard.setAllBlank(); + + List candidates = cannonStrategy.getMoveCandidates(currentPosition, testBoard); + assertThat(candidates.size()).isEqualTo(0); + } + + @Test + void 포는_다른포를_잡을_수_없다() { + Position currentPosition = new Position(0, 0); + testBoard.setPiece(new Position(2, 0), new Guard(Team.CHO)); + testBoard.setPiece(new Position(4, 0), new Cannon(Team.HAN)); + + List candidates = cannonStrategy.getMoveCandidates(currentPosition, testBoard); + assertThat(candidates).contains(new Position(3, 0)); + assertThat(candidates).doesNotContain(new Position(4, 0)); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map pieces = new HashMap<>(); + + void setPiece(Position position, Piece piece) { + pieces.put(position, piece); + } + + void setAllBlank() { + pieces.clear(); + } + + @Override + public boolean isBlank(Position position) { + return !pieces.containsKey(position); + } + + @Override + public Piece getPiece(Position position) { + return pieces.getOrDefault(position, new Blank()); + } + } +} From d4392b72472ef8959a4f45bb0031dd6861a87330 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:57:58 +0900 Subject: [PATCH 40/68] =?UTF-8?q?feat:=20=ED=8F=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=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/domain/piece/Cannon.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index b0cf734c49..af52617a4a 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -1,9 +1,27 @@ package domain.piece; +import domain.Position; import domain.Team; +import domain.strategy.CannonStrategy; + +import java.util.List; public class Cannon extends Piece { + + private final CannonStrategy cannonStrategy; + public Cannon(Team team) { super(team); + cannonStrategy = new CannonStrategy(); + } + + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + List moveCandidates = cannonStrategy.getMoveCandidates(currentPosition, pieceProvider); + for (Position candidatePosition : moveCandidates) { + if (candidatePosition.equals(targetPosition)) { + return true; + } + } + return false; } } From fa51506a49ad8176e5d11b26b1edeb6f8e5d31f7 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:58:09 +0900 Subject: [PATCH 41/68] =?UTF-8?q?test:=20=ED=8F=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/janggiBoard/CannonTest.java | 83 +++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/test/java/janggiBoard/CannonTest.java diff --git a/src/test/java/janggiBoard/CannonTest.java b/src/test/java/janggiBoard/CannonTest.java new file mode 100644 index 0000000000..e784db5d21 --- /dev/null +++ b/src/test/java/janggiBoard/CannonTest.java @@ -0,0 +1,83 @@ +package janggiBoard; + +import domain.Position; +import domain.Team; +import domain.piece.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CannonTest { + + private Cannon cannon; + private TestPieceProvider testBoard; + + @BeforeEach + public void setUp() { + cannon = new Cannon(Team.CHO); + testBoard = new TestPieceProvider(); + } + + @Test + void 포는_다리를_넘어_이동할_수_있다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(8, 5); + + testBoard.setAllBlank(); + testBoard.setPiece(new Position(6, 5), new Guard(Team.CHO)); + + boolean isCannonMove = cannon.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCannonMove).isTrue(); + } + + @Test + void 포는_포를_다리로_삼을_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(8, 5); + + testBoard.setAllBlank(); + testBoard.setPiece(new Position(6, 5), new Cannon(Team.CHO)); + + boolean isCannonMove = cannon.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCannonMove).isFalse(); + } + + @Test + void 포는_포를_잡을_수_없다() { + Position currentPosition = new Position(5, 5); + Position targetPosition = new Position(8, 5); + + testBoard.setAllBlank(); + testBoard.setPiece(new Position(6, 5), new Guard(Team.CHO)); + testBoard.setPiece(new Position(8, 5), new Cannon(Team.HAN)); + + boolean isCannonMove = cannon.canMove(currentPosition, targetPosition, testBoard); + assertThat(isCannonMove).isFalse(); + } + + private static class TestPieceProvider implements PieceProvider { + private final Map pieces = new HashMap<>(); + + void setPiece(Position pos, Piece piece) { + pieces.put(pos, piece); + } + + void setAllBlank() { + pieces.clear(); + } + + @Override + public boolean isBlank(Position position) { + return !pieces.containsKey(position); + } + + @Override + public Piece getPiece(Position position) { + return pieces.getOrDefault(position, new Blank()); + } + } +} From e2d86d2db7c16488f4c6e5fd5f9aa55e6bec6482 Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 00:59:59 +0900 Subject: [PATCH 42/68] =?UTF-8?q?docs:=20=EA=B8=B0=EB=AC=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=A0=84=EB=9E=B5=20=EC=B2=B4=ED=81=AC=EB=A6=AC?= =?UTF-8?q?=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 --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1fc941e104..0be9e88edc 100644 --- a/README.md +++ b/README.md @@ -27,17 +27,17 @@ - [x] 좌하로 이동하면 (1,-1)만큼 이동한다. ## 기물 이동 전략 -- [ ] 기물 이동 전략을 생성한다. - - [ ] 궁,사 : 방향에 관계 없이 한 칸씩 이동할 수 있다. - - [ ] 마 : 방향에 관계 없이 직진 후 대각선으로 한 칸 이동할 수 있다. - - [ ] 이동하는 경로에 기물이 존재해서는 안된다. - - [ ] 상 : 방향에 관계 없이 직진 후 대각선으로 두 칸 이동할 수 있다. - - [ ] 이동하는 경로에 기물이 존재해서는 안된다. - - [ ] 차 : 방향에 관계 없이 원하는만큼 이동할 수 있다. - - [ ] 졸 : 좌,우,앞으로 한 칸씩 이동할 수 있다. - - [ ] 뒤로는 갈 수 없다. - - [ ] 포 : 앞에 기물이 한 개 존재할 때 원하는 곳으로 뛰어넘을 수 있다. - - [ ] 포끼리는 뛰어넘을 수 없다. +- [x] 기물 이동 전략을 생성한다. + - [x] 궁,사 : 방향에 관계 없이 한 칸씩 이동할 수 있다. + - [x] 마 : 방향에 관계 없이 직진 후 대각선으로 한 칸 이동할 수 있다. + - [x] 이동하는 경로에 기물이 존재해서는 안된다. + - [x] 상 : 방향에 관계 없이 직진 후 대각선으로 두 칸 이동할 수 있다. + - [x] 이동하는 경로에 기물이 존재해서는 안된다. + - [x] 차 : 방향에 관계 없이 원하는만큼 이동할 수 있다. + - [x] 졸 : 좌,우,앞으로 한 칸씩 이동할 수 있다. + - [x] 뒤로는 갈 수 없다. + - [x] 포 : 앞에 기물이 한 개 존재할 때 원하는 곳으로 뛰어넘을 수 있다. + - [x] 포끼리는 뛰어넘을 수 없다. ## 출력 - [ ] 초기화된 장기판을 출력한다. From c0527fe5a32696878d6833f4f0000decbcf65aef Mon Sep 17 00:00:00 2001 From: haeseon lee Date: Sat, 28 Mar 2026 01:02:58 +0900 Subject: [PATCH 43/68] =?UTF-8?q?docs:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +--------------- src/test/java/janggiBoard/PawnTest.java | 4 ---- .../janggiBoard/{ => PieceTest}/CannonTest.java | 2 +- .../janggiBoard/{ => PieceTest}/CarTest.java | 2 +- .../{ => PieceTest}/ElephantTest.java | 2 +- .../janggiBoard/{ => PieceTest}/HorseTest.java | 2 +- .../janggiBoard/{ => PieceTest}/PalaceTest.java | 2 +- .../java/janggiBoard/PieceTest/PawnTest.java | 4 ++++ .../{ => strategyTest}/CannonStrategyTest.java | 2 +- .../{ => strategyTest}/CarStrategyTest.java | 2 +- .../{ => strategyTest}/ElephantStrategyTest.java | 2 +- .../{ => strategyTest}/HorseStrategyTest.java | 2 +- .../{ => strategyTest}/PalaceStrategyTest.java | 2 +- .../{ => strategyTest}/PawnStrategyTest.java | 3 +-- 14 files changed, 16 insertions(+), 31 deletions(-) delete mode 100644 src/test/java/janggiBoard/PawnTest.java rename src/test/java/janggiBoard/{ => PieceTest}/CannonTest.java (98%) rename src/test/java/janggiBoard/{ => PieceTest}/CarTest.java (98%) rename src/test/java/janggiBoard/{ => PieceTest}/ElephantTest.java (98%) rename src/test/java/janggiBoard/{ => PieceTest}/HorseTest.java (98%) rename src/test/java/janggiBoard/{ => PieceTest}/PalaceTest.java (98%) create mode 100644 src/test/java/janggiBoard/PieceTest/PawnTest.java rename src/test/java/janggiBoard/{ => strategyTest}/CannonStrategyTest.java (98%) rename src/test/java/janggiBoard/{ => strategyTest}/CarStrategyTest.java (98%) rename src/test/java/janggiBoard/{ => strategyTest}/ElephantStrategyTest.java (99%) rename src/test/java/janggiBoard/{ => strategyTest}/HorseStrategyTest.java (99%) rename src/test/java/janggiBoard/{ => strategyTest}/PalaceStrategyTest.java (98%) rename src/test/java/janggiBoard/{ => strategyTest}/PawnStrategyTest.java (96%) diff --git a/README.md b/README.md index 0be9e88edc..f9ad6209e3 100644 --- a/README.md +++ b/README.md @@ -37,18 +37,4 @@ - [x] 졸 : 좌,우,앞으로 한 칸씩 이동할 수 있다. - [x] 뒤로는 갈 수 없다. - [x] 포 : 앞에 기물이 한 개 존재할 때 원하는 곳으로 뛰어넘을 수 있다. - - [x] 포끼리는 뛰어넘을 수 없다. - -## 출력 -- [ ] 초기화된 장기판을 출력한다. - -``` - 0 1 2 3 4 5 6 7 8 - 0 [차][마][상][사] . [사][상][마][차] - 1 . . . . [장] . . . . - 2 . [포] . . . . . [포] . - 3 [졸] . [졸] . [졸] . [졸] . [졸] - ... - 9 초나라 기물들 -``` - + - [x] 포끼리는 뛰어넘을 수 없다. \ No newline at end of file diff --git a/src/test/java/janggiBoard/PawnTest.java b/src/test/java/janggiBoard/PawnTest.java deleted file mode 100644 index 80a01047fc..0000000000 --- a/src/test/java/janggiBoard/PawnTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package janggiBoard; - -public class PawnTest { -} diff --git a/src/test/java/janggiBoard/CannonTest.java b/src/test/java/janggiBoard/PieceTest/CannonTest.java similarity index 98% rename from src/test/java/janggiBoard/CannonTest.java rename to src/test/java/janggiBoard/PieceTest/CannonTest.java index e784db5d21..42168d4a2a 100644 --- a/src/test/java/janggiBoard/CannonTest.java +++ b/src/test/java/janggiBoard/PieceTest/CannonTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.PieceTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/CarTest.java b/src/test/java/janggiBoard/PieceTest/CarTest.java similarity index 98% rename from src/test/java/janggiBoard/CarTest.java rename to src/test/java/janggiBoard/PieceTest/CarTest.java index 1d58f8f0f1..c2b60138a7 100644 --- a/src/test/java/janggiBoard/CarTest.java +++ b/src/test/java/janggiBoard/PieceTest/CarTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.PieceTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/ElephantTest.java b/src/test/java/janggiBoard/PieceTest/ElephantTest.java similarity index 98% rename from src/test/java/janggiBoard/ElephantTest.java rename to src/test/java/janggiBoard/PieceTest/ElephantTest.java index 3a031f0c32..9ce0d0cbcc 100644 --- a/src/test/java/janggiBoard/ElephantTest.java +++ b/src/test/java/janggiBoard/PieceTest/ElephantTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.PieceTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/HorseTest.java b/src/test/java/janggiBoard/PieceTest/HorseTest.java similarity index 98% rename from src/test/java/janggiBoard/HorseTest.java rename to src/test/java/janggiBoard/PieceTest/HorseTest.java index 1c3e408f86..e905596769 100644 --- a/src/test/java/janggiBoard/HorseTest.java +++ b/src/test/java/janggiBoard/PieceTest/HorseTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.PieceTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/PalaceTest.java b/src/test/java/janggiBoard/PieceTest/PalaceTest.java similarity index 98% rename from src/test/java/janggiBoard/PalaceTest.java rename to src/test/java/janggiBoard/PieceTest/PalaceTest.java index 152fa2d575..b367cdd739 100644 --- a/src/test/java/janggiBoard/PalaceTest.java +++ b/src/test/java/janggiBoard/PieceTest/PalaceTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.PieceTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/PieceTest/PawnTest.java b/src/test/java/janggiBoard/PieceTest/PawnTest.java new file mode 100644 index 0000000000..36b87f8f65 --- /dev/null +++ b/src/test/java/janggiBoard/PieceTest/PawnTest.java @@ -0,0 +1,4 @@ +package janggiBoard.PieceTest; + +public class PawnTest { +} diff --git a/src/test/java/janggiBoard/CannonStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java similarity index 98% rename from src/test/java/janggiBoard/CannonStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java index 22ae895051..a68d8ccde7 100644 --- a/src/test/java/janggiBoard/CannonStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; import domain.Team; diff --git a/src/test/java/janggiBoard/CarStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java similarity index 98% rename from src/test/java/janggiBoard/CarStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/CarStrategyTest.java index 244baf9a2b..bb3e805008 100644 --- a/src/test/java/janggiBoard/CarStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; import domain.piece.Blank; diff --git a/src/test/java/janggiBoard/ElephantStrategyTest.java b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java similarity index 99% rename from src/test/java/janggiBoard/ElephantStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java index 828e1b4209..dcaaa8216a 100644 --- a/src/test/java/janggiBoard/ElephantStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; import domain.piece.Blank; diff --git a/src/test/java/janggiBoard/HorseStrategyTest.java b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java similarity index 99% rename from src/test/java/janggiBoard/HorseStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java index a9c5532c7a..551462fcf4 100644 --- a/src/test/java/janggiBoard/HorseStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; diff --git a/src/test/java/janggiBoard/PalaceStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java similarity index 98% rename from src/test/java/janggiBoard/PalaceStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java index 8eb8a73c54..dbc6aaf653 100644 --- a/src/test/java/janggiBoard/PalaceStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; import domain.piece.Blank; diff --git a/src/test/java/janggiBoard/PawnStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java similarity index 96% rename from src/test/java/janggiBoard/PawnStrategyTest.java rename to src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java index 21c896775d..b8f823dab8 100644 --- a/src/test/java/janggiBoard/PawnStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java @@ -1,10 +1,9 @@ -package janggiBoard; +package janggiBoard.strategyTest; import domain.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; -import domain.strategy.PalaceStrategy; import domain.strategy.PawnStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 64e239ea2c3bf7f9c375df6206802793d2c59cda Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Sat, 28 Mar 2026 15:01:41 +0900 Subject: [PATCH 44/68] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/JanggiBoard.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 72b5381c1c..6672b4b133 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -35,7 +35,7 @@ private void setupInitialPieces() { } private void setupTeamPieces(Team team, int baseRow, int kingRow, int cannonRow, int pawnRow) { - // 예시: 차(車) 배치 + // 차 janggiBoard.put(new Position(baseRow, 0), new Car(team)); janggiBoard.put(new Position(baseRow, 8), new Car(team)); // 마 @@ -49,11 +49,10 @@ private void setupTeamPieces(Team team, int baseRow, int kingRow, int cannonRow, janggiBoard.put(new Position(baseRow, 5), new Guard(team)); // 궁 janggiBoard.put(new Position(kingRow, 4), new King(team)); - // 예시: 포(包) 배치 + // 포 janggiBoard.put(new Position(cannonRow, 1), new Cannon(team)); janggiBoard.put(new Position(cannonRow, 7), new Cannon(team)); - - // 예시: 졸/병 배치 + // 졸/병 for (int col = 0; col < 9; col += 2) { janggiBoard.put(new Position(pawnRow, col), new Pawn(team)); } @@ -70,4 +69,3 @@ public Piece getPiece(Position position) { return janggiBoard.get(position); } } - From 61a8b1136551c60dc52574bb38f7239d28c0111f Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 11:57:00 +0900 Subject: [PATCH 45/68] =?UTF-8?q?feat:=20=EC=9D=B4=EB=8F=99=20=EA=B8=B0?= =?UTF-8?q?=EB=AC=BC=20=EB=B0=8F=20=EC=A2=8C=ED=91=9C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/Application.java | 11 +++++ .../java/controller/JanggiController.java | 41 +++++++++++++++++++ src/main/java/view/InputView.java | 17 ++++++++ src/main/java/view/OutputView.java | 29 +++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 src/main/java/controller/Application.java create mode 100644 src/main/java/controller/JanggiController.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/controller/Application.java b/src/main/java/controller/Application.java new file mode 100644 index 0000000000..feb9c881d5 --- /dev/null +++ b/src/main/java/controller/Application.java @@ -0,0 +1,11 @@ +package controller; + +import view.InputView; +import view.OutputView; + +public class Application { + public static void main(String[] args) { + JanggiController janggiController = new JanggiController(new InputView(), new OutputView()); + janggiController.run(); + } +} diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java new file mode 100644 index 0000000000..5b49f3725b --- /dev/null +++ b/src/main/java/controller/JanggiController.java @@ -0,0 +1,41 @@ +package controller; + +import domain.JanggiBoard; +import domain.position.Position; +import view.InputView; +import view.OutputView; + +public class JanggiController { + private final InputView inputView; + private final OutputView outputView; + + public JanggiController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + Position movePosition = inputMovePosition(); + Position targetPosition = inputTargetPosition(); + } + + private Position inputMovePosition() { + String inputMovePosition = inputView.inputMovePiece(); + String[] parts = inputMovePosition.split(","); + + int row = Integer.parseInt(parts[0].trim()); + int column = Integer.parseInt(parts[1].trim()); + + return new Position(row, column); + } + + private Position inputTargetPosition() { + String inputMovePosition = inputView.inputMovePiece(); + String[] parts = inputMovePosition.split(","); + + int row = Integer.parseInt(parts[0].trim()); + int column = Integer.parseInt(parts[1].trim()); + + return new Position(row, column); + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..76ca7b10bf --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,17 @@ +package view; + +import java.util.Scanner; + +public class InputView { + private final Scanner sc = new Scanner(System.in); + + public String inputMovePiece() { + System.out.println("어떤 기물을 옮기시겠습니까?"); + return sc.nextLine(); + } + + public String inputTargetPosition() { + System.out.println("어디로 옮기시겠습니까?"); + return sc.nextLine(); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000000..418d39fe75 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,29 @@ +package view; + +import domain.JanggiBoard; +import domain.position.Position; +import domain.piece.Piece; + +public class OutputView { + private static final int BOARD_ROWS = 10; + private static final int BOARD_COLUMNS = 9; + + public void printBoard(JanggiBoard board) { + for (int row = 0; row < BOARD_ROWS; row++) { + printRow(board, row); + System.out.println(); // 한 행이 끝나면 줄바꿈 + } + } + + private void printRow(JanggiBoard board, int row) { + for (int col = 0; col < BOARD_COLUMNS; col++) { + Position position = new Position(row, col); + Piece piece = board.getPiece(position); + System.out.print(getSymbol(piece) + " "); + } + } + + private String getSymbol(Piece piece) { + return "차"; + } +} From 48c8d394b8f3f49afaa9e7b3613c2117f637ebc7 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 13:58:08 +0900 Subject: [PATCH 46/68] =?UTF-8?q?feat:=20=EB=B3=B4=EB=93=9C=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/{controller => }/Application.java | 3 +- src/main/java/view/OutputView.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) rename src/main/java/{controller => }/Application.java (87%) diff --git a/src/main/java/controller/Application.java b/src/main/java/Application.java similarity index 87% rename from src/main/java/controller/Application.java rename to src/main/java/Application.java index feb9c881d5..c4e80ce0a4 100644 --- a/src/main/java/controller/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,4 @@ -package controller; - +import controller.JanggiController; import view.InputView; import view.OutputView; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 418d39fe75..e378cc54db 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,13 @@ package view; import domain.JanggiBoard; +import domain.piece.Cannon; +import domain.piece.Car; +import domain.piece.Elephant; +import domain.piece.Guard; +import domain.piece.Horse; +import domain.piece.King; +import domain.piece.Pawn; import domain.position.Position; import domain.piece.Piece; @@ -11,7 +18,7 @@ public class OutputView { public void printBoard(JanggiBoard board) { for (int row = 0; row < BOARD_ROWS; row++) { printRow(board, row); - System.out.println(); // 한 행이 끝나면 줄바꿈 + System.out.println(); } } @@ -23,7 +30,29 @@ private void printRow(JanggiBoard board, int row) { } } + private String getSymbol(Piece piece) { - return "차"; + if (piece instanceof Cannon) { + return "포"; + } + if (piece instanceof Car) { + return "차"; + } + if (piece instanceof Elephant) { + return "상"; + } + if (piece instanceof Guard) { + return "사"; + } + if (piece instanceof Horse) { + return "마"; + } + if (piece instanceof King) { + return "궁"; + } + if (piece instanceof Pawn) { + return "졸"; + } + return "."; } } From 11db410494a7eebcc36187c2ed1bdcf2a6a4ff47 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 13:59:08 +0900 Subject: [PATCH 47/68] =?UTF-8?q?refactor:=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 3 +++ src/main/java/controller/JanggiGame.java | 4 ++++ src/main/java/domain/JanggiBoard.java | 1 + src/main/java/domain/JanggiBoardDTO.java | 13 +++++++++++++ src/main/java/domain/piece/Blank.java | 5 +++++ src/main/java/domain/piece/Cannon.java | 3 ++- src/main/java/domain/piece/Car.java | 4 ++-- src/main/java/domain/piece/Elephant.java | 4 ++-- src/main/java/domain/piece/Guard.java | 4 ++-- src/main/java/domain/piece/Horse.java | 4 ++-- src/main/java/domain/piece/King.java | 4 ++-- src/main/java/domain/piece/Pawn.java | 4 ++-- src/main/java/domain/piece/Piece.java | 4 +++- src/main/java/domain/piece/PieceProvider.java | 2 +- src/main/java/domain/{ => position}/Position.java | 2 +- src/main/java/domain/strategy/CannonStrategy.java | 2 +- src/main/java/domain/strategy/CarStrategy.java | 2 +- src/main/java/domain/strategy/ElephantStrategy.java | 2 +- src/main/java/domain/strategy/HorseStrategy.java | 2 +- src/main/java/domain/strategy/MoveStrategy.java | 2 +- src/main/java/domain/strategy/PalaceStrategy.java | 2 +- src/main/java/domain/strategy/PawnStrategy.java | 2 +- src/test/java/janggiBoard/BoardInitialTest.java | 2 +- src/test/java/janggiBoard/PieceTest/CannonTest.java | 2 +- src/test/java/janggiBoard/PieceTest/CarTest.java | 2 +- .../java/janggiBoard/PieceTest/ElephantTest.java | 2 +- src/test/java/janggiBoard/PieceTest/HorseTest.java | 2 +- src/test/java/janggiBoard/PieceTest/PalaceTest.java | 2 +- .../strategyTest/CannonStrategyTest.java | 2 +- .../janggiBoard/strategyTest/CarStrategyTest.java | 2 +- .../strategyTest/ElephantStrategyTest.java | 2 +- .../janggiBoard/strategyTest/HorseStrategyTest.java | 2 +- .../strategyTest/PalaceStrategyTest.java | 2 +- .../janggiBoard/strategyTest/PawnStrategyTest.java | 2 +- 34 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 src/main/java/controller/JanggiGame.java create mode 100644 src/main/java/domain/JanggiBoardDTO.java rename src/main/java/domain/{ => position}/Position.java (96%) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 5b49f3725b..5b60a75ff8 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -2,6 +2,7 @@ import domain.JanggiBoard; import domain.position.Position; +import java.util.LinkedHashMap; import view.InputView; import view.OutputView; @@ -17,6 +18,8 @@ public JanggiController(InputView inputView, OutputView outputView) { public void run() { Position movePosition = inputMovePosition(); Position targetPosition = inputTargetPosition(); + JanggiBoard janggiBoard = new JanggiBoard(new LinkedHashMap<>()); + outputView.printBoard(janggiBoard); } private Position inputMovePosition() { diff --git a/src/main/java/controller/JanggiGame.java b/src/main/java/controller/JanggiGame.java new file mode 100644 index 0000000000..b295e33d03 --- /dev/null +++ b/src/main/java/controller/JanggiGame.java @@ -0,0 +1,4 @@ +package controller; + +public class JanggiGame { +} diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 6672b4b133..290fdc769b 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -2,6 +2,7 @@ import domain.piece.*; +import domain.position.Position; import java.util.Collections; import java.util.Map; diff --git a/src/main/java/domain/JanggiBoardDTO.java b/src/main/java/domain/JanggiBoardDTO.java new file mode 100644 index 0000000000..1507430b2e --- /dev/null +++ b/src/main/java/domain/JanggiBoardDTO.java @@ -0,0 +1,13 @@ +package domain; + +import java.util.List; + +public record JanggiBoardDTO(List janggiBoardDto) { + public static JanggiBoardDTO from(JanggiBoard janggiBoard) { + List pieceDtos = janggiBoard.getJanggiBoard().entrySet().stream() + .map(entry -> PieceDTO.from(entry.getKey(), entry.getValue())) + .toList(); + + return new JanggiBoardDTO(pieceDtos); + } +} diff --git a/src/main/java/domain/piece/Blank.java b/src/main/java/domain/piece/Blank.java index 96d74ac16f..22fbf2b9b0 100644 --- a/src/main/java/domain/piece/Blank.java +++ b/src/main/java/domain/piece/Blank.java @@ -1,6 +1,7 @@ package domain.piece; import domain.Team; +import domain.position.Position; public class Blank extends Piece { @@ -8,4 +9,8 @@ public Blank() { super(Team.NONE); } + @Override + public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + return false; + } } diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index af52617a4a..74d108973f 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.CannonStrategy; @@ -15,6 +15,7 @@ public Cannon(Team team) { cannonStrategy = new CannonStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = cannonStrategy.getMoveCandidates(currentPosition, pieceProvider); for (Position candidatePosition : moveCandidates) { diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java index 60f080c4c4..79451f291c 100644 --- a/src/main/java/domain/piece/Car.java +++ b/src/main/java/domain/piece/Car.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.CarStrategy; import domain.strategy.MoveStrategy; @@ -15,9 +15,9 @@ public Car(Team team) { this.moveStrategy = new CarStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition)) { return true; diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index a7ab27facd..7e9b5117ae 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.ElephantStrategy; import domain.strategy.MoveStrategy; @@ -15,9 +15,9 @@ public Elephant(Team team) { this.moveStrategy = new ElephantStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition)) { return true; diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index 38e6f0bd87..c6208ce2ce 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.MoveStrategy; import domain.strategy.PalaceStrategy; @@ -15,10 +15,10 @@ public Guard(Team team) { this.moveStrategy = new PalaceStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { return true; diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index 0aa57b6b7e..f24298e2b6 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.HorseStrategy; import domain.strategy.MoveStrategy; @@ -16,9 +16,9 @@ public Horse(Team team) { this.moveStrategy = new HorseStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition)) { return true; diff --git a/src/main/java/domain/piece/King.java b/src/main/java/domain/piece/King.java index 0adfb05f21..d0e56d932a 100644 --- a/src/main/java/domain/piece/King.java +++ b/src/main/java/domain/piece/King.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.MoveStrategy; import domain.strategy.PalaceStrategy; @@ -16,10 +16,10 @@ public King(Team team) { this.moveStrategy = new PalaceStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { return true; diff --git a/src/main/java/domain/piece/Pawn.java b/src/main/java/domain/piece/Pawn.java index 1c71586a54..5f7233807e 100644 --- a/src/main/java/domain/piece/Pawn.java +++ b/src/main/java/domain/piece/Pawn.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.strategy.MoveStrategy; import domain.strategy.PawnStrategy; @@ -15,10 +15,10 @@ public Pawn(Team team) { this.moveStrategy = new PawnStrategy(); } + @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); - for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { return true; diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 7ebe43db94..b68dd3af46 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; import domain.Team; public abstract class Piece { @@ -17,4 +17,6 @@ public Team getTeam() { public void canMove(Position targetPosition) { // moveStrategy.movable(); } + + public abstract boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider); } diff --git a/src/main/java/domain/piece/PieceProvider.java b/src/main/java/domain/piece/PieceProvider.java index 20b9e98458..19c0b56606 100644 --- a/src/main/java/domain/piece/PieceProvider.java +++ b/src/main/java/domain/piece/PieceProvider.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; public interface PieceProvider { boolean isBlank(Position position); diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/position/Position.java similarity index 96% rename from src/main/java/domain/Position.java rename to src/main/java/domain/position/Position.java index 869ac8c148..f4f9c4d3f3 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/position/Position.java @@ -1,4 +1,4 @@ -package domain; +package domain.position; import java.util.Objects; diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index dd61e0b0ca..32cf96e42a 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.Cannon; import domain.piece.PieceProvider; diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index 9e5239208b..acfb6aa281 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.ArrayList; diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index 1043ab3dc1..7a64ccda8e 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.ArrayList; diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 02d7a82383..c54fca1d7f 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.ArrayList; diff --git a/src/main/java/domain/strategy/MoveStrategy.java b/src/main/java/domain/strategy/MoveStrategy.java index af7dd55fd8..3cf66fd198 100644 --- a/src/main/java/domain/strategy/MoveStrategy.java +++ b/src/main/java/domain/strategy/MoveStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.List; diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index 893d594bd9..c5605c00ab 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.ArrayList; diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index dd78c4f116..f5cf288471 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -1,6 +1,6 @@ package domain.strategy; -import domain.Position; +import domain.position.Position; import domain.piece.PieceProvider; import java.util.ArrayList; diff --git a/src/test/java/janggiBoard/BoardInitialTest.java b/src/test/java/janggiBoard/BoardInitialTest.java index 4609a957c0..23935ab514 100644 --- a/src/test/java/janggiBoard/BoardInitialTest.java +++ b/src/test/java/janggiBoard/BoardInitialTest.java @@ -1,7 +1,7 @@ package janggiBoard; import domain.JanggiBoard; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.*; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/janggiBoard/PieceTest/CannonTest.java b/src/test/java/janggiBoard/PieceTest/CannonTest.java index 42168d4a2a..188e7b7b6b 100644 --- a/src/test/java/janggiBoard/PieceTest/CannonTest.java +++ b/src/test/java/janggiBoard/PieceTest/CannonTest.java @@ -1,6 +1,6 @@ package janggiBoard.PieceTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.*; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/janggiBoard/PieceTest/CarTest.java b/src/test/java/janggiBoard/PieceTest/CarTest.java index c2b60138a7..e165282626 100644 --- a/src/test/java/janggiBoard/PieceTest/CarTest.java +++ b/src/test/java/janggiBoard/PieceTest/CarTest.java @@ -1,6 +1,6 @@ package janggiBoard.PieceTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.Blank; import domain.piece.Car; diff --git a/src/test/java/janggiBoard/PieceTest/ElephantTest.java b/src/test/java/janggiBoard/PieceTest/ElephantTest.java index 9ce0d0cbcc..acb0b03e18 100644 --- a/src/test/java/janggiBoard/PieceTest/ElephantTest.java +++ b/src/test/java/janggiBoard/PieceTest/ElephantTest.java @@ -1,6 +1,6 @@ package janggiBoard.PieceTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.*; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/janggiBoard/PieceTest/HorseTest.java b/src/test/java/janggiBoard/PieceTest/HorseTest.java index e905596769..c32d31ba07 100644 --- a/src/test/java/janggiBoard/PieceTest/HorseTest.java +++ b/src/test/java/janggiBoard/PieceTest/HorseTest.java @@ -1,6 +1,6 @@ package janggiBoard.PieceTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.Blank; import domain.piece.Horse; diff --git a/src/test/java/janggiBoard/PieceTest/PalaceTest.java b/src/test/java/janggiBoard/PieceTest/PalaceTest.java index b367cdd739..1165c25361 100644 --- a/src/test/java/janggiBoard/PieceTest/PalaceTest.java +++ b/src/test/java/janggiBoard/PieceTest/PalaceTest.java @@ -1,6 +1,6 @@ package janggiBoard.PieceTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.*; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java index a68d8ccde7..181083cfae 100644 --- a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java @@ -1,6 +1,6 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.Team; import domain.piece.*; import domain.strategy.CannonStrategy; diff --git a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java index bb3e805008..64997b0928 100644 --- a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java @@ -1,6 +1,6 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; diff --git a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java index dcaaa8216a..135f971006 100644 --- a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java @@ -1,6 +1,6 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; diff --git a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java index 551462fcf4..2ed72ee5c3 100644 --- a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java @@ -1,7 +1,7 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; diff --git a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java index dbc6aaf653..550344b6f7 100644 --- a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java @@ -1,6 +1,6 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; diff --git a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java index b8f823dab8..cded6de93c 100644 --- a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java @@ -1,6 +1,6 @@ package janggiBoard.strategyTest; -import domain.Position; +import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; import domain.piece.PieceProvider; From 7d09660e2c589ec7e233de3eb19bc620c79cb6fd Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 16:55:30 +0900 Subject: [PATCH 48/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=EC=9D=84=20?= =?UTF-8?q?=EC=9B=80=EC=A7=81=EC=9D=B4=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 19 ++++++++++++++----- src/main/java/controller/JanggiGame.java | 4 ---- src/main/java/domain/JanggiBoard.java | 5 +++++ src/main/java/domain/piece/Car.java | 1 + src/main/java/domain/position/Position.java | 4 +++- 5 files changed, 23 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/controller/JanggiGame.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 5b60a75ff8..f415f7526e 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,6 +1,7 @@ package controller; import domain.JanggiBoard; +import domain.piece.Piece; import domain.position.Position; import java.util.LinkedHashMap; import view.InputView; @@ -16,10 +17,18 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - Position movePosition = inputMovePosition(); - Position targetPosition = inputTargetPosition(); JanggiBoard janggiBoard = new JanggiBoard(new LinkedHashMap<>()); - outputView.printBoard(janggiBoard); + while (true) { + outputView.printBoard(janggiBoard); + Position currentPosition = inputMovePosition(); + Position targetPosition = inputTargetPosition(); + Piece currentPiece = janggiBoard.getPiece(currentPosition); + boolean movePiece = currentPiece.canMove(currentPosition, targetPosition, janggiBoard); + if (movePiece) { + janggiBoard.move(currentPosition, targetPosition, currentPiece); + outputView.printBoard(janggiBoard); + } + } } private Position inputMovePosition() { @@ -33,8 +42,8 @@ private Position inputMovePosition() { } private Position inputTargetPosition() { - String inputMovePosition = inputView.inputMovePiece(); - String[] parts = inputMovePosition.split(","); + String inputTargetPosition = inputView.inputTargetPosition(); + String[] parts = inputTargetPosition.split(","); int row = Integer.parseInt(parts[0].trim()); int column = Integer.parseInt(parts[1].trim()); diff --git a/src/main/java/controller/JanggiGame.java b/src/main/java/controller/JanggiGame.java deleted file mode 100644 index b295e33d03..0000000000 --- a/src/main/java/controller/JanggiGame.java +++ /dev/null @@ -1,4 +0,0 @@ -package controller; - -public class JanggiGame { -} diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 290fdc769b..37e4ce58e1 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -22,6 +22,11 @@ public Map getJanggiBoard() { return Collections.unmodifiableMap(janggiBoard); } + public void move(Position currentPosition, Position targetPosition, Piece currentPiece) { + janggiBoard.put(targetPosition, currentPiece); + janggiBoard.put(currentPosition, new Blank()); + } + private void initializeBoard() { for (int row = 0; row < BOARD_ROWS; row++) { for (int column = 0; column < BOARD_COLUMNS; column++) { diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java index 79451f291c..5b97299355 100644 --- a/src/main/java/domain/piece/Car.java +++ b/src/main/java/domain/piece/Car.java @@ -18,6 +18,7 @@ public Car(Team team) { @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition)) { return true; diff --git a/src/main/java/domain/position/Position.java b/src/main/java/domain/position/Position.java index f4f9c4d3f3..115706ae02 100644 --- a/src/main/java/domain/position/Position.java +++ b/src/main/java/domain/position/Position.java @@ -22,7 +22,9 @@ public int getColumns() { @Override public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; + if (o == null || getClass() != o.getClass()) { + return false; + } Position position = (Position) o; return rows == position.rows && columns == position.columns; } From 7aaadb1ffcea553a486fe9c946eba31a4461a510 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 19:54:32 +0900 Subject: [PATCH 49/68] =?UTF-8?q?refactor:=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B5=AC=EC=B2=B4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 76ca7b10bf..097c2037c1 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -6,12 +6,12 @@ public class InputView { private final Scanner sc = new Scanner(System.in); public String inputMovePiece() { - System.out.println("어떤 기물을 옮기시겠습니까?"); + System.out.println("어떤 기물을 옮기시겠습니까?(예시 : 0,0)"); return sc.nextLine(); } public String inputTargetPosition() { - System.out.println("어디로 옮기시겠습니까?"); + System.out.println("어디로 옮기시겠습니까?(예시 : 1,0)"); return sc.nextLine(); } } From 97661c686574b59ee6368b27969743cf7b1bc6a1 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 21:04:32 +0900 Subject: [PATCH 50/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=9C=EB=A0=A5=EC=9A=A9=20dto=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/PieceDTO.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/domain/PieceDTO.java diff --git a/src/main/java/domain/PieceDTO.java b/src/main/java/domain/PieceDTO.java new file mode 100644 index 0000000000..badd067c45 --- /dev/null +++ b/src/main/java/domain/PieceDTO.java @@ -0,0 +1,10 @@ +package domain; + +import domain.piece.Piece; +import domain.position.Position; + +public record PieceDTO(int row, int col, Team team) { + public static PieceDTO from(Position position, Piece piece) { + return new PieceDTO(position.getRows(), position.getColumns(), piece.getTeam()); + } +} From cfb8b7a9c0032412deae2b8e9c611f1d2e24c846 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Mon, 30 Mar 2026 21:52:17 +0900 Subject: [PATCH 51/68] =?UTF-8?q?refacor:=20=EC=9E=A5=EA=B8=B0=ED=8C=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=8B=9C=EC=A0=90=EC=97=90=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 2 +- src/main/java/domain/JanggiBoard.java | 5 +++-- src/test/java/janggiBoard/BoardInitialTest.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index f415f7526e..130545180d 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -17,7 +17,7 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - JanggiBoard janggiBoard = new JanggiBoard(new LinkedHashMap<>()); + JanggiBoard janggiBoard = new JanggiBoard(); while (true) { outputView.printBoard(janggiBoard); Position currentPosition = inputMovePosition(); diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 37e4ce58e1..673858cbf4 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -4,6 +4,7 @@ import domain.position.Position; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.Map; public class JanggiBoard implements PieceProvider { @@ -12,8 +13,8 @@ public class JanggiBoard implements PieceProvider { private final Map janggiBoard; - public JanggiBoard(Map janggiBoard) { - this.janggiBoard = janggiBoard; + public JanggiBoard() { + this.janggiBoard = new LinkedHashMap<>(); initializeBoard(); setupInitialPieces(); } diff --git a/src/test/java/janggiBoard/BoardInitialTest.java b/src/test/java/janggiBoard/BoardInitialTest.java index 23935ab514..74b50c7925 100644 --- a/src/test/java/janggiBoard/BoardInitialTest.java +++ b/src/test/java/janggiBoard/BoardInitialTest.java @@ -19,7 +19,7 @@ public class BoardInitialTest { @BeforeEach void setUp() { - janggiBoard = new JanggiBoard(new LinkedHashMap<>()); + janggiBoard = new JanggiBoard(); } @Test From c57b6f58c112f79fffae4332497c7bec0ef70ac4 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 01:14:01 +0900 Subject: [PATCH 52/68] =?UTF-8?q?refacor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=A2=8C=ED=91=9C=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 130545180d..87ded49613 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -3,7 +3,6 @@ import domain.JanggiBoard; import domain.piece.Piece; import domain.position.Position; -import java.util.LinkedHashMap; import view.InputView; import view.OutputView; @@ -20,12 +19,12 @@ public void run() { JanggiBoard janggiBoard = new JanggiBoard(); while (true) { outputView.printBoard(janggiBoard); - Position currentPosition = inputMovePosition(); - Position targetPosition = inputTargetPosition(); - Piece currentPiece = janggiBoard.getPiece(currentPosition); - boolean movePiece = currentPiece.canMove(currentPosition, targetPosition, janggiBoard); + Position from = inputMovePosition(); + Position to = inputTargetPosition(); + Piece currentPiece = janggiBoard.getPiece(from); + boolean movePiece = currentPiece.canMove(from, to, janggiBoard); if (movePiece) { - janggiBoard.move(currentPosition, targetPosition, currentPiece); + janggiBoard.move(from, to, currentPiece); outputView.printBoard(janggiBoard); } } From 9b606ac66e7d695023bb3dcf6e6ac79768512a7d Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 13:11:04 +0900 Subject: [PATCH 53/68] =?UTF-8?q?refacor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/PieceDTO.java | 2 +- src/main/java/domain/piece/Cannon.java | 7 ++++--- src/main/java/domain/position/Position.java | 20 +++++++++---------- .../java/domain/strategy/CannonStrategy.java | 8 ++++---- .../java/domain/strategy/CarStrategy.java | 4 ++-- .../domain/strategy/ElephantStrategy.java | 12 +++++------ .../java/domain/strategy/HorseStrategy.java | 8 ++++---- .../java/domain/strategy/PalaceStrategy.java | 4 ++-- .../java/domain/strategy/PawnStrategy.java | 4 ++-- 9 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/main/java/domain/PieceDTO.java b/src/main/java/domain/PieceDTO.java index badd067c45..43f7f29e7b 100644 --- a/src/main/java/domain/PieceDTO.java +++ b/src/main/java/domain/PieceDTO.java @@ -5,6 +5,6 @@ public record PieceDTO(int row, int col, Team team) { public static PieceDTO from(Position position, Piece piece) { - return new PieceDTO(position.getRows(), position.getColumns(), piece.getTeam()); + return new PieceDTO(position.getRow(), position.getColumn(), piece.getTeam()); } } diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 74d108973f..174696a28f 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -4,20 +4,21 @@ import domain.Team; import domain.strategy.CannonStrategy; +import domain.strategy.MoveStrategy; import java.util.List; public class Cannon extends Piece { - private final CannonStrategy cannonStrategy; + private final MoveStrategy moveStrategy; public Cannon(Team team) { super(team); - cannonStrategy = new CannonStrategy(); + moveStrategy = new CannonStrategy(); } @Override public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = cannonStrategy.getMoveCandidates(currentPosition, pieceProvider); + List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); for (Position candidatePosition : moveCandidates) { if (candidatePosition.equals(targetPosition)) { return true; diff --git a/src/main/java/domain/position/Position.java b/src/main/java/domain/position/Position.java index 115706ae02..ec79e5b13f 100644 --- a/src/main/java/domain/position/Position.java +++ b/src/main/java/domain/position/Position.java @@ -4,20 +4,20 @@ public class Position { - private final int rows; // 행 10 - private final int columns; //열 9 + private final int row; // 행 10 + private final int column; //열 9 public Position(int rows, int columns) { - this.rows = rows; - this.columns = columns; + this.row = rows; + this.column = columns; } - public int getRows() { - return rows; + public int getRow() { + return row; } - public int getColumns() { - return columns; + public int getColumn() { + return column; } @Override @@ -26,11 +26,11 @@ public boolean equals(Object o) { return false; } Position position = (Position) o; - return rows == position.rows && columns == position.columns; + return row == position.row && column == position.column; } @Override public int hashCode() { - return Objects.hash(rows, columns); + return Objects.hash(row, column); } } diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index 32cf96e42a..df7a72689f 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -37,8 +37,8 @@ private Position findFirstPiece(Position position, Direction direction, PiecePro } private Position getNext(Position position, Direction direction) { - int nextRows = position.getRows() + direction.getRowOffset(); - int nextColumns = position.getColumns() + direction.getColOffset(); + int nextRows = position.getRow() + direction.getRowOffset(); + int nextColumns = position.getColumn() + direction.getColOffset(); return new Position(nextRows, nextColumns); } @@ -55,7 +55,7 @@ private void collectTargets(Position bridge, Direction direction, PieceProvider } private boolean isWithinBoard(Position position) { - return position.getRows() >= 0 && position.getRows() < 10 && - position.getColumns() >= 0 && position.getColumns() < 9; + return position.getRow() >= 0 && position.getRow() < 10 && + position.getColumn() >= 0 && position.getColumn() < 9; } } diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index acfb6aa281..c340fc1f56 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -24,8 +24,8 @@ private void addPathCandidates(Position currentPosition, Direction direction, Pi Position next = currentPosition; while (true) { - int nextRows = next.getRows() + direction.getRowOffset(); - int nextColumns = next.getColumns() + direction.getColOffset(); + int nextRows = next.getRow() + direction.getRowOffset(); + int nextColumns = next.getColumn() + direction.getColOffset(); if (nextRows < 0 || nextRows >= 10 || nextColumns < 0 || nextColumns >= 9) { break; diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index 7a64ccda8e..a06786bc31 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -15,22 +15,22 @@ public List getMoveCandidates(Position currentPosition, PieceProvider for (Direction straight : straightDirections) { Position myeok1 = new Position( - currentPosition.getRows() + straight.getRowOffset(), - currentPosition.getColumns() + straight.getColOffset() + currentPosition.getRow() + straight.getRowOffset(), + currentPosition.getColumn() + straight.getColOffset() ); if (!board.isBlank(myeok1)) continue; for (Direction diag : getDiagonalsFor(straight)) { Position myeok2 = new Position( - myeok1.getRows() + diag.getRowOffset(), - myeok1.getColumns() + diag.getColOffset() + myeok1.getRow() + diag.getRowOffset(), + myeok1.getColumn() + diag.getColOffset() ); if (!board.isBlank(myeok2)) continue; - Position target = new Position(myeok2.getRows() + diag.getRowOffset(), - myeok2.getColumns() + diag.getColOffset() + Position target = new Position(myeok2.getRow() + diag.getRowOffset(), + myeok2.getColumn() + diag.getColOffset() ); candidates.add(target); } diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index c54fca1d7f..7c22a447de 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -14,15 +14,15 @@ public List getMoveCandidates(Position currentPosition, PieceProvider Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction straight : straightDirections) { - int myeokRow = currentPosition.getRows() + straight.getRowOffset(); - int myeokCol = currentPosition.getColumns() + straight.getColOffset(); + int myeokRow = currentPosition.getRow() + straight.getRowOffset(); + int myeokCol = currentPosition.getColumn() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); if (board.isBlank(myeokPosition)) { List diagonals = getDiagonalsFor(straight); for (Direction diag : diagonals) { - int targetRow = myeokPosition.getRows() + diag.getRowOffset(); - int targetCol = myeokPosition.getColumns() + diag.getColOffset(); + int targetRow = myeokPosition.getRow() + diag.getRowOffset(); + int targetCol = myeokPosition.getColumn() + diag.getColOffset(); Position targetPosition = new Position(targetRow, targetCol); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index c5605c00ab..3f1c4a85f7 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -16,8 +16,8 @@ public List getMoveCandidates(Position currentPosition, PieceProvider Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST}; for (Direction direction : directions) { - int targetRow = currentPosition.getRows() + direction.getRowOffset(); - int targetColumns = currentPosition.getColumns() + direction.getColOffset(); + int targetRow = currentPosition.getRow() + direction.getRowOffset(); + int targetColumns = currentPosition.getColumn() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index f5cf288471..0bdfa8ffb2 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -15,8 +15,8 @@ public List getMoveCandidates(Position currentPosition, PieceProvider Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : directions) { - int targetRow = currentPosition.getRows() + direction.getRowOffset(); - int targetColumns = currentPosition.getColumns() + direction.getColOffset(); + int targetRow = currentPosition.getRow() + direction.getRowOffset(); + int targetColumns = currentPosition.getColumn() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); From c3f99850af66b7bf1472d6af2880264d1baef25b Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 13:11:32 +0900 Subject: [PATCH 54/68] =?UTF-8?q?feat:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20=EB=8D=98?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 18 +++++++++++------- src/main/java/view/OutputView.java | 4 ++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 87ded49613..8509ac93e7 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -18,14 +18,18 @@ public JanggiController(InputView inputView, OutputView outputView) { public void run() { JanggiBoard janggiBoard = new JanggiBoard(); while (true) { - outputView.printBoard(janggiBoard); - Position from = inputMovePosition(); - Position to = inputTargetPosition(); - Piece currentPiece = janggiBoard.getPiece(from); - boolean movePiece = currentPiece.canMove(from, to, janggiBoard); - if (movePiece) { - janggiBoard.move(from, to, currentPiece); + try { outputView.printBoard(janggiBoard); + Position from = inputMovePosition(); + Position to = inputTargetPosition(); + Piece currentPiece = janggiBoard.getPiece(from); + boolean movePiece = currentPiece.canMove(from, to, janggiBoard); + if (movePiece) { + janggiBoard.move(from, to, currentPiece); + outputView.printBoard(janggiBoard); + } + } catch (IllegalArgumentException e) { + outputView.printErrorMessage(e); } } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index e378cc54db..db03b20735 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -30,6 +30,10 @@ private void printRow(JanggiBoard board, int row) { } } + public void printErrorMessage(IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + private String getSymbol(Piece piece) { if (piece instanceof Cannon) { From c1a1757b901f38b1e86a14350fedbe2843f4bf52 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 13:31:18 +0900 Subject: [PATCH 55/68] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=88=98=20=EC=97=86=EC=9D=84=20?= =?UTF-8?q?=EB=95=8C=20=EC=98=88=EC=99=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EB=8D=98=EC=A7=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 8509ac93e7..44d7f248ef 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -24,10 +24,11 @@ public void run() { Position to = inputTargetPosition(); Piece currentPiece = janggiBoard.getPiece(from); boolean movePiece = currentPiece.canMove(from, to, janggiBoard); - if (movePiece) { - janggiBoard.move(from, to, currentPiece); - outputView.printBoard(janggiBoard); + if (!movePiece) { + throw new IllegalArgumentException("해당 위치로 이동할 수 없는 기물입니다."); } + janggiBoard.move(from, to, currentPiece); + outputView.printBoard(janggiBoard); } catch (IllegalArgumentException e) { outputView.printErrorMessage(e); } From 1f65867421eeec8e1daf93341e273849ab15c232 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 18:03:49 +0900 Subject: [PATCH 56/68] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=EC=99=80=20=EB=AA=A9=ED=91=9C=20=EC=A2=8C=ED=91=9C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 2 +- src/main/java/domain/Index.java | 17 +++++++++++++++ src/main/java/domain/JanggiBoard.java | 21 ++++++++++++------- src/main/java/domain/JanggiGame.java | 20 ++++++++++++++++++ .../domain/{piece => }/PieceProvider.java | 3 ++- .../java/domain/{ => dto}/JanggiBoardDTO.java | 3 ++- src/main/java/domain/{ => dto}/PieceDTO.java | 3 ++- src/main/java/domain/piece/Blank.java | 3 ++- src/main/java/domain/piece/Cannon.java | 11 +++++----- src/main/java/domain/piece/Car.java | 11 +++++----- src/main/java/domain/piece/Elephant.java | 11 +++++----- src/main/java/domain/piece/Guard.java | 13 ++++++------ src/main/java/domain/piece/Horse.java | 11 +++++----- src/main/java/domain/piece/King.java | 13 ++++++------ src/main/java/domain/piece/Pawn.java | 13 ++++++------ src/main/java/domain/piece/Piece.java | 7 ++----- .../java/domain/strategy/CannonStrategy.java | 8 +++---- .../java/domain/strategy/CarStrategy.java | 8 +++---- .../domain/strategy/ElephantStrategy.java | 10 ++++----- .../java/domain/strategy/HorseStrategy.java | 12 ++++++----- .../java/domain/strategy/MoveStrategy.java | 10 --------- .../java/domain/strategy/PalaceStrategy.java | 10 ++++----- .../java/domain/strategy/PawnStrategy.java | 11 +++++----- src/main/java/domain/strategy/Strategy.java | 10 +++++++++ .../janggiBoard/PieceTest/CannonTest.java | 1 + .../java/janggiBoard/PieceTest/CarTest.java | 2 +- .../janggiBoard/PieceTest/ElephantTest.java | 1 + .../java/janggiBoard/PieceTest/HorseTest.java | 2 +- .../janggiBoard/PieceTest/PalaceTest.java | 1 + .../strategyTest/CannonStrategyTest.java | 1 + .../strategyTest/CarStrategyTest.java | 2 +- .../strategyTest/ElephantStrategyTest.java | 2 +- .../strategyTest/HorseStrategyTest.java | 2 +- .../strategyTest/PalaceStrategyTest.java | 2 +- .../strategyTest/PawnStrategyTest.java | 2 +- 35 files changed, 158 insertions(+), 101 deletions(-) create mode 100644 src/main/java/domain/Index.java create mode 100644 src/main/java/domain/JanggiGame.java rename src/main/java/domain/{piece => }/PieceProvider.java (77%) rename src/main/java/domain/{ => dto}/JanggiBoardDTO.java (89%) rename src/main/java/domain/{ => dto}/PieceDTO.java (87%) delete mode 100644 src/main/java/domain/strategy/MoveStrategy.java create mode 100644 src/main/java/domain/strategy/Strategy.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 44d7f248ef..7619dd43b5 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -23,7 +23,7 @@ public void run() { Position from = inputMovePosition(); Position to = inputTargetPosition(); Piece currentPiece = janggiBoard.getPiece(from); - boolean movePiece = currentPiece.canMove(from, to, janggiBoard); + boolean movePiece = currentPiece.canMove(from, to); if (!movePiece) { throw new IllegalArgumentException("해당 위치로 이동할 수 없는 기물입니다."); } diff --git a/src/main/java/domain/Index.java b/src/main/java/domain/Index.java new file mode 100644 index 0000000000..1754e498a0 --- /dev/null +++ b/src/main/java/domain/Index.java @@ -0,0 +1,17 @@ +package domain; + +public enum Index { + + BOARD_ROWS(10), + BOARD_COLUMNS(9); + + private final int index; + + Index(int index) { + this.index = index; + } + + public int getIndex() { + return index; + } +} diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 673858cbf4..3f0cb108ea 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -1,5 +1,8 @@ package domain; +import static domain.Index.BOARD_COLUMNS; +import static domain.Index.BOARD_ROWS; + import domain.piece.*; import domain.position.Position; @@ -8,8 +11,6 @@ import java.util.Map; public class JanggiBoard implements PieceProvider { - private static final int BOARD_ROWS = 10; - private static final int BOARD_COLUMNS = 9; private final Map janggiBoard; @@ -23,14 +24,20 @@ public Map getJanggiBoard() { return Collections.unmodifiableMap(janggiBoard); } - public void move(Position currentPosition, Position targetPosition, Piece currentPiece) { - janggiBoard.put(targetPosition, currentPiece); - janggiBoard.put(currentPosition, new Blank()); + + + public void move(Position from, Position to, Piece currentPiece) { + boolean movePiece = currentPiece.canMove(from, to, janggiBoard); + if (!movePiece) { + throw new IllegalArgumentException("해당 위치로 이동할 수 없는 기물입니다."); + } + janggiBoard.put(to, currentPiece); + janggiBoard.put(from, new Blank()); } private void initializeBoard() { - for (int row = 0; row < BOARD_ROWS; row++) { - for (int column = 0; column < BOARD_COLUMNS; column++) { + for (int row = 0; row < BOARD_ROWS.getIndex(); row++) { + for (int column = 0; column < BOARD_COLUMNS.getIndex(); column++) { janggiBoard.put(new Position(row, column), new Blank()); } } diff --git a/src/main/java/domain/JanggiGame.java b/src/main/java/domain/JanggiGame.java new file mode 100644 index 0000000000..8ac078f37a --- /dev/null +++ b/src/main/java/domain/JanggiGame.java @@ -0,0 +1,20 @@ +package domain; + +import domain.piece.Blank; +import domain.piece.Piece; +import domain.position.Position; + +public class JanggiGame { + + public void play(JanggiBoard janggiBoard, Position from, Position to) { + Piece piece = janggiBoard.getPiece(from); + validateBlank(piece); + piece.canMove(from, to); + } + + private void validateBlank(Piece piece) { + if (piece instanceof Blank) { + throw new IllegalArgumentException("해당 위치에 기물이 존재하지 않습니다."); + } + } +} diff --git a/src/main/java/domain/piece/PieceProvider.java b/src/main/java/domain/PieceProvider.java similarity index 77% rename from src/main/java/domain/piece/PieceProvider.java rename to src/main/java/domain/PieceProvider.java index 19c0b56606..606ddc20a4 100644 --- a/src/main/java/domain/piece/PieceProvider.java +++ b/src/main/java/domain/PieceProvider.java @@ -1,5 +1,6 @@ -package domain.piece; +package domain; +import domain.piece.Piece; import domain.position.Position; public interface PieceProvider { diff --git a/src/main/java/domain/JanggiBoardDTO.java b/src/main/java/domain/dto/JanggiBoardDTO.java similarity index 89% rename from src/main/java/domain/JanggiBoardDTO.java rename to src/main/java/domain/dto/JanggiBoardDTO.java index 1507430b2e..2e93cfd2b9 100644 --- a/src/main/java/domain/JanggiBoardDTO.java +++ b/src/main/java/domain/dto/JanggiBoardDTO.java @@ -1,5 +1,6 @@ -package domain; +package domain.dto; +import domain.JanggiBoard; import java.util.List; public record JanggiBoardDTO(List janggiBoardDto) { diff --git a/src/main/java/domain/PieceDTO.java b/src/main/java/domain/dto/PieceDTO.java similarity index 87% rename from src/main/java/domain/PieceDTO.java rename to src/main/java/domain/dto/PieceDTO.java index 43f7f29e7b..24d06cd18b 100644 --- a/src/main/java/domain/PieceDTO.java +++ b/src/main/java/domain/dto/PieceDTO.java @@ -1,5 +1,6 @@ -package domain; +package domain.dto; +import domain.Team; import domain.piece.Piece; import domain.position.Position; diff --git a/src/main/java/domain/piece/Blank.java b/src/main/java/domain/piece/Blank.java index 22fbf2b9b0..368b606832 100644 --- a/src/main/java/domain/piece/Blank.java +++ b/src/main/java/domain/piece/Blank.java @@ -1,5 +1,6 @@ package domain.piece; +import domain.PieceProvider; import domain.Team; import domain.position.Position; @@ -10,7 +11,7 @@ public Blank() { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { return false; } } diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 174696a28f..29ca2d7fae 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -1,15 +1,16 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.strategy.CannonStrategy; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import java.util.List; public class Cannon extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Cannon(Team team) { super(team); @@ -17,10 +18,10 @@ public Cannon(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition)) { + if (candidatePosition.equals(to)) { return true; } } diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java index 5b97299355..aa9bb09127 100644 --- a/src/main/java/domain/piece/Car.java +++ b/src/main/java/domain/piece/Car.java @@ -1,14 +1,15 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.strategy.CarStrategy; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import java.util.List; public class Car extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Car(Team team) { super(team); @@ -16,11 +17,11 @@ public Car(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition)) { + if (candidatePosition.equals(to)) { return true; } } diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index 7e9b5117ae..6b8daf9f31 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -1,14 +1,15 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.strategy.ElephantStrategy; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import java.util.List; public class Elephant extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Elephant(Team team) { super(team); @@ -16,10 +17,10 @@ public Elephant(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition)) { + if (candidatePosition.equals(to)) { return true; } } diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index c6208ce2ce..f8553714bd 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -1,14 +1,15 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import domain.strategy.PalaceStrategy; import java.util.List; public class Guard extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Guard(Team team) { super(team); @@ -16,11 +17,11 @@ public Guard(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(to); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + if (candidatePosition.equals(to) && isTargetPositionBlank) { return true; } } diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index f24298e2b6..0e96c6fa8e 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -1,15 +1,16 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.strategy.HorseStrategy; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import java.util.List; public class Horse extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Horse(Team team) { super(team); @@ -17,10 +18,10 @@ public Horse(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition)) { + if (candidatePosition.equals(to)) { return true; } } diff --git a/src/main/java/domain/piece/King.java b/src/main/java/domain/piece/King.java index d0e56d932a..0ecc53f75d 100644 --- a/src/main/java/domain/piece/King.java +++ b/src/main/java/domain/piece/King.java @@ -1,15 +1,16 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import domain.strategy.PalaceStrategy; import java.util.List; public class King extends Piece { - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public King(Team team) { super(team); @@ -17,11 +18,11 @@ public King(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(to); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + if (candidatePosition.equals(to) && isTargetPositionBlank) { return true; } } diff --git a/src/main/java/domain/piece/Pawn.java b/src/main/java/domain/piece/Pawn.java index 5f7233807e..2bc176e3da 100644 --- a/src/main/java/domain/piece/Pawn.java +++ b/src/main/java/domain/piece/Pawn.java @@ -1,14 +1,15 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; -import domain.strategy.MoveStrategy; +import domain.strategy.Strategy; import domain.strategy.PawnStrategy; import java.util.List; public class Pawn extends Piece{ - private final MoveStrategy moveStrategy; + private final Strategy moveStrategy; public Pawn(Team team) { super(team); @@ -16,11 +17,11 @@ public Pawn(Team team) { } @Override - public boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider) { - List moveCandidates = moveStrategy.getMoveCandidates(currentPosition, pieceProvider); - boolean isTargetPositionBlank = pieceProvider.isBlank(targetPosition); + public boolean canMove(Position from, Position to, PieceProvider pieceProvider) { + List moveCandidates = moveStrategy.getMoveCandidates(from, pieceProvider); + boolean isTargetPositionBlank = pieceProvider.isBlank(to); for (Position candidatePosition : moveCandidates) { - if (candidatePosition.equals(targetPosition) && isTargetPositionBlank) { + if (candidatePosition.equals(to) && isTargetPositionBlank) { return true; } } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index b68dd3af46..5d3a700174 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -1,5 +1,6 @@ package domain.piece; +import domain.PieceProvider; import domain.position.Position; import domain.Team; @@ -14,9 +15,5 @@ public Team getTeam() { return team; } - public void canMove(Position targetPosition) { - // moveStrategy.movable(); - } - - public abstract boolean canMove(Position currentPosition, Position targetPosition, PieceProvider pieceProvider); + public abstract boolean canMove(Position from, Position to, PieceProvider pieceProvider); } diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index df7a72689f..83a5ff4fcd 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -2,19 +2,19 @@ import domain.position.Position; import domain.piece.Cannon; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class CannonStrategy implements MoveStrategy{ +public class CannonStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : straightDirections) { - addCannonCandidates(currentPosition, direction, board, candidates); + addCannonCandidates(from, direction, board, candidates); } return candidates; } diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index c340fc1f56..f798680712 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -1,20 +1,20 @@ package domain.strategy; import domain.position.Position; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class CarStrategy implements MoveStrategy { +public class CarStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : straightDirections) { - addPathCandidates(currentPosition, direction, board, candidates); + addPathCandidates(from, direction, board, candidates); } return candidates; diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index a06786bc31..f3e822d7b5 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -1,22 +1,22 @@ package domain.strategy; import domain.position.Position; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class ElephantStrategy implements MoveStrategy{ +public class ElephantStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction straight : straightDirections) { Position myeok1 = new Position( - currentPosition.getRow() + straight.getRowOffset(), - currentPosition.getColumn() + straight.getColOffset() + from.getRow() + straight.getRowOffset(), + from.getColumn() + straight.getColOffset() ); if (!board.isBlank(myeok1)) continue; diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 7c22a447de..5219d1874c 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -1,23 +1,25 @@ package domain.strategy; import domain.position.Position; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class HorseStrategy implements MoveStrategy { +public class HorseStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction straight : straightDirections) { - int myeokRow = currentPosition.getRow() + straight.getRowOffset(); - int myeokCol = currentPosition.getColumn() + straight.getColOffset(); + // 1칸 직선 방향으로 가기 + int myeokRow = from.getRow() + straight.getRowOffset(); + int myeokCol = from.getColumn() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); + // 1칸 이동한 좌표가 빈 좌표인지 if (board.isBlank(myeokPosition)) { List diagonals = getDiagonalsFor(straight); for (Direction diag : diagonals) { diff --git a/src/main/java/domain/strategy/MoveStrategy.java b/src/main/java/domain/strategy/MoveStrategy.java deleted file mode 100644 index 3cf66fd198..0000000000 --- a/src/main/java/domain/strategy/MoveStrategy.java +++ /dev/null @@ -1,10 +0,0 @@ -package domain.strategy; - -import domain.position.Position; -import domain.piece.PieceProvider; - -import java.util.List; - -public interface MoveStrategy { - List getMoveCandidates(Position currentPosition, PieceProvider board); -} diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index 3f1c4a85f7..7020f2d1db 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -1,23 +1,23 @@ package domain.strategy; import domain.position.Position; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class PalaceStrategy implements MoveStrategy { +public class PalaceStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST, Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST}; for (Direction direction : directions) { - int targetRow = currentPosition.getRow() + direction.getRowOffset(); - int targetColumns = currentPosition.getColumn() + direction.getColOffset(); + int targetRow = from.getRow() + direction.getRowOffset(); + int targetColumns = from.getColumn() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index 0bdfa8ffb2..678896a291 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -1,22 +1,21 @@ package domain.strategy; import domain.position.Position; -import domain.piece.PieceProvider; +import domain.PieceProvider; import java.util.ArrayList; import java.util.List; -public class PawnStrategy implements MoveStrategy { +public class PawnStrategy implements Strategy { @Override - public List getMoveCandidates(Position currentPosition, PieceProvider board) { + public List getMoveCandidates(Position from) { List candidates = new ArrayList<>(); - Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : directions) { - int targetRow = currentPosition.getRow() + direction.getRowOffset(); - int targetColumns = currentPosition.getColumn() + direction.getColOffset(); + int targetRow = from.getRow() + direction.getRowOffset(); + int targetColumns = from.getColumn() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/Strategy.java b/src/main/java/domain/strategy/Strategy.java new file mode 100644 index 0000000000..e7bedf6f11 --- /dev/null +++ b/src/main/java/domain/strategy/Strategy.java @@ -0,0 +1,10 @@ +package domain.strategy; + +import domain.position.Position; +import domain.PieceProvider; + +import java.util.List; + +public interface Strategy { + List getMoveCandidates(Position from, PieceProvider board); +} diff --git a/src/test/java/janggiBoard/PieceTest/CannonTest.java b/src/test/java/janggiBoard/PieceTest/CannonTest.java index 188e7b7b6b..b6e3b3ba18 100644 --- a/src/test/java/janggiBoard/PieceTest/CannonTest.java +++ b/src/test/java/janggiBoard/PieceTest/CannonTest.java @@ -1,5 +1,6 @@ package janggiBoard.PieceTest; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.piece.*; diff --git a/src/test/java/janggiBoard/PieceTest/CarTest.java b/src/test/java/janggiBoard/PieceTest/CarTest.java index e165282626..813dc00bbe 100644 --- a/src/test/java/janggiBoard/PieceTest/CarTest.java +++ b/src/test/java/janggiBoard/PieceTest/CarTest.java @@ -5,7 +5,7 @@ import domain.piece.Blank; import domain.piece.Car; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/PieceTest/ElephantTest.java b/src/test/java/janggiBoard/PieceTest/ElephantTest.java index acb0b03e18..b2fd6beb86 100644 --- a/src/test/java/janggiBoard/PieceTest/ElephantTest.java +++ b/src/test/java/janggiBoard/PieceTest/ElephantTest.java @@ -1,5 +1,6 @@ package janggiBoard.PieceTest; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.piece.*; diff --git a/src/test/java/janggiBoard/PieceTest/HorseTest.java b/src/test/java/janggiBoard/PieceTest/HorseTest.java index c32d31ba07..5f4d763c58 100644 --- a/src/test/java/janggiBoard/PieceTest/HorseTest.java +++ b/src/test/java/janggiBoard/PieceTest/HorseTest.java @@ -5,7 +5,7 @@ import domain.piece.Blank; import domain.piece.Horse; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/PieceTest/PalaceTest.java b/src/test/java/janggiBoard/PieceTest/PalaceTest.java index 1165c25361..ed3cfc5489 100644 --- a/src/test/java/janggiBoard/PieceTest/PalaceTest.java +++ b/src/test/java/janggiBoard/PieceTest/PalaceTest.java @@ -1,5 +1,6 @@ package janggiBoard.PieceTest; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.piece.*; diff --git a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java index 181083cfae..e49131834f 100644 --- a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java @@ -1,5 +1,6 @@ package janggiBoard.strategyTest; +import domain.PieceProvider; import domain.position.Position; import domain.Team; import domain.piece.*; diff --git a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java index 64997b0928..a47090b87d 100644 --- a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java @@ -3,7 +3,7 @@ import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import domain.strategy.CarStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java index 135f971006..fe0f9dfe57 100644 --- a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java @@ -3,7 +3,7 @@ import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import domain.strategy.ElephantStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java index 2ed72ee5c3..4a66689b9d 100644 --- a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java @@ -4,7 +4,7 @@ import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import domain.strategy.HorseStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java index 550344b6f7..7e4261cb36 100644 --- a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java @@ -3,7 +3,7 @@ import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import domain.strategy.PalaceStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java index cded6de93c..46ba6c5ef9 100644 --- a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java +++ b/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java @@ -3,7 +3,7 @@ import domain.position.Position; import domain.piece.Blank; import domain.piece.Piece; -import domain.piece.PieceProvider; +import domain.PieceProvider; import domain.strategy.PawnStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 6ea82e95e609672f24a0604fa276c7aadb35f63c Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 18:11:19 +0900 Subject: [PATCH 57/68] =?UTF-8?q?refactor:=20=EC=9E=AC=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=9E=A5=EA=B8=B0=20=ED=96=89,=EC=97=B4?= =?UTF-8?q?=20=ED=81=AC=EA=B8=B0=EB=A5=BC=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/strategy/CannonStrategy.java | 10 +++++++--- src/main/java/domain/strategy/CarStrategy.java | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index 83a5ff4fcd..3c2ff123f8 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -1,5 +1,9 @@ package domain.strategy; +import static domain.Index.BOARD_COLUMNS; +import static domain.Index.BOARD_ROWS; + +import domain.Index; import domain.position.Position; import domain.piece.Cannon; import domain.PieceProvider; @@ -10,7 +14,7 @@ public class CannonStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : straightDirections) { @@ -55,7 +59,7 @@ private void collectTargets(Position bridge, Direction direction, PieceProvider } private boolean isWithinBoard(Position position) { - return position.getRow() >= 0 && position.getRow() < 10 && - position.getColumn() >= 0 && position.getColumn() < 9; + return position.getRow() >= 0 && position.getRow() < BOARD_ROWS.getIndex() && + position.getColumn() >= 0 && position.getColumn() < BOARD_COLUMNS.getIndex(); } } diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index f798680712..fd469fff0e 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -1,5 +1,8 @@ package domain.strategy; +import static domain.Index.BOARD_COLUMNS; +import static domain.Index.BOARD_ROWS; + import domain.position.Position; import domain.PieceProvider; @@ -9,7 +12,7 @@ public class CarStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; @@ -27,7 +30,7 @@ private void addPathCandidates(Position currentPosition, Direction direction, Pi int nextRows = next.getRow() + direction.getRowOffset(); int nextColumns = next.getColumn() + direction.getColOffset(); - if (nextRows < 0 || nextRows >= 10 || nextColumns < 0 || nextColumns >= 9) { + if (nextRows < 0 || nextRows >= BOARD_ROWS.getIndex() || nextColumns < 0 || nextColumns >= BOARD_COLUMNS.getIndex()) { break; } From 1c04fbb2fa5ae2e95357736da478b337d0939c69 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 21:11:49 +0900 Subject: [PATCH 58/68] =?UTF-8?q?feat:=20=ED=96=89,=20=EC=97=B4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=ED=91=9C=EC=8B=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 4 ++-- src/main/java/domain/JanggiBoard.java | 4 ---- src/main/java/domain/strategy/Strategy.java | 8 ++++++++ src/main/java/view/OutputView.java | 10 ++++++++++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 7619dd43b5..4900c67e7c 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -23,9 +23,9 @@ public void run() { Position from = inputMovePosition(); Position to = inputTargetPosition(); Piece currentPiece = janggiBoard.getPiece(from); - boolean movePiece = currentPiece.canMove(from, to); + boolean movePiece = currentPiece.canMove(from, to, janggiBoard); if (!movePiece) { - throw new IllegalArgumentException("해당 위치로 이동할 수 없는 기물입니다."); + throw new IllegalArgumentException("[ERROR] 해당 위치로 이동할 수 없는 기물입니다."); } janggiBoard.move(from, to, currentPiece); outputView.printBoard(janggiBoard); diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index 3f0cb108ea..f1e32194cc 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -27,10 +27,6 @@ public Map getJanggiBoard() { public void move(Position from, Position to, Piece currentPiece) { - boolean movePiece = currentPiece.canMove(from, to, janggiBoard); - if (!movePiece) { - throw new IllegalArgumentException("해당 위치로 이동할 수 없는 기물입니다."); - } janggiBoard.put(to, currentPiece); janggiBoard.put(from, new Blank()); } diff --git a/src/main/java/domain/strategy/Strategy.java b/src/main/java/domain/strategy/Strategy.java index e7bedf6f11..42c09e3b65 100644 --- a/src/main/java/domain/strategy/Strategy.java +++ b/src/main/java/domain/strategy/Strategy.java @@ -1,5 +1,7 @@ package domain.strategy; +import domain.piece.Blank; +import domain.piece.Piece; import domain.position.Position; import domain.PieceProvider; @@ -7,4 +9,10 @@ public interface Strategy { List getMoveCandidates(Position from, PieceProvider board); + + private void validateBlank(Piece piece) { + if (piece instanceof Blank) { + throw new IllegalArgumentException("해당 위치에 기물이 존재하지 않습니다."); + } + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index db03b20735..e3e487554b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -16,12 +16,22 @@ public class OutputView { private static final int BOARD_COLUMNS = 9; public void printBoard(JanggiBoard board) { + printColumnIndices(); for (int row = 0; row < BOARD_ROWS; row++) { + System.out.printf("%2d ", row); printRow(board, row); System.out.println(); } } + private void printColumnIndices() { + System.out.print(" "); + for (int col = 0; col < BOARD_COLUMNS; col++) { + System.out.print(col + "."); + } + System.out.println(); + } + private void printRow(JanggiBoard board, int row) { for (int col = 0; col < BOARD_COLUMNS; col++) { Position position = new Position(row, col); From 80dc8b07e661d5ea76cf6e0d04e8a5448ccb578a Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Wed, 1 Apr 2026 21:12:39 +0900 Subject: [PATCH 59/68] =?UTF-8?q?refactor:=20PieceProvider=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/JanggiGame.java | 6 +++--- src/main/java/domain/position/Position.java | 6 +++--- src/main/java/domain/strategy/ElephantStrategy.java | 2 +- src/main/java/domain/strategy/HorseStrategy.java | 3 +-- src/main/java/domain/strategy/PalaceStrategy.java | 2 +- src/main/java/domain/strategy/PawnStrategy.java | 2 +- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/JanggiGame.java b/src/main/java/domain/JanggiGame.java index 8ac078f37a..1431776603 100644 --- a/src/main/java/domain/JanggiGame.java +++ b/src/main/java/domain/JanggiGame.java @@ -6,13 +6,13 @@ public class JanggiGame { - public void play(JanggiBoard janggiBoard, Position from, Position to) { + public void play(Position from, Position to, PieceProvider janggiBoard) { Piece piece = janggiBoard.getPiece(from); validateBlank(piece); - piece.canMove(from, to); + piece.canMove(from, to, janggiBoard); } - private void validateBlank(Piece piece) { + private void validateBlank(Piece piece) { if (piece instanceof Blank) { throw new IllegalArgumentException("해당 위치에 기물이 존재하지 않습니다."); } diff --git a/src/main/java/domain/position/Position.java b/src/main/java/domain/position/Position.java index ec79e5b13f..b677b7f494 100644 --- a/src/main/java/domain/position/Position.java +++ b/src/main/java/domain/position/Position.java @@ -7,9 +7,9 @@ public class Position { private final int row; // 행 10 private final int column; //열 9 - public Position(int rows, int columns) { - this.row = rows; - this.column = columns; + public Position(int row, int column) { + this.row = row; + this.column = column; } public int getRow() { diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index f3e822d7b5..21418aa013 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -9,7 +9,7 @@ public class ElephantStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index 5219d1874c..dddb16ba18 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -8,7 +8,7 @@ public class HorseStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; @@ -19,7 +19,6 @@ public List getMoveCandidates(Position from) { int myeokCol = from.getColumn() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); - // 1칸 이동한 좌표가 빈 좌표인지 if (board.isBlank(myeokPosition)) { List diagonals = getDiagonalsFor(straight); for (Direction diag : diagonals) { diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index 7020f2d1db..ceaaa407c4 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -9,7 +9,7 @@ public class PalaceStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST, diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index 678896a291..4ca16828e4 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -9,7 +9,7 @@ public class PawnStrategy implements Strategy { @Override - public List getMoveCandidates(Position from) { + public List getMoveCandidates(Position from, PieceProvider board) { List candidates = new ArrayList<>(); Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; From 08384f85723fb8decc9df1cdac22cacd4e6b3da9 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Thu, 2 Apr 2026 13:26:52 +0900 Subject: [PATCH 60/68] =?UTF-8?q?refactor:=20=EC=A2=8C=ED=91=9C=EB=A5=BC?= =?UTF-8?q?=20record=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/position/Position.java | 34 +++---------------- .../java/domain/strategy/CannonStrategy.java | 8 ++--- .../java/domain/strategy/CarStrategy.java | 4 +-- .../domain/strategy/ElephantStrategy.java | 12 +++---- .../java/domain/strategy/HorseStrategy.java | 8 ++--- .../java/domain/strategy/PalaceStrategy.java | 4 +-- .../java/domain/strategy/PawnStrategy.java | 4 +-- 7 files changed, 24 insertions(+), 50 deletions(-) diff --git a/src/main/java/domain/position/Position.java b/src/main/java/domain/position/Position.java index b677b7f494..6b6aa3c7d7 100644 --- a/src/main/java/domain/position/Position.java +++ b/src/main/java/domain/position/Position.java @@ -1,36 +1,10 @@ package domain.position; -import java.util.Objects; +public record Position(int row, int col) { -public class Position { - - private final int row; // 행 10 - private final int column; //열 9 - - public Position(int row, int column) { - this.row = row; - this.column = column; - } - - public int getRow() { - return row; - } - - public int getColumn() { - return column; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) { - return false; + public Position { + if (row < 0 || col < 0) { + throw new IllegalArgumentException("좌표는 음수일 수 없습니다."); } - Position position = (Position) o; - return row == position.row && column == position.column; - } - - @Override - public int hashCode() { - return Objects.hash(row, column); } } diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index 3c2ff123f8..b210802373 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -41,8 +41,8 @@ private Position findFirstPiece(Position position, Direction direction, PiecePro } private Position getNext(Position position, Direction direction) { - int nextRows = position.getRow() + direction.getRowOffset(); - int nextColumns = position.getColumn() + direction.getColOffset(); + int nextRows = position.row() + direction.getRowOffset(); + int nextColumns = position.col() + direction.getColOffset(); return new Position(nextRows, nextColumns); } @@ -59,7 +59,7 @@ private void collectTargets(Position bridge, Direction direction, PieceProvider } private boolean isWithinBoard(Position position) { - return position.getRow() >= 0 && position.getRow() < BOARD_ROWS.getIndex() && - position.getColumn() >= 0 && position.getColumn() < BOARD_COLUMNS.getIndex(); + return position.row() >= 0 && position.row() < BOARD_ROWS.getIndex() && + position.col() >= 0 && position.col() < BOARD_COLUMNS.getIndex(); } } diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index fd469fff0e..3961161e10 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -27,8 +27,8 @@ private void addPathCandidates(Position currentPosition, Direction direction, Pi Position next = currentPosition; while (true) { - int nextRows = next.getRow() + direction.getRowOffset(); - int nextColumns = next.getColumn() + direction.getColOffset(); + int nextRows = next.row() + direction.getRowOffset(); + int nextColumns = next.col() + direction.getColOffset(); if (nextRows < 0 || nextRows >= BOARD_ROWS.getIndex() || nextColumns < 0 || nextColumns >= BOARD_COLUMNS.getIndex()) { break; diff --git a/src/main/java/domain/strategy/ElephantStrategy.java b/src/main/java/domain/strategy/ElephantStrategy.java index 21418aa013..6189df189d 100644 --- a/src/main/java/domain/strategy/ElephantStrategy.java +++ b/src/main/java/domain/strategy/ElephantStrategy.java @@ -15,22 +15,22 @@ public List getMoveCandidates(Position from, PieceProvider board) { for (Direction straight : straightDirections) { Position myeok1 = new Position( - from.getRow() + straight.getRowOffset(), - from.getColumn() + straight.getColOffset() + from.row() + straight.getRowOffset(), + from.col() + straight.getColOffset() ); if (!board.isBlank(myeok1)) continue; for (Direction diag : getDiagonalsFor(straight)) { Position myeok2 = new Position( - myeok1.getRow() + diag.getRowOffset(), - myeok1.getColumn() + diag.getColOffset() + myeok1.row() + diag.getRowOffset(), + myeok1.col() + diag.getColOffset() ); if (!board.isBlank(myeok2)) continue; - Position target = new Position(myeok2.getRow() + diag.getRowOffset(), - myeok2.getColumn() + diag.getColOffset() + Position target = new Position(myeok2.row() + diag.getRowOffset(), + myeok2.col() + diag.getColOffset() ); candidates.add(target); } diff --git a/src/main/java/domain/strategy/HorseStrategy.java b/src/main/java/domain/strategy/HorseStrategy.java index dddb16ba18..b6bdd56841 100644 --- a/src/main/java/domain/strategy/HorseStrategy.java +++ b/src/main/java/domain/strategy/HorseStrategy.java @@ -15,15 +15,15 @@ public List getMoveCandidates(Position from, PieceProvider board) { for (Direction straight : straightDirections) { // 1칸 직선 방향으로 가기 - int myeokRow = from.getRow() + straight.getRowOffset(); - int myeokCol = from.getColumn() + straight.getColOffset(); + int myeokRow = from.row() + straight.getRowOffset(); + int myeokCol = from.col() + straight.getColOffset(); Position myeokPosition = new Position(myeokRow, myeokCol); if (board.isBlank(myeokPosition)) { List diagonals = getDiagonalsFor(straight); for (Direction diag : diagonals) { - int targetRow = myeokPosition.getRow() + diag.getRowOffset(); - int targetCol = myeokPosition.getColumn() + diag.getColOffset(); + int targetRow = myeokPosition.row() + diag.getRowOffset(); + int targetCol = myeokPosition.col() + diag.getColOffset(); Position targetPosition = new Position(targetRow, targetCol); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/PalaceStrategy.java b/src/main/java/domain/strategy/PalaceStrategy.java index ceaaa407c4..9be702b749 100644 --- a/src/main/java/domain/strategy/PalaceStrategy.java +++ b/src/main/java/domain/strategy/PalaceStrategy.java @@ -16,8 +16,8 @@ public List getMoveCandidates(Position from, PieceProvider board) { Direction.NORTH_EAST, Direction.NORTH_WEST, Direction.SOUTH_EAST, Direction.SOUTH_WEST}; for (Direction direction : directions) { - int targetRow = from.getRow() + direction.getRowOffset(); - int targetColumns = from.getColumn() + direction.getColOffset(); + int targetRow = from.row() + direction.getRowOffset(); + int targetColumns = from.col() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); diff --git a/src/main/java/domain/strategy/PawnStrategy.java b/src/main/java/domain/strategy/PawnStrategy.java index 4ca16828e4..3733c1e4b4 100644 --- a/src/main/java/domain/strategy/PawnStrategy.java +++ b/src/main/java/domain/strategy/PawnStrategy.java @@ -14,8 +14,8 @@ public List getMoveCandidates(Position from, PieceProvider board) { Direction[] directions = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; for (Direction direction : directions) { - int targetRow = from.getRow() + direction.getRowOffset(); - int targetColumns = from.getColumn() + direction.getColOffset(); + int targetRow = from.row() + direction.getRowOffset(); + int targetColumns = from.col() + direction.getColOffset(); Position targetPosition = new Position(targetRow, targetColumns); candidates.add(targetPosition); From 6e50fb81928904a7adbc7eaf6a4aade16476053a Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Thu, 2 Apr 2026 18:01:15 +0900 Subject: [PATCH 61/68] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=AC=BC=EB=B3=84?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20=EC=A0=84=EB=9E=B5=EC=9D=84=20Piece=20?= =?UTF-8?q?=EB=B6=80=EB=AA=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/Blank.java | 2 +- src/main/java/domain/piece/Cannon.java | 5 +---- src/main/java/domain/piece/Car.java | 4 +--- src/main/java/domain/piece/Elephant.java | 4 +--- src/main/java/domain/piece/Guard.java | 4 +--- src/main/java/domain/piece/Horse.java | 5 +---- src/main/java/domain/piece/King.java | 5 +---- src/main/java/domain/piece/Pawn.java | 4 +--- src/main/java/domain/piece/Piece.java | 10 +++++++++- 9 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/main/java/domain/piece/Blank.java b/src/main/java/domain/piece/Blank.java index 368b606832..8949fcbff8 100644 --- a/src/main/java/domain/piece/Blank.java +++ b/src/main/java/domain/piece/Blank.java @@ -7,7 +7,7 @@ public class Blank extends Piece { public Blank() { - super(Team.NONE); + super(Team.NONE,); } @Override diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 29ca2d7fae..fd616c9960 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -10,11 +10,8 @@ public class Cannon extends Piece { - private final Strategy moveStrategy; - public Cannon(Team team) { - super(team); - moveStrategy = new CannonStrategy(); + super(team, new CannonStrategy()); } @Override diff --git a/src/main/java/domain/piece/Car.java b/src/main/java/domain/piece/Car.java index aa9bb09127..2229cd2a64 100644 --- a/src/main/java/domain/piece/Car.java +++ b/src/main/java/domain/piece/Car.java @@ -9,11 +9,9 @@ import java.util.List; public class Car extends Piece { - private final Strategy moveStrategy; public Car(Team team) { - super(team); - this.moveStrategy = new CarStrategy(); + super(team, new CarStrategy()); } @Override diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index 6b8daf9f31..195abe0367 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -9,11 +9,9 @@ import java.util.List; public class Elephant extends Piece { - private final Strategy moveStrategy; public Elephant(Team team) { - super(team); - this.moveStrategy = new ElephantStrategy(); + super(team, new ElephantStrategy()); } @Override diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index f8553714bd..a3112b5c4b 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -9,11 +9,9 @@ import java.util.List; public class Guard extends Piece { - private final Strategy moveStrategy; public Guard(Team team) { - super(team); - this.moveStrategy = new PalaceStrategy(); + super(team, new PalaceStrategy()); } @Override diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index 0e96c6fa8e..93be3fedcf 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -10,11 +10,8 @@ public class Horse extends Piece { - private final Strategy moveStrategy; - public Horse(Team team) { - super(team); - this.moveStrategy = new HorseStrategy(); + super(team, new HorseStrategy()); } @Override diff --git a/src/main/java/domain/piece/King.java b/src/main/java/domain/piece/King.java index 0ecc53f75d..43b825aeb6 100644 --- a/src/main/java/domain/piece/King.java +++ b/src/main/java/domain/piece/King.java @@ -10,11 +10,8 @@ public class King extends Piece { - private final Strategy moveStrategy; - public King(Team team) { - super(team); - this.moveStrategy = new PalaceStrategy(); + super(team, new PalaceStrategy()); } @Override diff --git a/src/main/java/domain/piece/Pawn.java b/src/main/java/domain/piece/Pawn.java index 2bc176e3da..9ea7eae619 100644 --- a/src/main/java/domain/piece/Pawn.java +++ b/src/main/java/domain/piece/Pawn.java @@ -9,11 +9,9 @@ import java.util.List; public class Pawn extends Piece{ - private final Strategy moveStrategy; public Pawn(Team team) { - super(team); - this.moveStrategy = new PawnStrategy(); + super(team, new PawnStrategy()); } @Override diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 5d3a700174..9f00dc2369 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -3,12 +3,16 @@ import domain.PieceProvider; import domain.position.Position; import domain.Team; +import domain.strategy.Strategy; +import java.util.List; public abstract class Piece { private final Team team; + protected final Strategy moveStrategy; - public Piece(Team team) { + public Piece(Team team, final Strategy moveStrategy) { this.team = team; + this.moveStrategy = moveStrategy; } public Team getTeam() { @@ -16,4 +20,8 @@ public Team getTeam() { } public abstract boolean canMove(Position from, Position to, PieceProvider pieceProvider); + + public List getMoveCandidates(Position from, PieceProvider board) { + return moveStrategy.getMoveCandidates(from, board); + } } From 5cb1905e74b3fdf25cb5255eda69da3b83a431c6 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Thu, 2 Apr 2026 19:07:15 +0900 Subject: [PATCH 62/68] =?UTF-8?q?feat:=20=EB=B9=88=20=EA=B8=B0=EB=AC=BC?= =?UTF-8?q?=EC=97=90=20=EC=A3=BC=EC=9E=85=ED=95=A0=20=EB=B9=88=20=EC=A0=84?= =?UTF-8?q?=EB=9E=B5=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/Blank.java | 3 ++- src/main/java/domain/strategy/NoStrategy.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/main/java/domain/strategy/NoStrategy.java diff --git a/src/main/java/domain/piece/Blank.java b/src/main/java/domain/piece/Blank.java index 8949fcbff8..f95bc9186e 100644 --- a/src/main/java/domain/piece/Blank.java +++ b/src/main/java/domain/piece/Blank.java @@ -3,11 +3,12 @@ import domain.PieceProvider; import domain.Team; import domain.position.Position; +import domain.strategy.NoStrategy; public class Blank extends Piece { public Blank() { - super(Team.NONE,); + super(Team.NONE, new NoStrategy()); } @Override diff --git a/src/main/java/domain/strategy/NoStrategy.java b/src/main/java/domain/strategy/NoStrategy.java new file mode 100644 index 0000000000..8b2a334b3f --- /dev/null +++ b/src/main/java/domain/strategy/NoStrategy.java @@ -0,0 +1,13 @@ +package domain.strategy; + +import domain.PieceProvider; +import domain.position.Position; +import java.util.List; + +public class NoStrategy implements Strategy { + + @Override + public List getMoveCandidates(Position from, PieceProvider board) { + throw new IllegalArgumentException("빈 칸은 이동할 수 없습니다."); + } +} From 4900b7c8ebf32622cdbffa194b48d5843e86af4c Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Thu, 2 Apr 2026 19:34:04 +0900 Subject: [PATCH 63/68] =?UTF-8?q?refactor:=20PieceProvider=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=ED=8F=AC=EC=9D=B8=EC=A7=80=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/PieceProvider.java | 1 + src/main/java/domain/strategy/CannonStrategy.java | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/domain/PieceProvider.java b/src/main/java/domain/PieceProvider.java index 606ddc20a4..d087caa2f2 100644 --- a/src/main/java/domain/PieceProvider.java +++ b/src/main/java/domain/PieceProvider.java @@ -5,5 +5,6 @@ public interface PieceProvider { boolean isBlank(Position position); + boolean isCannon(Position position); Piece getPiece(Position position); } diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index b210802373..4c789b9c50 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -3,9 +3,7 @@ import static domain.Index.BOARD_COLUMNS; import static domain.Index.BOARD_ROWS; -import domain.Index; import domain.position.Position; -import domain.piece.Cannon; import domain.PieceProvider; import java.util.ArrayList; @@ -25,8 +23,8 @@ public List getMoveCandidates(Position from, PieceProvider board) { private void addCannonCandidates(Position currentPosition, Direction direction, PieceProvider board, List candidatesPosition) { Position bridge = findFirstPiece(currentPosition, direction, board); - boolean isInstanceOfCannon = board.getPiece(bridge) instanceof Cannon; - if (!isWithinBoard(bridge) || isInstanceOfCannon) { + boolean isCannon = board.isCannon(bridge); + if (!isWithinBoard(bridge) || isCannon) { return; } collectTargets(bridge, direction, board, candidatesPosition); @@ -52,8 +50,8 @@ private void collectTargets(Position bridge, Direction direction, PieceProvider candidates.add(target); target = getNext(target, direction); } - boolean isInstanceOfCannon = board.getPiece(target) instanceof Cannon; - if (isWithinBoard(target) && !isInstanceOfCannon) { + boolean isCannon = board.isCannon(target); + if (isWithinBoard(target) && !isCannon) { candidates.add(target); } } From be256721c2185d147b831d3eea2bec57b0ba6cd2 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Fri, 3 Apr 2026 02:49:10 +0900 Subject: [PATCH 64/68] =?UTF-8?q?refactor:=20=EA=B0=80=EB=B3=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A3=BC=EC=9E=85=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20stream=20=ED=99=9C=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/strategy/CannonStrategy.java | 27 ++++++++++++------- .../java/domain/strategy/CarStrategy.java | 24 ++++++++++------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main/java/domain/strategy/CannonStrategy.java b/src/main/java/domain/strategy/CannonStrategy.java index 4c789b9c50..07f16e4cca 100644 --- a/src/main/java/domain/strategy/CannonStrategy.java +++ b/src/main/java/domain/strategy/CannonStrategy.java @@ -7,27 +7,31 @@ import domain.PieceProvider; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class CannonStrategy implements Strategy { @Override public List getMoveCandidates(Position from, PieceProvider board) { - List candidates = new ArrayList<>(); Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; - for (Direction direction : straightDirections) { - addCannonCandidates(from, direction, board, candidates); - } - return candidates; + + return Arrays.stream(straightDirections) + .flatMap(direction -> addCannonCandidates(from, direction, board).stream()) + .collect(Collectors.toList()); } - private void addCannonCandidates(Position currentPosition, Direction direction, PieceProvider board, List candidatesPosition) { + private List addCannonCandidates(Position currentPosition, Direction direction, PieceProvider board) { Position bridge = findFirstPiece(currentPosition, direction, board); boolean isCannon = board.isCannon(bridge); + if (!isWithinBoard(bridge) || isCannon) { - return; + return Collections.emptyList(); } - collectTargets(bridge, direction, board, candidatesPosition); + + return collectTargets(bridge, direction, board); } private Position findFirstPiece(Position position, Direction direction, PieceProvider board) { @@ -44,16 +48,21 @@ private Position getNext(Position position, Direction direction) { return new Position(nextRows, nextColumns); } - private void collectTargets(Position bridge, Direction direction, PieceProvider board, List candidates) { + private List collectTargets(Position bridge, Direction direction, PieceProvider board) { + List candidates = new ArrayList<>(); Position target = getNext(bridge, direction); + while (isWithinBoard(target) && board.isBlank(target)) { candidates.add(target); target = getNext(target, direction); } + boolean isCannon = board.isCannon(target); if (isWithinBoard(target) && !isCannon) { candidates.add(target); } + + return candidates; } private boolean isWithinBoard(Position position) { diff --git a/src/main/java/domain/strategy/CarStrategy.java b/src/main/java/domain/strategy/CarStrategy.java index 3961161e10..78047ca6f6 100644 --- a/src/main/java/domain/strategy/CarStrategy.java +++ b/src/main/java/domain/strategy/CarStrategy.java @@ -7,40 +7,44 @@ import domain.PieceProvider; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class CarStrategy implements Strategy { @Override public List getMoveCandidates(Position from, PieceProvider board) { - List candidates = new ArrayList<>(); - Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; - for (Direction direction : straightDirections) { - addPathCandidates(from, direction, board, candidates); - } + Direction[] straightDirections = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; - return candidates; + return Arrays.stream(Direction.values()) // 모든 방향 혹은 특정 방향 배열 + .flatMap(direction -> addPathCandidates(from, direction, board).stream()) + .collect(Collectors.toList()); } - private void addPathCandidates(Position currentPosition, Direction direction, PieceProvider board, List candidatePositions) { + private List addPathCandidates(Position currentPosition, Direction direction, PieceProvider board) { + List candidates = new ArrayList<>(); Position next = currentPosition; while (true) { int nextRows = next.row() + direction.getRowOffset(); int nextColumns = next.col() + direction.getColOffset(); - if (nextRows < 0 || nextRows >= BOARD_ROWS.getIndex() || nextColumns < 0 || nextColumns >= BOARD_COLUMNS.getIndex()) { + if (nextRows < 0 || nextRows >= BOARD_ROWS.getIndex() || nextColumns < 0 + || nextColumns >= BOARD_COLUMNS.getIndex()) { break; } next = new Position(nextRows, nextColumns); if (board.isBlank(next)) { - candidatePositions.add(next); + candidates.add(next); continue; } - candidatePositions.add(next); + candidates.add(next); break; } + + return candidates; } } From 63bde1a04b2f4a4ee73a882d319424f717c8a457 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Fri, 3 Apr 2026 02:49:39 +0900 Subject: [PATCH 65/68] =?UTF-8?q?feat:=20=ED=8F=AC=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/JanggiBoard.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index f1e32194cc..dbfe61338f 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -74,6 +74,12 @@ public boolean isBlank(Position position) { return piece instanceof Blank; } + @Override + public boolean isCannon(Position position) { + Piece piece = janggiBoard.get(position); + return piece instanceof Cannon; + } + @Override public Piece getPiece(Position position) { return janggiBoard.get(position); From faa43c43b467a53b5d8eb1b4877040e4c48fa89e Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Fri, 3 Apr 2026 02:49:52 +0900 Subject: [PATCH 66/68] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/strategy/Strategy.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/domain/strategy/Strategy.java b/src/main/java/domain/strategy/Strategy.java index 42c09e3b65..090261e0e5 100644 --- a/src/main/java/domain/strategy/Strategy.java +++ b/src/main/java/domain/strategy/Strategy.java @@ -9,10 +9,4 @@ public interface Strategy { List getMoveCandidates(Position from, PieceProvider board); - - private void validateBlank(Piece piece) { - if (piece instanceof Blank) { - throw new IllegalArgumentException("해당 위치에 기물이 존재하지 않습니다."); - } - } } From 1131fdccef7b82f233788b505d5afe50df61bbc3 Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Fri, 3 Apr 2026 02:50:33 +0900 Subject: [PATCH 67/68] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=AC=BC=EC=9D=98?= =?UTF-8?q?=20=EC=A2=8C=ED=91=9C=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/dto/PieceDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/dto/PieceDTO.java b/src/main/java/domain/dto/PieceDTO.java index 24d06cd18b..9f891e6d5b 100644 --- a/src/main/java/domain/dto/PieceDTO.java +++ b/src/main/java/domain/dto/PieceDTO.java @@ -6,6 +6,6 @@ public record PieceDTO(int row, int col, Team team) { public static PieceDTO from(Position position, Piece piece) { - return new PieceDTO(position.getRow(), position.getColumn(), piece.getTeam()); + return new PieceDTO(position.row(), position.col(), piece.getTeam()); } } From e2934295ad77f19035ea898414f3af7b1af8b19e Mon Sep 17 00:00:00 2001 From: kcnsmoothie Date: Fri, 3 Apr 2026 03:30:26 +0900 Subject: [PATCH 68/68] =?UTF-8?q?refactor:=20=EC=9E=A5=EA=B8=B0=ED=8C=90?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=A5=EA=B8=B0=ED=8C=90=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=EB=90=9C=20=EA=B8=B0=EB=AC=BC=20=EB=B0=B0=EC=B9=98?= =?UTF-8?q?=EB=A5=BC=20=EC=A3=BC=EC=9E=85=EB=B0=9B=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 3 +- src/main/java/domain/JanggiBoard.java | 45 +------------- .../java/domain/JanggiBoardInitializer.java | 60 +++++++++++++++++++ .../BoardInitialTest.java | 6 +- .../PieceTest/CannonTest.java | 7 ++- .../PieceTest/CarTest.java | 7 ++- .../PieceTest/ElephantTest.java | 7 ++- .../PieceTest/HorseTest.java | 7 ++- .../PieceTest/PalaceTest.java | 7 ++- .../java/boardSetting/PieceTest/PawnTest.java | 4 ++ .../strategyTest/CannonStrategyTest.java | 7 ++- .../strategyTest/CarStrategyTest.java | 7 ++- .../strategyTest/ElephantStrategyTest.java | 7 ++- .../strategyTest/HorseStrategyTest.java | 7 ++- .../strategyTest/PalaceStrategyTest.java | 7 ++- .../strategyTest/PawnStrategyTest.java | 7 ++- .../java/janggiBoard/PieceTest/PawnTest.java | 4 -- 17 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 src/main/java/domain/JanggiBoardInitializer.java rename src/test/java/{janggiBoard => boardSetting}/BoardInitialTest.java (98%) rename src/test/java/{janggiBoard => boardSetting}/PieceTest/CannonTest.java (94%) rename src/test/java/{janggiBoard => boardSetting}/PieceTest/CarTest.java (93%) rename src/test/java/{janggiBoard => boardSetting}/PieceTest/ElephantTest.java (93%) rename src/test/java/{janggiBoard => boardSetting}/PieceTest/HorseTest.java (93%) rename src/test/java/{janggiBoard => boardSetting}/PieceTest/PalaceTest.java (94%) create mode 100644 src/test/java/boardSetting/PieceTest/PawnTest.java rename src/test/java/{janggiBoard => boardSetting}/strategyTest/CannonStrategyTest.java (95%) rename src/test/java/{janggiBoard => boardSetting}/strategyTest/CarStrategyTest.java (94%) rename src/test/java/{janggiBoard => boardSetting}/strategyTest/ElephantStrategyTest.java (96%) rename src/test/java/{janggiBoard => boardSetting}/strategyTest/HorseStrategyTest.java (96%) rename src/test/java/{janggiBoard => boardSetting}/strategyTest/PalaceStrategyTest.java (92%) rename src/test/java/{janggiBoard => boardSetting}/strategyTest/PawnStrategyTest.java (92%) delete mode 100644 src/test/java/janggiBoard/PieceTest/PawnTest.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 4900c67e7c..d6a8452dc0 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,6 +1,7 @@ package controller; import domain.JanggiBoard; +import domain.JanggiBoardInitializer; import domain.piece.Piece; import domain.position.Position; import view.InputView; @@ -16,7 +17,7 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - JanggiBoard janggiBoard = new JanggiBoard(); + JanggiBoard janggiBoard = new JanggiBoard(new JanggiBoardInitializer()); while (true) { try { outputView.printBoard(janggiBoard); diff --git a/src/main/java/domain/JanggiBoard.java b/src/main/java/domain/JanggiBoard.java index dbfe61338f..24f4be206f 100644 --- a/src/main/java/domain/JanggiBoard.java +++ b/src/main/java/domain/JanggiBoard.java @@ -14,60 +14,19 @@ public class JanggiBoard implements PieceProvider { private final Map janggiBoard; - public JanggiBoard() { - this.janggiBoard = new LinkedHashMap<>(); - initializeBoard(); - setupInitialPieces(); + public JanggiBoard(JanggiBoardInitializer initializer) { + this.janggiBoard = initializer.init(); } public Map getJanggiBoard() { return Collections.unmodifiableMap(janggiBoard); } - - public void move(Position from, Position to, Piece currentPiece) { janggiBoard.put(to, currentPiece); janggiBoard.put(from, new Blank()); } - private void initializeBoard() { - for (int row = 0; row < BOARD_ROWS.getIndex(); row++) { - for (int column = 0; column < BOARD_COLUMNS.getIndex(); column++) { - janggiBoard.put(new Position(row, column), new Blank()); - } - } - } - - private void setupInitialPieces() { - setupTeamPieces(Team.HAN, 0, 1,2, 3); // 한나라 기물 배치 (0~3행 위주) - setupTeamPieces(Team.CHO, 9, 8,7,6); // 초나라 기물 배치 (9~6행 위주) - } - - private void setupTeamPieces(Team team, int baseRow, int kingRow, int cannonRow, int pawnRow) { - // 차 - janggiBoard.put(new Position(baseRow, 0), new Car(team)); - janggiBoard.put(new Position(baseRow, 8), new Car(team)); - // 마 - janggiBoard.put(new Position(baseRow, 1), new Horse(team)); - janggiBoard.put(new Position(baseRow, 6), new Horse(team)); - // 상 - janggiBoard.put(new Position(baseRow, 2), new Elephant(team)); - janggiBoard.put(new Position(baseRow, 7), new Elephant(team)); - // 사 - janggiBoard.put(new Position(baseRow, 3), new Guard(team)); - janggiBoard.put(new Position(baseRow, 5), new Guard(team)); - // 궁 - janggiBoard.put(new Position(kingRow, 4), new King(team)); - // 포 - janggiBoard.put(new Position(cannonRow, 1), new Cannon(team)); - janggiBoard.put(new Position(cannonRow, 7), new Cannon(team)); - // 졸/병 - for (int col = 0; col < 9; col += 2) { - janggiBoard.put(new Position(pawnRow, col), new Pawn(team)); - } - } - @Override public boolean isBlank(Position position) { Piece piece = janggiBoard.get(position); diff --git a/src/main/java/domain/JanggiBoardInitializer.java b/src/main/java/domain/JanggiBoardInitializer.java new file mode 100644 index 0000000000..ab37c17045 --- /dev/null +++ b/src/main/java/domain/JanggiBoardInitializer.java @@ -0,0 +1,60 @@ +package domain; + +import static domain.Index.BOARD_COLUMNS; +import static domain.Index.BOARD_ROWS; + +import domain.piece.Blank; +import domain.piece.Cannon; +import domain.piece.Car; +import domain.piece.Elephant; +import domain.piece.Guard; +import domain.piece.Horse; +import domain.piece.King; +import domain.piece.Pawn; +import domain.piece.Piece; +import domain.position.Position; +import java.util.HashMap; +import java.util.Map; + +public class JanggiBoardInitializer { + public Map init() { + Map boardSetting = new HashMap<>(); + + for (int row = 0; row < BOARD_ROWS.getIndex(); row++) { + for (int col = 0; col < BOARD_COLUMNS.getIndex(); col++) { + boardSetting.put(new Position(row, col), new Blank()); + } + } + + setupTeamPieces(boardSetting, Team.HAN, 0, 1, 2, 3); // 한나라 기물 배치 (0~3행 위주) + setupTeamPieces(boardSetting, Team.CHO, 9, 8, 7, 6); // 초나라 기물 배치 (9~6행 위주) + + return boardSetting; + } + + private void setupTeamPieces(Map boardSetting, Team team, int baseRow, int kingRow, int cannonRow, + int pawnRow) { + // 차 + boardSetting.put(new Position(baseRow, 0), new Car(team)); + boardSetting.put(new Position(baseRow, 8), new Car(team)); + // 마 + boardSetting.put(new Position(baseRow, 1), new Horse(team)); + boardSetting.put(new Position(baseRow, 6), new Horse(team)); + // 상 + boardSetting.put(new Position(baseRow, 2), new Elephant(team)); + boardSetting.put(new Position(baseRow, 7), new Elephant(team)); + // 사 + boardSetting.put(new Position(baseRow, 3), new Guard(team)); + boardSetting.put(new Position(baseRow, 5), new Guard(team)); + // 궁 + boardSetting.put(new Position(kingRow, 4), new King(team)); + // 포 + boardSetting.put(new Position(cannonRow, 1), new Cannon(team)); + boardSetting.put(new Position(cannonRow, 7), new Cannon(team)); + // 졸/병 + for (int col = 0; col < 9; col += 2) { + boardSetting.put(new Position(pawnRow, col), new Pawn(team)); + } + } + +} diff --git a/src/test/java/janggiBoard/BoardInitialTest.java b/src/test/java/boardSetting/BoardInitialTest.java similarity index 98% rename from src/test/java/janggiBoard/BoardInitialTest.java rename to src/test/java/boardSetting/BoardInitialTest.java index 74b50c7925..135163247d 100644 --- a/src/test/java/janggiBoard/BoardInitialTest.java +++ b/src/test/java/boardSetting/BoardInitialTest.java @@ -1,13 +1,13 @@ -package janggiBoard; +package boardSetting; import domain.JanggiBoard; +import domain.JanggiBoardInitializer; import domain.position.Position; import domain.Team; import domain.piece.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -19,7 +19,7 @@ public class BoardInitialTest { @BeforeEach void setUp() { - janggiBoard = new JanggiBoard(); + janggiBoard = new JanggiBoard(new JanggiBoardInitializer()); } @Test diff --git a/src/test/java/janggiBoard/PieceTest/CannonTest.java b/src/test/java/boardSetting/PieceTest/CannonTest.java similarity index 94% rename from src/test/java/janggiBoard/PieceTest/CannonTest.java rename to src/test/java/boardSetting/PieceTest/CannonTest.java index b6e3b3ba18..5bcecdb85f 100644 --- a/src/test/java/janggiBoard/PieceTest/CannonTest.java +++ b/src/test/java/boardSetting/PieceTest/CannonTest.java @@ -1,4 +1,4 @@ -package janggiBoard.PieceTest; +package boardSetting.PieceTest; import domain.PieceProvider; import domain.position.Position; @@ -76,6 +76,11 @@ public boolean isBlank(Position position) { return !pieces.containsKey(position); } + @Override + public boolean isCannon(Position position) { + return true; + } + @Override public Piece getPiece(Position position) { return pieces.getOrDefault(position, new Blank()); diff --git a/src/test/java/janggiBoard/PieceTest/CarTest.java b/src/test/java/boardSetting/PieceTest/CarTest.java similarity index 93% rename from src/test/java/janggiBoard/PieceTest/CarTest.java rename to src/test/java/boardSetting/PieceTest/CarTest.java index 813dc00bbe..5aff7173c2 100644 --- a/src/test/java/janggiBoard/PieceTest/CarTest.java +++ b/src/test/java/boardSetting/PieceTest/CarTest.java @@ -1,4 +1,4 @@ -package janggiBoard.PieceTest; +package boardSetting.PieceTest; import domain.position.Position; import domain.Team; @@ -66,6 +66,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/PieceTest/ElephantTest.java b/src/test/java/boardSetting/PieceTest/ElephantTest.java similarity index 93% rename from src/test/java/janggiBoard/PieceTest/ElephantTest.java rename to src/test/java/boardSetting/PieceTest/ElephantTest.java index b2fd6beb86..3a499895ef 100644 --- a/src/test/java/janggiBoard/PieceTest/ElephantTest.java +++ b/src/test/java/boardSetting/PieceTest/ElephantTest.java @@ -1,4 +1,4 @@ -package janggiBoard.PieceTest; +package boardSetting.PieceTest; import domain.PieceProvider; import domain.position.Position; @@ -62,6 +62,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/PieceTest/HorseTest.java b/src/test/java/boardSetting/PieceTest/HorseTest.java similarity index 93% rename from src/test/java/janggiBoard/PieceTest/HorseTest.java rename to src/test/java/boardSetting/PieceTest/HorseTest.java index 5f4d763c58..d551e1b4e2 100644 --- a/src/test/java/janggiBoard/PieceTest/HorseTest.java +++ b/src/test/java/boardSetting/PieceTest/HorseTest.java @@ -1,4 +1,4 @@ -package janggiBoard.PieceTest; +package boardSetting.PieceTest; import domain.position.Position; import domain.Team; @@ -63,6 +63,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/PieceTest/PalaceTest.java b/src/test/java/boardSetting/PieceTest/PalaceTest.java similarity index 94% rename from src/test/java/janggiBoard/PieceTest/PalaceTest.java rename to src/test/java/boardSetting/PieceTest/PalaceTest.java index ed3cfc5489..e73995b10f 100644 --- a/src/test/java/janggiBoard/PieceTest/PalaceTest.java +++ b/src/test/java/boardSetting/PieceTest/PalaceTest.java @@ -1,4 +1,4 @@ -package janggiBoard.PieceTest; +package boardSetting.PieceTest; import domain.PieceProvider; import domain.position.Position; @@ -86,6 +86,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/boardSetting/PieceTest/PawnTest.java b/src/test/java/boardSetting/PieceTest/PawnTest.java new file mode 100644 index 0000000000..112c1f77ad --- /dev/null +++ b/src/test/java/boardSetting/PieceTest/PawnTest.java @@ -0,0 +1,4 @@ +package boardSetting.PieceTest; + +public class PawnTest { +} diff --git a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java b/src/test/java/boardSetting/strategyTest/CannonStrategyTest.java similarity index 95% rename from src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java rename to src/test/java/boardSetting/strategyTest/CannonStrategyTest.java index e49131834f..3ff4b5b7d5 100644 --- a/src/test/java/janggiBoard/strategyTest/CannonStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/CannonStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.PieceProvider; import domain.position.Position; @@ -80,6 +80,11 @@ public boolean isBlank(Position position) { return !pieces.containsKey(position); } + @Override + public boolean isCannon(Position position) { + return true; + } + @Override public Piece getPiece(Position position) { return pieces.getOrDefault(position, new Blank()); diff --git a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java b/src/test/java/boardSetting/strategyTest/CarStrategyTest.java similarity index 94% rename from src/test/java/janggiBoard/strategyTest/CarStrategyTest.java rename to src/test/java/boardSetting/strategyTest/CarStrategyTest.java index a47090b87d..ca14db0863 100644 --- a/src/test/java/janggiBoard/strategyTest/CarStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/CarStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.position.Position; import domain.piece.Blank; @@ -72,6 +72,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java b/src/test/java/boardSetting/strategyTest/ElephantStrategyTest.java similarity index 96% rename from src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java rename to src/test/java/boardSetting/strategyTest/ElephantStrategyTest.java index fe0f9dfe57..0760eae367 100644 --- a/src/test/java/janggiBoard/strategyTest/ElephantStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/ElephantStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.position.Position; import domain.piece.Blank; @@ -107,6 +107,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java b/src/test/java/boardSetting/strategyTest/HorseStrategyTest.java similarity index 96% rename from src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java rename to src/test/java/boardSetting/strategyTest/HorseStrategyTest.java index 4a66689b9d..5656857d02 100644 --- a/src/test/java/janggiBoard/strategyTest/HorseStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/HorseStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.position.Position; @@ -107,6 +107,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java b/src/test/java/boardSetting/strategyTest/PalaceStrategyTest.java similarity index 92% rename from src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java rename to src/test/java/boardSetting/strategyTest/PalaceStrategyTest.java index 7e4261cb36..d399255f99 100644 --- a/src/test/java/janggiBoard/strategyTest/PalaceStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/PalaceStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.position.Position; import domain.piece.Blank; @@ -58,6 +58,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java b/src/test/java/boardSetting/strategyTest/PawnStrategyTest.java similarity index 92% rename from src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java rename to src/test/java/boardSetting/strategyTest/PawnStrategyTest.java index 46ba6c5ef9..d7865a9c32 100644 --- a/src/test/java/janggiBoard/strategyTest/PawnStrategyTest.java +++ b/src/test/java/boardSetting/strategyTest/PawnStrategyTest.java @@ -1,4 +1,4 @@ -package janggiBoard.strategyTest; +package boardSetting.strategyTest; import domain.position.Position; import domain.piece.Blank; @@ -56,6 +56,11 @@ public boolean isBlank(Position position) { return boardState.getOrDefault(position, defaultState); } + @Override + public boolean isCannon(Position position) { + return false; + } + @Override public Piece getPiece(Position position) { return new Blank(); diff --git a/src/test/java/janggiBoard/PieceTest/PawnTest.java b/src/test/java/janggiBoard/PieceTest/PawnTest.java deleted file mode 100644 index 36b87f8f65..0000000000 --- a/src/test/java/janggiBoard/PieceTest/PawnTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package janggiBoard.PieceTest; - -public class PawnTest { -}