From cb93bfcd3e6b2933fb8e060e023fdc31be1ef3c3 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Wed, 25 Mar 2026 15:31:41 +0900 Subject: [PATCH 01/55] docs: readme tset --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9775dda0ae..9634e0221f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # java-janggi -장기 미션 저장소 +장기 미션 저장소. From 0f8fb4d7455c6b72f95dcb32231aa9aca465129b Mon Sep 17 00:00:00 2001 From: picetea44 Date: Wed, 25 Mar 2026 16:03:05 +0900 Subject: [PATCH 02/55] =?UTF-8?q?feat:=20Position=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=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/Column.java | 17 ++++++++++ src/main/java/domain/Position.java | 11 ++++++ src/main/java/domain/Row.java | 16 +++++++++ src/test/java/domain/PositionTest.java | 46 ++++++++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 src/main/java/domain/Column.java create mode 100644 src/main/java/domain/Position.java create mode 100644 src/main/java/domain/Row.java create mode 100644 src/test/java/domain/PositionTest.java diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java new file mode 100644 index 0000000000..59806b3c79 --- /dev/null +++ b/src/main/java/domain/Column.java @@ -0,0 +1,17 @@ +package domain; + +public class Column { + private final int value; + + public Column(int value) { + validate(value); + this.value = value; + } + + private void validate(int value) { + if (value <= 0 || value > 10) { + throw new IllegalArgumentException("열의 위치는 1-10 사이에 있어야 합니다."); + } + } + +} diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java new file mode 100644 index 0000000000..646517d729 --- /dev/null +++ b/src/main/java/domain/Position.java @@ -0,0 +1,11 @@ +package domain; + +public class Position { + private final Row row; + private final Column column; + + public Position(int row, int column) { + this.row = new Row(row); + this.column = new Column(column); + } +} diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java new file mode 100644 index 0000000000..83c0312b83 --- /dev/null +++ b/src/main/java/domain/Row.java @@ -0,0 +1,16 @@ +package domain; + +public class Row { + private final int value; + + public Row(int value) { + validate(value); + this.value = value; + } + + private void validate(int value) { + if (value <= 0 || value > 9) { + throw new IllegalArgumentException("행의 위치는 1-9 사이에 있어야 합니다."); + } + } +} diff --git a/src/test/java/domain/PositionTest.java b/src/test/java/domain/PositionTest.java new file mode 100644 index 0000000000..e44646f74f --- /dev/null +++ b/src/test/java/domain/PositionTest.java @@ -0,0 +1,46 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +class PositionTest { + + @Test + void 경계값_최대_범위의_위치를_생성한다() { + Position position = new Position(9, 10); + + assertThat(position).isNotNull(); + } + + @Test + void 행이_0이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(0, 5)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 행이_10이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(10, 5)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 열이_0이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(5, 0)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 열이_11이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(5, 11)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 행과_열이_모두_음수이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(-1, -1)) + .isInstanceOf(IllegalArgumentException.class); + } +} From ec1afcb277d685857910ed2303fafe3afb8447da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Wed, 25 Mar 2026 17:48:26 +0900 Subject: [PATCH 03/55] =?UTF-8?q?feat:=20=EA=B8=B0=EB=AC=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/Score.java | 16 ++++++++++++++++ src/main/java/domain/piece/ActivePiece.java | 19 +++++++++++++++++++ src/main/java/domain/piece/EmptyPiece.java | 9 +++++++++ src/main/java/domain/piece/Piece.java | 5 +++++ src/main/java/domain/piece/PieceType.java | 18 ++++++++++++++++++ src/main/java/domain/piece/Team.java | 12 ++++++++++++ 6 files changed, 79 insertions(+) create mode 100644 src/main/java/domain/Score.java create mode 100644 src/main/java/domain/piece/ActivePiece.java create mode 100644 src/main/java/domain/piece/EmptyPiece.java create mode 100644 src/main/java/domain/piece/Piece.java create mode 100644 src/main/java/domain/piece/PieceType.java create mode 100644 src/main/java/domain/piece/Team.java diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java new file mode 100644 index 0000000000..834b346152 --- /dev/null +++ b/src/main/java/domain/Score.java @@ -0,0 +1,16 @@ +package domain; + +public class Score { + private final int value; + + public Score(int value) { + validate(value); + this.value = value; + } + + private void validate(int value) { + if (value < 0) { + throw new IllegalArgumentException("점수는 0 이상 이어야합니다."); + } + } +} diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java new file mode 100644 index 0000000000..c9c25b09fb --- /dev/null +++ b/src/main/java/domain/piece/ActivePiece.java @@ -0,0 +1,19 @@ +package domain.piece; + +import domain.Position; + +public abstract class ActivePiece implements Piece { + private final Team team; + private final PieceType type; + + protected ActivePiece(Team team, PieceType type) { + this.team = team; + this.type = type; + } + + public boolean isSameTeam(Team other) { + return this.team == other; + } + + public abstract boolean canMove(Position source, Position target); +} diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java new file mode 100644 index 0000000000..d2e51d1e62 --- /dev/null +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -0,0 +1,9 @@ +package domain.piece; + +public class EmptyPiece implements Piece { + + @Override + public boolean canMove() { + return false; + } +} diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java new file mode 100644 index 0000000000..450834e293 --- /dev/null +++ b/src/main/java/domain/piece/Piece.java @@ -0,0 +1,5 @@ +package domain.piece; + +public interface Piece { + boolean canMove(); +} diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java new file mode 100644 index 0000000000..7e58a8cdc0 --- /dev/null +++ b/src/main/java/domain/piece/PieceType.java @@ -0,0 +1,18 @@ +package domain.piece; + +public enum PieceType { + CHA(13.0), + MA(5.0), + SANG(3.0), + SA(3.0), + GENERAL(0.0), + PHO(7.0), + BYEONG(2.0), + EMPTY(0.0); + + private final double score; + + PieceType(double score) { + this.score = score; + } +} diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/piece/Team.java new file mode 100644 index 0000000000..d22f81c863 --- /dev/null +++ b/src/main/java/domain/piece/Team.java @@ -0,0 +1,12 @@ +package domain.piece; + +public enum Team { + CHO("초"), + HAN("한"); + + private final String teamName; + + Team(String teamName) { + this.teamName = teamName; + } +} From 81434bda4a3d580a147c07aa449851d7ce2e4c3a Mon Sep 17 00:00:00 2001 From: picetea44 Date: Wed, 25 Mar 2026 20:49:52 +0900 Subject: [PATCH 04/55] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=EC=84=B1=20=EB=B0=8F=20=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=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/Board.java | 15 +++++++++++++++ src/main/java/domain/piece/ActivePiece.java | 1 - src/main/java/domain/piece/Cha.java | 13 +++++++++++++ src/main/java/domain/piece/EmptyPiece.java | 4 +++- src/main/java/domain/piece/Piece.java | 4 +++- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/main/java/domain/Board.java create mode 100644 src/main/java/domain/piece/Cha.java diff --git a/src/main/java/domain/Board.java b/src/main/java/domain/Board.java new file mode 100644 index 0000000000..f5cfc72fc4 --- /dev/null +++ b/src/main/java/domain/Board.java @@ -0,0 +1,15 @@ +package domain; + +import domain.piece.Piece; +import java.util.HashMap; +import java.util.Map; + +public class Board { + private final Map board = new HashMap<>(); + + void move(Position source, Position target) { + Piece whatPiece = board.get(source); + whatPiece.canMove(source, target); + + } +} diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index c9c25b09fb..ec048de182 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -15,5 +15,4 @@ public boolean isSameTeam(Team other) { return this.team == other; } - public abstract boolean canMove(Position source, Position target); } diff --git a/src/main/java/domain/piece/Cha.java b/src/main/java/domain/piece/Cha.java new file mode 100644 index 0000000000..ff68508213 --- /dev/null +++ b/src/main/java/domain/piece/Cha.java @@ -0,0 +1,13 @@ +package domain.piece; + +import domain.Position; + +public class Cha extends ActivePiece{ + + + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index d2e51d1e62..cdf5943795 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -1,9 +1,11 @@ package domain.piece; +import domain.Position; + public class EmptyPiece implements Piece { @Override - public boolean canMove() { + public boolean canMove(Position source, Position target) { return false; } } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 450834e293..bb00362f4e 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -1,5 +1,7 @@ package domain.piece; +import domain.Position; + public interface Piece { - boolean canMove(); + boolean canMove(Position source, Position target); } From 4a7f437a74a920138db57ddc5ef102b2e2a6a917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 11:30:24 +0900 Subject: [PATCH 05/55] =?UTF-8?q?feat:=20=EC=97=B4=EA=B3=BC=20=ED=96=89=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Column.java | 8 +++++ src/main/java/domain/Position.java | 9 ++++++ src/main/java/domain/Row.java | 9 ++++++ .../{piece => activePiece}/ActivePiece.java | 7 ++-- src/test/java/domain/PositionTest.java | 32 +++++++++++++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) rename src/main/java/domain/{piece => activePiece}/ActivePiece.java (74%) diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index 59806b3c79..a8076ec8e2 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -14,4 +14,12 @@ private void validate(int value) { } } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Column column = (Column) o; + return value == column.value; + } } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 646517d729..1c506c6773 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -8,4 +8,13 @@ public Position(int row, int column) { this.row = new Row(row); this.column = new Column(column); } + + public boolean isSameRow(Position other) { + return other.row.equals(this.row); + } + + public boolean isSameCol(Position other) { + return other.column.equals(this.column); + } + } diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index 83c0312b83..bcac07d704 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -13,4 +13,13 @@ private void validate(int value) { throw new IllegalArgumentException("행의 위치는 1-9 사이에 있어야 합니다."); } } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Row row = (Row) o; + return value == row.value; + } } diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java similarity index 74% rename from src/main/java/domain/piece/ActivePiece.java rename to src/main/java/domain/activePiece/ActivePiece.java index ec048de182..33dd4aeb29 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -1,6 +1,8 @@ -package domain.piece; +package domain.activePiece; -import domain.Position; +import domain.piece.Piece; +import domain.piece.PieceType; +import domain.piece.Team; public abstract class ActivePiece implements Piece { private final Team team; @@ -14,5 +16,4 @@ protected ActivePiece(Team team, PieceType type) { public boolean isSameTeam(Team other) { return this.team == other; } - } diff --git a/src/test/java/domain/PositionTest.java b/src/test/java/domain/PositionTest.java index e44646f74f..7b823ee790 100644 --- a/src/test/java/domain/PositionTest.java +++ b/src/test/java/domain/PositionTest.java @@ -43,4 +43,36 @@ class PositionTest { assertThatThrownBy(() -> new Position(-1, -1)) .isInstanceOf(IllegalArgumentException.class); } + + @Test + void 같은_행이면_true를_반환한다() { + Position position = new Position(1, 5); + Position otherPosition = new Position(1, 3); + + assertThat(position.isSameRow(otherPosition)).isTrue(); + } + + @Test + void 다른_행이면_false를_반환한다() { + Position position = new Position(1, 5); + Position otherPosition = new Position(2, 5); + + assertThat(position.isSameRow(otherPosition)).isFalse(); + } + + @Test + void 같은_열이면_true를_반환한다() { + Position position = new Position(1, 5); + Position otherPosition = new Position(3, 5); + + assertThat(position.isSameCol(otherPosition)).isTrue(); + } + + @Test + void 다른_열이면_false를_반환한다() { + Position position = new Position(1, 5); + Position otherPosition = new Position(1, 6); + + assertThat(position.isSameCol(otherPosition)).isFalse(); + } } From ee11a83a61cadfff9e1c4c2636d635119e747f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 11:30:46 +0900 Subject: [PATCH 06/55] =?UTF-8?q?feat:=20=EC=8B=A4=EC=A0=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EA=B8=B0=EB=AC=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/activePiece/Cannon.java | 17 +++++++++++++++++ src/main/java/domain/activePiece/Elephant.java | 17 +++++++++++++++++ src/main/java/domain/activePiece/General.java | 16 ++++++++++++++++ src/main/java/domain/activePiece/Guard.java | 16 ++++++++++++++++ src/main/java/domain/activePiece/Horse.java | 16 ++++++++++++++++ src/main/java/domain/activePiece/Soldier.java | 16 ++++++++++++++++ 6 files changed, 98 insertions(+) create mode 100644 src/main/java/domain/activePiece/Cannon.java create mode 100644 src/main/java/domain/activePiece/Elephant.java create mode 100644 src/main/java/domain/activePiece/General.java create mode 100644 src/main/java/domain/activePiece/Guard.java create mode 100644 src/main/java/domain/activePiece/Horse.java create mode 100644 src/main/java/domain/activePiece/Soldier.java diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/activePiece/Cannon.java new file mode 100644 index 0000000000..183dae74c4 --- /dev/null +++ b/src/main/java/domain/activePiece/Cannon.java @@ -0,0 +1,17 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Cannon extends ActivePiece { + + protected Cannon(Team team) { + super(team, PieceType.PHO); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java new file mode 100644 index 0000000000..4e79b08efe --- /dev/null +++ b/src/main/java/domain/activePiece/Elephant.java @@ -0,0 +1,17 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Elephant extends ActivePiece { + + protected Elephant(Team team) { + super(team, PieceType.SANG); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java new file mode 100644 index 0000000000..5e53a7d364 --- /dev/null +++ b/src/main/java/domain/activePiece/General.java @@ -0,0 +1,16 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class General extends ActivePiece { + protected General(Team team) { + super(team, PieceType.GENERAL); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java new file mode 100644 index 0000000000..bd41916597 --- /dev/null +++ b/src/main/java/domain/activePiece/Guard.java @@ -0,0 +1,16 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Guard extends ActivePiece { + protected Guard(Team team) { + super(team, PieceType.SA); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java new file mode 100644 index 0000000000..8f1a60e64a --- /dev/null +++ b/src/main/java/domain/activePiece/Horse.java @@ -0,0 +1,16 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Horse extends ActivePiece { + protected Horse(Team team) { + super(team, PieceType.MA); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java new file mode 100644 index 0000000000..035915e439 --- /dev/null +++ b/src/main/java/domain/activePiece/Soldier.java @@ -0,0 +1,16 @@ +package domain.activePiece; + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Soldier extends ActivePiece { + protected Soldier(Team team) { + super(team, PieceType.BYEONG); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} From b91473b4173ab615d5c138e16fc1a8e97df0e127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 11:30:55 +0900 Subject: [PATCH 07/55] =?UTF-8?q?feat:=20=EC=8B=A4=EC=A0=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EA=B8=B0=EB=AC=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=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/activePiece/Chariot.java | 18 ++++++++++++++++++ src/main/java/domain/piece/Cha.java | 13 ------------- 2 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 src/main/java/domain/activePiece/Chariot.java delete mode 100644 src/main/java/domain/piece/Cha.java diff --git a/src/main/java/domain/activePiece/Chariot.java b/src/main/java/domain/activePiece/Chariot.java new file mode 100644 index 0000000000..f1e1906320 --- /dev/null +++ b/src/main/java/domain/activePiece/Chariot.java @@ -0,0 +1,18 @@ +package domain.activePiece; + + +import domain.Position; +import domain.piece.PieceType; +import domain.piece.Team; + +public class Chariot extends ActivePiece { + + protected Chariot(Team team) { + super(team, PieceType.CHA); + } + + @Override + public boolean canMove(Position source, Position target) { + return false; + } +} diff --git a/src/main/java/domain/piece/Cha.java b/src/main/java/domain/piece/Cha.java deleted file mode 100644 index ff68508213..0000000000 --- a/src/main/java/domain/piece/Cha.java +++ /dev/null @@ -1,13 +0,0 @@ -package domain.piece; - -import domain.Position; - -public class Cha extends ActivePiece{ - - - - @Override - public boolean canMove(Position source, Position target) { - return false; - } -} From 5ce6271ffd64f2b699ff36062bb3463f3333f967 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 26 Mar 2026 13:43:59 +0900 Subject: [PATCH 08/55] =?UTF-8?q?feat:=20=EB=A7=88,=ED=8F=AC,=EC=B0=A8=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=20=EC=9D=B4=EB=8F=99=20=EB=B2=94=EC=9C=84=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/Column.java | 4 +++ src/main/java/domain/Position.java | 7 +++++ src/main/java/domain/Row.java | 4 +++ src/main/java/domain/activePiece/Cannon.java | 2 +- src/main/java/domain/activePiece/Chariot.java | 2 +- src/main/java/domain/activePiece/Horse.java | 13 +++++++++ .../java/domain/activePiece/CannonTest.java | 27 +++++++++++++++++++ .../java/domain/activePiece/ChariotTest.java | 27 +++++++++++++++++++ 8 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/test/java/domain/activePiece/CannonTest.java create mode 100644 src/test/java/domain/activePiece/ChariotTest.java diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index a8076ec8e2..e235fb88e2 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -14,6 +14,10 @@ private void validate(int value) { } } + public int diff(Column other) { + return this.value - other.value; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 1c506c6773..98fd9de08f 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -17,4 +17,11 @@ public boolean isSameCol(Position other) { return other.column.equals(this.column); } + public int rowDiff(Position other) { + return this.row.diff(other.row); + } + + public int columnDiff(Position other) { + return this.column.diff(other.column); + } } diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index bcac07d704..057b04b270 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -14,6 +14,10 @@ private void validate(int value) { } } + public int diff(Row other) { + return this.value - other.value; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/activePiece/Cannon.java index 183dae74c4..0e5da02da0 100644 --- a/src/main/java/domain/activePiece/Cannon.java +++ b/src/main/java/domain/activePiece/Cannon.java @@ -12,6 +12,6 @@ protected Cannon(Team team) { @Override public boolean canMove(Position source, Position target) { - return false; + return source.isSameCol(target) || source.isSameRow(target); } } diff --git a/src/main/java/domain/activePiece/Chariot.java b/src/main/java/domain/activePiece/Chariot.java index f1e1906320..d60901ed4b 100644 --- a/src/main/java/domain/activePiece/Chariot.java +++ b/src/main/java/domain/activePiece/Chariot.java @@ -13,6 +13,6 @@ protected Chariot(Team team) { @Override public boolean canMove(Position source, Position target) { - return false; + return source.isSameCol(target) || source.isSameRow(target); } } diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index 8f1a60e64a..b69b6ad2b7 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -3,14 +3,27 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class Horse extends ActivePiece { + + private final List dx = List.of(1, 2, 2, 1, -1, -2, -2, -1); + private final List dy = List.of(2, 1, -1, -2, -2, -1, 1, 2); + protected Horse(Team team) { super(team, PieceType.MA); } @Override public boolean canMove(Position source, Position target) { + int rowDiff = target.rowDiff(source); + int colDiff = target.columnDiff(source); + + for (int i = 0; i < dx.size(); i++) { + if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + return true; + } + } return false; } } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java new file mode 100644 index 0000000000..b7e8bff6ea --- /dev/null +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -0,0 +1,27 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class CannonTest { + + @Test + void 포는_직선_운동한다() { + Piece cannon = new Cannon(Team.HAN); + assertThat(cannon.canMove(new Position(1,4), new Position(1,8))).isTrue(); + + } + + @Test + void 포는_직선이_아닌_방향으로_가지_못한다() { + Piece cannon = new Cannon(Team.HAN); + assertThat(cannon.canMove(new Position(5,5), new Position(3,3))).isFalse(); + + } + +} diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java new file mode 100644 index 0000000000..60828ead9e --- /dev/null +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -0,0 +1,27 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class ChariotTest { + + @Test + void 차는_직선_운동한다() { + Piece cha = new Chariot(Team.HAN); + assertThat(cha.canMove(new Position(1,4), new Position(1,8))).isTrue(); + + } + + @Test + void 차는_직선이_아닌_방향으로_가지_못한다() { + Piece cha = new Chariot(Team.HAN); + assertThat(cha.canMove(new Position(5,5), new Position(3,3))).isFalse(); + + } + +} From 9198a53a34b99cf8dd586c8836292d06d83806c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 14:10:01 +0900 Subject: [PATCH 09/55] =?UTF-8?q?feat:=20=EC=83=81,=20=EA=B6=81,=20?= =?UTF-8?q?=EC=A1=B8,=20=EC=82=AC=20=EC=9C=A0=ED=9A=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=B2=94=EC=9C=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/activePiece/Elephant.java | 12 ++++++++ src/main/java/domain/activePiece/General.java | 12 ++++++++ src/main/java/domain/activePiece/Guard.java | 12 ++++++++ src/main/java/domain/activePiece/Soldier.java | 28 +++++++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index 4e79b08efe..3ce0c93def 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -3,15 +3,27 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class Elephant extends ActivePiece { + private final List dx = List.of(2, 3, -2, -3, -3, -2, 2, 3); + private final List dy = List.of(3, 2, 3, 2, -2, -3, -3, -2); + protected Elephant(Team team) { super(team, PieceType.SANG); } @Override public boolean canMove(Position source, Position target) { + int rowDiff = target.rowDiff(source); + int colDiff = target.columnDiff(source); + + for (int i = 0; i < dx.size(); i++) { + if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + return true; + } + } return false; } } diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java index 5e53a7d364..ef69f7ec79 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/activePiece/General.java @@ -3,14 +3,26 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class General extends ActivePiece { + private final List dx = List.of(-1, 1, 0, 0); + private final List dy = List.of(0, 0, -1, 1); + protected General(Team team) { super(team, PieceType.GENERAL); } @Override public boolean canMove(Position source, Position target) { + int rowDiff = target.rowDiff(source); + int colDiff = target.columnDiff(source); + + for (int i = 0; i < dx.size(); i++) { + if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + return true; + } + } return false; } } diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java index bd41916597..84f0e189e7 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/activePiece/Guard.java @@ -3,14 +3,26 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class Guard extends ActivePiece { + private final List dx = List.of(-1, 1, 0, 0); + private final List dy = List.of(0, 0, -1, 1); + protected Guard(Team team) { super(team, PieceType.SA); } @Override public boolean canMove(Position source, Position target) { + int rowDiff = target.rowDiff(source); + int colDiff = target.columnDiff(source); + + for (int i = 0; i < dx.size(); i++) { + if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + return true; + } + } return false; } } diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index 035915e439..1793193152 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -3,14 +3,42 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class Soldier extends ActivePiece { + private final List dx = List.of(-1, 1); + private final List dy = List.of(0, 0); + protected Soldier(Team team) { super(team, PieceType.BYEONG); } @Override public boolean canMove(Position source, Position target) { + boolean sideMove = isValidDirection(source, target); + + if (sideMove) { + return true; + } + + if (isSameTeam(Team.CHO)) { + if (target.rowDiff(source) == 0 && target.columnDiff(source) == 1) { + return true; + } + } + + return target.rowDiff(source) == 0 && target.columnDiff(source) == -1; + } + + private boolean isValidDirection(Position source, Position target) { + int rowDiff = target.rowDiff(source); + int colDiff = target.columnDiff(source); + + for (int i = 0; i < dx.size(); i++) { + if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + return true; + } + } return false; } } From 7e8456cf8f4ff4f242f127a495663e38e0585ef5 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 26 Mar 2026 14:41:31 +0900 Subject: [PATCH 10/55] =?UTF-8?q?test:=20=EA=B8=B0=EB=AC=BC=EB=B3=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=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/activePiece/Soldier.java | 6 +- .../java/domain/activePiece/ElephantTest.java | 24 ++++++++ .../java/domain/activePiece/GeneralTest.java | 25 ++++++++ .../java/domain/activePiece/GuardTest.java | 25 ++++++++ .../java/domain/activePiece/HorseTest.java | 25 ++++++++ .../java/domain/activePiece/SoldierTest.java | 61 +++++++++++++++++++ 6 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 src/test/java/domain/activePiece/ElephantTest.java create mode 100644 src/test/java/domain/activePiece/GeneralTest.java create mode 100644 src/test/java/domain/activePiece/GuardTest.java create mode 100644 src/test/java/domain/activePiece/HorseTest.java create mode 100644 src/test/java/domain/activePiece/SoldierTest.java diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index 1793193152..13f96310c0 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -22,12 +22,12 @@ public boolean canMove(Position source, Position target) { } if (isSameTeam(Team.CHO)) { - if (target.rowDiff(source) == 0 && target.columnDiff(source) == 1) { + if (target.rowDiff(source) == 1 && target.columnDiff(source) == 0) { return true; } } - return target.rowDiff(source) == 0 && target.columnDiff(source) == -1; + return target.rowDiff(source) == -1 && target.columnDiff(source) == 0; } private boolean isValidDirection(Position source, Position target) { @@ -35,7 +35,7 @@ private boolean isValidDirection(Position source, Position target) { int colDiff = target.columnDiff(source); for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + if (dx.get(i) == colDiff && dy.get(i) == rowDiff) { return true; } } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java new file mode 100644 index 0000000000..f3d39cd7d5 --- /dev/null +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -0,0 +1,24 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class ElephantTest { + + @Test + void 정상_범위_입력() { + Piece elephant = new Elephant(Team.HAN); + assertThat(elephant.canMove(new Position(5,5), new Position(7,8))).isTrue(); + } + @Test + void 정상_범위가_아니면_거짓() { + Piece elephant = new Elephant(Team.HAN); + assertThat(elephant.canMove(new Position(5,5), new Position(8,8))).isFalse(); + } + +} diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java new file mode 100644 index 0000000000..d258cbe332 --- /dev/null +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -0,0 +1,25 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class GeneralTest { + + @Test + void 정상_범위_입력() { + Piece general = new General(Team.HAN); + assertThat(general.canMove(new Position(5,5), new Position(5,6))).isTrue(); + } + @Test + void 정상_범위가_아니면_거짓() { + Piece general = new General(Team.HAN); + assertThat(general.canMove(new Position(5,5), new Position(6,6))).isFalse(); + } + + +} diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java new file mode 100644 index 0000000000..5b314743b6 --- /dev/null +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -0,0 +1,25 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class GuardTest { + + @Test + void 정상_범위_입력() { + Piece guard = new Guard(Team.HAN); + assertThat(guard.canMove(new Position(5,5), new Position(6,5))).isTrue(); + } + @Test + void 정상_범위가_아니면_거짓() { + Piece guard = new Guard(Team.HAN); + assertThat(guard.canMove(new Position(5,5), new Position(8,8))).isFalse(); + } + + +} diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java new file mode 100644 index 0000000000..4b9426b289 --- /dev/null +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -0,0 +1,25 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class HorseTest { + + @Test + void 정상_범위_입력() { + Piece horse = new Horse(Team.HAN); + assertThat(horse.canMove(new Position(5,5), new Position(6,7))).isTrue(); + } + @Test + void 정상_범위가_아니면_거짓() { + Piece horse = new Horse(Team.HAN); + assertThat(horse.canMove(new Position(5,5), new Position(8,8))).isFalse(); + } + + +} diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java new file mode 100644 index 0000000000..6d36d0941f --- /dev/null +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -0,0 +1,61 @@ +package domain.activePiece; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import org.junit.jupiter.api.Test; + +class SoldierTest { + + @Test + void 한_진영에서_왼쪽_이동() { + Piece soldier = new Soldier(Team.HAN); + assertThat(soldier.canMove(new Position(5,5), new Position(5,4))).isTrue(); + } + + @Test + void 한_진영에서_오른쪽_이동() { + Piece soldier = new Soldier(Team.HAN); + assertThat(soldier.canMove(new Position(5,5), new Position(5,6))).isTrue(); + } + + @Test + void 한_진영에서_전진_이동() { + Piece soldier = new Soldier(Team.HAN); + assertThat(soldier.canMove(new Position(5,5), new Position(4,5))).isTrue(); + } + + @Test + void 한_진영에서_정상_범위가_아니면_거짓() { + Piece soldier = new Elephant(Team.HAN); + assertThat(soldier.canMove(new Position(5,5), new Position(8,8))).isFalse(); + } + + @Test + void 초_진영에서_왼쪽_이동() { + Piece soldier = new Soldier(Team.CHO); + assertThat(soldier.canMove(new Position(5,5), new Position(5,4))).isTrue(); + } + + @Test + void 초_진영에서_오른쪽_이동() { + Piece soldier = new Soldier(Team.CHO); + assertThat(soldier.canMove(new Position(5,5), new Position(5,6))).isTrue(); + } + + @Test + void 초_진영에서_전진_이동() { + Piece soldier = new Soldier(Team.CHO); + assertThat(soldier.canMove(new Position(5,5), new Position(6,5))).isTrue(); + } + + @Test + void 초_진영에서_정상_범위가_아니면_거짓() { + Piece soldier = new Elephant(Team.CHO); + assertThat(soldier.canMove(new Position(5,5), new Position(8,8))).isFalse(); + } + +} From 9179f231d7263aef52a75e534b6edb2268e2da85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 16:05:00 +0900 Subject: [PATCH 11/55] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20formation=20?= =?UTF-8?q?=EC=9E=85=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 --- src/main/java/JanggiApplication.java | 10 +++++++ .../java/controller/JanggiController.java | 17 ++++++++++++ src/main/java/domain/Column.java | 4 +-- src/main/java/domain/Row.java | 4 +-- src/main/java/domain/{ => board}/Board.java | 3 ++- src/main/java/domain/board/BoardFactory.java | 25 +++++++++++++++++ .../java/domain/board/FormationFactory.java | 10 +++++++ src/main/java/domain/piece/Team.java | 5 ++++ src/main/java/view/InputView.java | 27 +++++++++++++++++++ src/main/java/view/OutputView.java | 4 +++ 10 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/main/java/JanggiApplication.java create mode 100644 src/main/java/controller/JanggiController.java rename src/main/java/domain/{ => board}/Board.java (87%) create mode 100644 src/main/java/domain/board/BoardFactory.java create mode 100644 src/main/java/domain/board/FormationFactory.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/JanggiApplication.java b/src/main/java/JanggiApplication.java new file mode 100644 index 0000000000..07810cc2c7 --- /dev/null +++ b/src/main/java/JanggiApplication.java @@ -0,0 +1,10 @@ +import controller.JanggiController; +import view.InputView; + +public class JanggiApplication { + public static void main(String[] args) { + JanggiController janggiController = new JanggiController(new InputView()); + janggiController.run(); + + } +} diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java new file mode 100644 index 0000000000..0099206c70 --- /dev/null +++ b/src/main/java/controller/JanggiController.java @@ -0,0 +1,17 @@ +package controller; + +import domain.piece.Team; +import view.InputView; + +public class JanggiController { + private final InputView inputView; + + public JanggiController(InputView inputView) { + this.inputView = inputView; + } + + public void run() { + int choFormationNumber = inputView.initialFormation(Team.CHO); + int hanFormationNumber = inputView.initialFormation(Team.HAN); + } +} diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index e235fb88e2..05f73b5467 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -9,8 +9,8 @@ public Column(int value) { } private void validate(int value) { - if (value <= 0 || value > 10) { - throw new IllegalArgumentException("열의 위치는 1-10 사이에 있어야 합니다."); + if (value <= 0 || value > 9) { + throw new IllegalArgumentException("열의 위치는 1-9 사이에 있어야 합니다."); } } diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index 057b04b270..559feda695 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -9,8 +9,8 @@ public Row(int value) { } private void validate(int value) { - if (value <= 0 || value > 9) { - throw new IllegalArgumentException("행의 위치는 1-9 사이에 있어야 합니다."); + if (value <= 0 || value > 10) { + throw new IllegalArgumentException("행의 위치는 1-10 사이에 있어야 합니다."); } } diff --git a/src/main/java/domain/Board.java b/src/main/java/domain/board/Board.java similarity index 87% rename from src/main/java/domain/Board.java rename to src/main/java/domain/board/Board.java index f5cfc72fc4..1967f68cc2 100644 --- a/src/main/java/domain/Board.java +++ b/src/main/java/domain/board/Board.java @@ -1,5 +1,6 @@ -package domain; +package domain.board; +import domain.Position; import domain.piece.Piece; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/domain/board/BoardFactory.java b/src/main/java/domain/board/BoardFactory.java new file mode 100644 index 0000000000..1cb4cac6b6 --- /dev/null +++ b/src/main/java/domain/board/BoardFactory.java @@ -0,0 +1,25 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import java.util.Map; + +public class BoardFactory implements FormationFactory { + @Override + public Map createFormation(Team team, int formationNumber) { + return Map.of(); + } + + + /* + @Override + public Map createFormation(Team team, int formationNumber) { + Map pieces = new HashMap<>(); + setFixedPieces(pieces, team); + } + + private void setFixedPieces(Map pieces, Team team) { + pieces.put(new Position(0,0), new Piece(team)); + } */ +} diff --git a/src/main/java/domain/board/FormationFactory.java b/src/main/java/domain/board/FormationFactory.java new file mode 100644 index 0000000000..72a35b5ed3 --- /dev/null +++ b/src/main/java/domain/board/FormationFactory.java @@ -0,0 +1,10 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.Team; +import java.util.Map; + +public interface FormationFactory { + Map createFormation(Team team, int formationNumber); +} diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/piece/Team.java index d22f81c863..c4b9ec91cb 100644 --- a/src/main/java/domain/piece/Team.java +++ b/src/main/java/domain/piece/Team.java @@ -9,4 +9,9 @@ public enum Team { Team(String teamName) { this.teamName = teamName; } + + @Override + public String toString() { + return teamName; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..8c07fb544c --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,27 @@ +package view; + +import domain.piece.Team; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); + + public Integer initialFormation(Team team) { + System.out.println(team + " 진영 배치 전략을 입력 하세요.\n1. 상마상마\n2. 마상마상\n3. 왼상\n4. 오른상 "); + try { + int parseNumber = Integer.parseInt(scanner.nextLine()); + return validRange(parseNumber); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자를 입력해주세요."); + } + + } + + private int validRange(int number) { + if (number < 1 || number > 4) { + throw new IllegalArgumentException("1 ~ 4 사이의 숫자로 입력해주세요."); + } + return number; + + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000000..d8f9743ccf --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,4 @@ +package view; + +public class OutputView { +} From 68304cdf759c2224ad3821f336f21168cf693ae6 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 26 Mar 2026 19:26:20 +0900 Subject: [PATCH 12/55] =?UTF-8?q?feat:=20BoardFactory=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/activePiece/Cannon.java | 2 +- src/main/java/domain/activePiece/Chariot.java | 2 +- src/main/java/domain/activePiece/General.java | 2 +- src/main/java/domain/activePiece/Guard.java | 2 +- src/main/java/domain/activePiece/Soldier.java | 2 +- src/main/java/domain/board/BoardFactory.java | 25 +++++++----- src/main/java/domain/piece/PieceType.java | 38 ++++++++++++++----- src/main/java/domain/piece/Team.java | 30 +++++++++++++-- 8 files changed, 77 insertions(+), 26 deletions(-) diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/activePiece/Cannon.java index 0e5da02da0..931483647d 100644 --- a/src/main/java/domain/activePiece/Cannon.java +++ b/src/main/java/domain/activePiece/Cannon.java @@ -6,7 +6,7 @@ public class Cannon extends ActivePiece { - protected Cannon(Team team) { + public Cannon(Team team) { super(team, PieceType.PHO); } diff --git a/src/main/java/domain/activePiece/Chariot.java b/src/main/java/domain/activePiece/Chariot.java index d60901ed4b..f373d346cb 100644 --- a/src/main/java/domain/activePiece/Chariot.java +++ b/src/main/java/domain/activePiece/Chariot.java @@ -7,7 +7,7 @@ public class Chariot extends ActivePiece { - protected Chariot(Team team) { + public Chariot(Team team) { super(team, PieceType.CHA); } diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java index ef69f7ec79..d9eae314de 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/activePiece/General.java @@ -9,7 +9,7 @@ public class General extends ActivePiece { private final List dx = List.of(-1, 1, 0, 0); private final List dy = List.of(0, 0, -1, 1); - protected General(Team team) { + public General(Team team) { super(team, PieceType.GENERAL); } diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java index 84f0e189e7..63fde0fdd7 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/activePiece/Guard.java @@ -9,7 +9,7 @@ public class Guard extends ActivePiece { private final List dx = List.of(-1, 1, 0, 0); private final List dy = List.of(0, 0, -1, 1); - protected Guard(Team team) { + public Guard(Team team) { super(team, PieceType.SA); } diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index 13f96310c0..ffe816c8a8 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -9,7 +9,7 @@ public class Soldier extends ActivePiece { private final List dx = List.of(-1, 1); private final List dy = List.of(0, 0); - protected Soldier(Team team) { + public Soldier(Team team) { super(team, PieceType.BYEONG); } diff --git a/src/main/java/domain/board/BoardFactory.java b/src/main/java/domain/board/BoardFactory.java index 1cb4cac6b6..f54e02fc12 100644 --- a/src/main/java/domain/board/BoardFactory.java +++ b/src/main/java/domain/board/BoardFactory.java @@ -2,24 +2,31 @@ import domain.Position; import domain.piece.Piece; +import domain.piece.PieceType; import domain.piece.Team; +import java.util.HashMap; import java.util.Map; public class BoardFactory implements FormationFactory { - @Override - public Map createFormation(Team team, int formationNumber) { - return Map.of(); - } - - /* @Override public Map createFormation(Team team, int formationNumber) { - Map pieces = new HashMap<>(); + Map pieces = new HashMap<>(); setFixedPieces(pieces, team); + return pieces; } private void setFixedPieces(Map pieces, Team team) { - pieces.put(new Position(0,0), new Piece(team)); - } */ + placePieces(pieces, team, team.getBackRow(), PieceType.CHA); + placePieces(pieces, team, team.getBackRow(), PieceType.SA); + placePieces(pieces, team, team.getGeneralRow(), PieceType.GENERAL); + placePieces(pieces, team, team.getCannonRow(), PieceType.PHO); + placePieces(pieces, team, team.getSoldierRow(), PieceType.BYEONG); + } + + private void placePieces(Map pieces, Team team, int row, PieceType type) { + for (int column : type.getInitialColumns()) { + pieces.put(new Position(row, column), type.createPiece(team)); + } + } } diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index 7e58a8cdc0..ff33916300 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -1,18 +1,38 @@ package domain.piece; +import domain.activePiece.Cannon; +import domain.activePiece.Chariot; +import domain.activePiece.General; +import domain.activePiece.Guard; +import domain.activePiece.Soldier; +import java.util.List; +import java.util.function.Function; + public enum PieceType { - CHA(13.0), - MA(5.0), - SANG(3.0), - SA(3.0), - GENERAL(0.0), - PHO(7.0), - BYEONG(2.0), - EMPTY(0.0); + CHA(13.0, List.of(1, 9), Chariot::new), + MA(5.0, List.of(3, 7), null), + SANG(3.0, List.of(3, 7), null), + SA(3.0, List.of(4, 6), Guard::new), + GENERAL(0.0, List.of(5), General::new), + PHO(7.0, List.of(2, 8), Cannon::new), + BYEONG(2.0, List.of(1, 3, 5, 7, 9), Soldier::new), + EMPTY(0.0, List.of(), null); private final double score; + private final List initialColumns; + private final Function pieceFactory; - PieceType(double score) { + PieceType(double score, List initialColumns, Function pieceFactory) { this.score = score; + this.initialColumns = initialColumns; + this.pieceFactory = pieceFactory; + } + + public List getInitialColumns() { + return initialColumns; + } + + public Piece createPiece(Team team) { + return pieceFactory.apply(team); } } diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/piece/Team.java index c4b9ec91cb..6f616dbf8c 100644 --- a/src/main/java/domain/piece/Team.java +++ b/src/main/java/domain/piece/Team.java @@ -1,13 +1,37 @@ package domain.piece; public enum Team { - CHO("초"), - HAN("한"); + CHO("초", 1, 2, 3, 4), + HAN("한", 10, 9, 8, 7); private final String teamName; + private final int backRow; + private final int generalRow; + private final int cannonRow; + private final int soldierRow; - Team(String teamName) { + Team(String teamName, int backRow, int generalRow, int cannonRow, int soldierRow) { this.teamName = teamName; + this.backRow = backRow; + this.generalRow = generalRow; + this.cannonRow = cannonRow; + this.soldierRow = soldierRow; + } + + public int getBackRow() { + return backRow; + } + + public int getGeneralRow() { + return generalRow; + } + + public int getCannonRow() { + return cannonRow; + } + + public int getSoldierRow() { + return soldierRow; } @Override From 0d17919d77208c6bcdfeba95023c1e9ac2d1e8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Thu, 26 Mar 2026 20:02:32 +0900 Subject: [PATCH 13/55] =?UTF-8?q?feat:=20=EB=B0=B0=EC=B9=98=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 --- .../java/controller/JanggiController.java | 1 + ...Factory.java => AbstractBoardFactory.java} | 5 +++- .../java/domain/board/LeftGwimaFactory.java | 21 +++++++++++++++++ .../java/domain/board/RightGwimaFactory.java | 23 +++++++++++++++++++ .../java/domain/board/WonangmaFactory.java | 21 +++++++++++++++++ .../java/domain/board/YanggwimaFactory.java | 21 +++++++++++++++++ src/main/java/domain/piece/PieceType.java | 4 ++-- 7 files changed, 93 insertions(+), 3 deletions(-) rename src/main/java/domain/board/{BoardFactory.java => AbstractBoardFactory.java} (84%) create mode 100644 src/main/java/domain/board/LeftGwimaFactory.java create mode 100644 src/main/java/domain/board/RightGwimaFactory.java create mode 100644 src/main/java/domain/board/WonangmaFactory.java create mode 100644 src/main/java/domain/board/YanggwimaFactory.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 0099206c70..01685f5c58 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -13,5 +13,6 @@ public JanggiController(InputView inputView) { public void run() { int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); + } } diff --git a/src/main/java/domain/board/BoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java similarity index 84% rename from src/main/java/domain/board/BoardFactory.java rename to src/main/java/domain/board/AbstractBoardFactory.java index f54e02fc12..27f017d0e7 100644 --- a/src/main/java/domain/board/BoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -7,12 +7,13 @@ import java.util.HashMap; import java.util.Map; -public class BoardFactory implements FormationFactory { +public abstract class AbstractBoardFactory implements FormationFactory { @Override public Map createFormation(Team team, int formationNumber) { Map pieces = new HashMap<>(); setFixedPieces(pieces, team); + setVariablePieces(pieces, team); return pieces; } @@ -29,4 +30,6 @@ private void placePieces(Map pieces, Team team, int row, PieceT pieces.put(new Position(row, column), type.createPiece(team)); } } + + protected abstract void setVariablePieces(Map pieces, Team team); } diff --git a/src/main/java/domain/board/LeftGwimaFactory.java b/src/main/java/domain/board/LeftGwimaFactory.java new file mode 100644 index 0000000000..43645f2595 --- /dev/null +++ b/src/main/java/domain/board/LeftGwimaFactory.java @@ -0,0 +1,21 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.PieceType; +import domain.piece.Team; +import java.util.Map; + +public class LeftGwimaFactory extends AbstractBoardFactory { + @Override + protected void setVariablePieces(Map pieces, Team team) { + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(0)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(1)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(2)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(3)), + PieceType.MA.createPiece(team)); + } +} diff --git a/src/main/java/domain/board/RightGwimaFactory.java b/src/main/java/domain/board/RightGwimaFactory.java new file mode 100644 index 0000000000..9d4e34511b --- /dev/null +++ b/src/main/java/domain/board/RightGwimaFactory.java @@ -0,0 +1,23 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.PieceType; +import domain.piece.Team; +import java.util.Map; + +public class RightGwimaFactory extends AbstractBoardFactory { + @Override + protected void setVariablePieces(Map pieces, Team team) { + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(0)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(1)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(2)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(3)), + PieceType.SANG.createPiece(team)); + } +} + + diff --git a/src/main/java/domain/board/WonangmaFactory.java b/src/main/java/domain/board/WonangmaFactory.java new file mode 100644 index 0000000000..b4fe7d1554 --- /dev/null +++ b/src/main/java/domain/board/WonangmaFactory.java @@ -0,0 +1,21 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.PieceType; +import domain.piece.Team; +import java.util.Map; + +public class WonangmaFactory extends AbstractBoardFactory { + @Override + protected void setVariablePieces(Map pieces, Team team) { + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(0)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(1)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(2)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(3)), + PieceType.SANG.createPiece(team)); + } +} diff --git a/src/main/java/domain/board/YanggwimaFactory.java b/src/main/java/domain/board/YanggwimaFactory.java new file mode 100644 index 0000000000..e0c96a9714 --- /dev/null +++ b/src/main/java/domain/board/YanggwimaFactory.java @@ -0,0 +1,21 @@ +package domain.board; + +import domain.Position; +import domain.piece.Piece; +import domain.piece.PieceType; +import domain.piece.Team; +import java.util.Map; + +public class YanggwimaFactory extends AbstractBoardFactory { + @Override + protected void setVariablePieces(Map pieces, Team team) { + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(0)), + PieceType.MA.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(1)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.SANG.getInitialColumns().get(2)), + PieceType.SANG.createPiece(team)); + pieces.put(new Position(team.getBackRow(), PieceType.MA.getInitialColumns().get(3)), + PieceType.MA.createPiece(team)); + } +} diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index ff33916300..2cf3170246 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -10,8 +10,8 @@ public enum PieceType { CHA(13.0, List.of(1, 9), Chariot::new), - MA(5.0, List.of(3, 7), null), - SANG(3.0, List.of(3, 7), null), + MA(5.0, List.of(2, 3, 7, 8), null), + SANG(3.0, List.of(2, 3, 7, 8), null), SA(3.0, List.of(4, 6), Guard::new), GENERAL(0.0, List.of(5), General::new), PHO(7.0, List.of(2, 8), Cannon::new), From ccfa0e44f969b9d0eab5a77f150e1ff65d17bf04 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 26 Mar 2026 21:24:18 +0900 Subject: [PATCH 14/55] =?UTF-8?q?feat:=20=EC=B0=A8=EB=A6=BC=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=ED=9B=84=20=EB=B3=B4=EB=93=9C=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=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/JanggiApplication.java | 3 +- .../java/controller/JanggiController.java | 44 ++++++++++++++++++- src/main/java/domain/Column.java | 5 +++ src/main/java/domain/Position.java | 16 +++++++ src/main/java/domain/Row.java | 5 +++ .../java/domain/activePiece/ActivePiece.java | 5 +++ .../java/domain/activePiece/Elephant.java | 2 +- src/main/java/domain/activePiece/Horse.java | 2 +- .../domain/board/AbstractBoardFactory.java | 2 +- .../java/domain/board/FormationFactory.java | 2 +- src/main/java/domain/piece/EmptyPiece.java | 5 +++ src/main/java/domain/piece/PieceType.java | 26 +++++++---- src/main/java/domain/piece/Team.java | 14 ++++-- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 21 +++++++++ 15 files changed, 135 insertions(+), 19 deletions(-) diff --git a/src/main/java/JanggiApplication.java b/src/main/java/JanggiApplication.java index 07810cc2c7..cf818d44ae 100644 --- a/src/main/java/JanggiApplication.java +++ b/src/main/java/JanggiApplication.java @@ -1,9 +1,10 @@ import controller.JanggiController; import view.InputView; +import view.OutputView; public class JanggiApplication { public static void main(String[] args) { - JanggiController janggiController = new JanggiController(new InputView()); + 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 index 01685f5c58..460d5b5f01 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,18 +1,60 @@ package controller; +import domain.Position; +import domain.board.LeftGwimaFactory; +import domain.board.RightGwimaFactory; +import domain.board.WonangmaFactory; +import domain.board.YanggwimaFactory; +import domain.piece.Piece; import domain.piece.Team; +import java.util.HashMap; +import java.util.Map; import view.InputView; +import view.OutputView; public class JanggiController { private final InputView inputView; + private final OutputView outputView; - public JanggiController(InputView inputView) { + public JanggiController(InputView inputView, OutputView outputView) { this.inputView = inputView; + this.outputView = outputView; } public void run() { int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); + Map choBoard = initialBoard(choFormationNumber,Team.CHO); + Map hanBoard = initialBoard(hanFormationNumber,Team.HAN); + + Map board = new HashMap<>(); + + board.putAll(choBoard); + board.putAll(hanBoard); + + outputView.printBoard(board); + + + + + + + } + + private Map initialBoard(int input,Team team) { + if (input == 1) { + return new LeftGwimaFactory().createFormation(team); + } + + if (input == 2) { + return new RightGwimaFactory().createFormation(team); + } + + if (input == 3) { + return new WonangmaFactory().createFormation(team); + } + + return new YanggwimaFactory().createFormation(team); } } diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index 05f73b5467..c5c069e730 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -26,4 +26,9 @@ public boolean equals(Object o) { Column column = (Column) o; return value == column.value; } + + @Override + public int hashCode() { + return Integer.hashCode(value); + } } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 98fd9de08f..ce2b23a292 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -1,5 +1,7 @@ package domain; +import java.util.Objects; + public class Position { private final Row row; private final Column column; @@ -24,4 +26,18 @@ public int rowDiff(Position other) { public int columnDiff(Position other) { return this.column.diff(other.column); } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Position position = (Position) o; + return row.equals(position.row) && column.equals(position.column); + } + + @Override + public int hashCode() { + return Objects.hash(row, column); + } } diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index 559feda695..f5b8231177 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -26,4 +26,9 @@ public boolean equals(Object o) { Row row = (Row) o; return value == row.value; } + + @Override + public int hashCode() { + return Integer.hashCode(value); + } } diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java index 33dd4aeb29..a67b7dbb9a 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -16,4 +16,9 @@ protected ActivePiece(Team team, PieceType type) { public boolean isSameTeam(Team other) { return this.team == other; } + + @Override + public String toString() { + return team.colorize(type.getDisplayName()); + } } diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index 3ce0c93def..c380de39b7 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -10,7 +10,7 @@ public class Elephant extends ActivePiece { private final List dx = List.of(2, 3, -2, -3, -3, -2, 2, 3); private final List dy = List.of(3, 2, 3, 2, -2, -3, -3, -2); - protected Elephant(Team team) { + public Elephant(Team team) { super(team, PieceType.SANG); } diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index b69b6ad2b7..abd075985c 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -10,7 +10,7 @@ public class Horse extends ActivePiece { private final List dx = List.of(1, 2, 2, 1, -1, -2, -2, -1); private final List dy = List.of(2, 1, -1, -2, -2, -1, 1, 2); - protected Horse(Team team) { + public Horse(Team team) { super(team, PieceType.MA); } diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index 27f017d0e7..2924a5f011 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -10,7 +10,7 @@ public abstract class AbstractBoardFactory implements FormationFactory { @Override - public Map createFormation(Team team, int formationNumber) { + public Map createFormation(Team team) { Map pieces = new HashMap<>(); setFixedPieces(pieces, team); setVariablePieces(pieces, team); diff --git a/src/main/java/domain/board/FormationFactory.java b/src/main/java/domain/board/FormationFactory.java index 72a35b5ed3..1333019c9c 100644 --- a/src/main/java/domain/board/FormationFactory.java +++ b/src/main/java/domain/board/FormationFactory.java @@ -6,5 +6,5 @@ import java.util.Map; public interface FormationFactory { - Map createFormation(Team team, int formationNumber); + Map createFormation(Team team); } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index cdf5943795..edd234f39c 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -8,4 +8,9 @@ public class EmptyPiece implements Piece { public boolean canMove(Position source, Position target) { return false; } + + @Override + public String toString() { + return PieceType.EMPTY.getDisplayName(); + } } diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index 2cf3170246..8feade7d95 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -2,32 +2,40 @@ import domain.activePiece.Cannon; import domain.activePiece.Chariot; +import domain.activePiece.Elephant; import domain.activePiece.General; import domain.activePiece.Guard; +import domain.activePiece.Horse; import domain.activePiece.Soldier; import java.util.List; import java.util.function.Function; public enum PieceType { - CHA(13.0, List.of(1, 9), Chariot::new), - MA(5.0, List.of(2, 3, 7, 8), null), - SANG(3.0, List.of(2, 3, 7, 8), null), - SA(3.0, List.of(4, 6), Guard::new), - GENERAL(0.0, List.of(5), General::new), - PHO(7.0, List.of(2, 8), Cannon::new), - BYEONG(2.0, List.of(1, 3, 5, 7, 9), Soldier::new), - EMPTY(0.0, List.of(), null); + CHA(13.0, "차", List.of(1, 9), Chariot::new), + MA(5.0, "마", List.of(2, 3, 7, 8), Horse::new), + SANG(3.0, "상", List.of(2, 3, 7, 8), Elephant::new), + SA(3.0, "사", List.of(4, 6), Guard::new), + GENERAL(0.0, "궁", List.of(5), General::new), + PHO(7.0, "포", List.of(2, 8), Cannon::new), + BYEONG(2.0, "병", List.of(1, 3, 5, 7, 9), Soldier::new), + EMPTY(0.0, "ㅡ", List.of(), team -> new EmptyPiece()); private final double score; + private final String displayName; private final List initialColumns; private final Function pieceFactory; - PieceType(double score, List initialColumns, Function pieceFactory) { + PieceType(double score, String displayName, List initialColumns, Function pieceFactory) { this.score = score; + this.displayName = displayName; this.initialColumns = initialColumns; this.pieceFactory = pieceFactory; } + public String getDisplayName() { + return displayName; + } + public List getInitialColumns() { return initialColumns; } diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/piece/Team.java index 6f616dbf8c..5d59b8073c 100644 --- a/src/main/java/domain/piece/Team.java +++ b/src/main/java/domain/piece/Team.java @@ -1,23 +1,31 @@ package domain.piece; public enum Team { - CHO("초", 1, 2, 3, 4), - HAN("한", 10, 9, 8, 7); + CHO("초", "\u001B[34m", 1, 2, 3, 4), + HAN("한", "\u001B[31m", 10, 9, 8, 7); + + private static final String RESET = "\u001B[0m"; private final String teamName; + private final String colorCode; private final int backRow; private final int generalRow; private final int cannonRow; private final int soldierRow; - Team(String teamName, int backRow, int generalRow, int cannonRow, int soldierRow) { + Team(String teamName, String colorCode, int backRow, int generalRow, int cannonRow, int soldierRow) { this.teamName = teamName; + this.colorCode = colorCode; this.backRow = backRow; this.generalRow = generalRow; this.cannonRow = cannonRow; this.soldierRow = soldierRow; } + public String colorize(String text) { + return colorCode + text + RESET; + } + public int getBackRow() { return backRow; } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 8c07fb544c..3909d00c05 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -7,7 +7,7 @@ public class InputView { private final Scanner scanner = new Scanner(System.in); public Integer initialFormation(Team team) { - System.out.println(team + " 진영 배치 전략을 입력 하세요.\n1. 상마상마\n2. 마상마상\n3. 왼상\n4. 오른상 "); + System.out.println(team + " 진영 배치 전략을 입력 하세요.\n1. 왼상\n2. 오른상\n3. 원앙마\n4. 양귀마 "); try { int parseNumber = Integer.parseInt(scanner.nextLine()); return validRange(parseNumber); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index d8f9743ccf..ef15f2aace 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,4 +1,25 @@ package view; +import domain.Position; +import domain.piece.EmptyPiece; +import domain.piece.Piece; +import java.util.Map; + public class OutputView { + + private static final int MAX_ROW = 10; + private static final int MAX_COLUMN = 9; + private static final Piece EMPTY = new EmptyPiece(); + + public void printBoard(Map board) { + StringBuilder sb = new StringBuilder(); + for (int row = MAX_ROW; row >= 1; row--) { + for (int col = 1; col <= MAX_COLUMN; col++) { + Piece piece = board.getOrDefault(new Position(row, col), EMPTY); + sb.append(piece.toString()).append("\t"); + } + sb.append(System.lineSeparator()); + } + System.out.println(sb); + } } From 95ed613445d8edf6bf712bfbf303184ed5b05cd5 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 26 Mar 2026 21:25:54 +0900 Subject: [PATCH 15/55] =?UTF-8?q?refactor:=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 460d5b5f01..04f1f0e2e3 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -34,12 +34,6 @@ public void run() { board.putAll(hanBoard); outputView.printBoard(board); - - - - - - } private Map initialBoard(int input,Team team) { From 212f889321acdd04ffab88796acc42318ad0ad98 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Fri, 27 Mar 2026 17:53:47 +0900 Subject: [PATCH 16/55] =?UTF-8?q?feat:=20Cha=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=EA=B5=AC=ED=98=841?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 6 +++++- src/main/java/domain/Position.java | 18 ++++++++++++++++++ .../java/domain/activePiece/ActivePiece.java | 4 ++++ src/main/java/domain/activePiece/Cannon.java | 9 +++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 04f1f0e2e3..31eea84d27 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -22,6 +22,7 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { + // 보드 초기화 int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); @@ -32,8 +33,11 @@ public void run() { board.putAll(choBoard); board.putAll(hanBoard); - + // 초기화된 보드 출력 outputView.printBoard(board); + // 기물 이동 <-> 보드 출력 반복 + // 이동 위치 입력 받기 + } private Map initialBoard(int input,Team team) { diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index ce2b23a292..43ca458ea7 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -1,5 +1,7 @@ package domain; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class Position { @@ -27,6 +29,22 @@ public int columnDiff(Position other) { return this.column.diff(other.column); } + public List makeColStraightRoute(Position other) { + List routes = new ArrayList<>(); + for (int i = Math.min(this.column, other.column); i <= dest; i++) { + routes.add(new Position(i, col)); + } + return routes; + } + + public List makeRowStraightRoute(int row, int src, int dest) { + List routes = new ArrayList<>(); + for (int i = src; i <= dest; i++) { + routes.add(new Position(row, i)); + } + return routes; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java index a67b7dbb9a..e7e568a27d 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -1,8 +1,10 @@ package domain.activePiece; +import domain.Position; import domain.piece.Piece; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public abstract class ActivePiece implements Piece { private final Team team; @@ -17,6 +19,8 @@ public boolean isSameTeam(Team other) { return this.team == other; } + public abstract List searchRoute(Position source, Position target); + @Override public String toString() { return team.colorize(type.getDisplayName()); diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/activePiece/Cannon.java index 931483647d..670a1f6ca4 100644 --- a/src/main/java/domain/activePiece/Cannon.java +++ b/src/main/java/domain/activePiece/Cannon.java @@ -3,6 +3,8 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; public class Cannon extends ActivePiece { @@ -14,4 +16,11 @@ public Cannon(Team team) { public boolean canMove(Position source, Position target) { return source.isSameCol(target) || source.isSameRow(target); } + + @Override + public List searchRoute(Position source, Position target) { + List route = new ArrayList<>(); + if (source.isSameCol(target)) { + return Posi + } } From b586fd8b72e1eeba90f561cce3c9f6717a38cf8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Fri, 27 Mar 2026 19:17:07 +0900 Subject: [PATCH 17/55] =?UTF-8?q?feat:=20=ED=8F=AC,=EC=B0=A8,=EA=B6=81,?= =?UTF-8?q?=EC=82=AC=20=EC=9D=B4=EB=8F=99=20=EA=B2=BD=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=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/domain/Column.java | 8 +++++ src/main/java/domain/Position.java | 19 +++++++--- src/main/java/domain/Row.java | 8 +++++ src/main/java/domain/activePiece/Cannon.java | 7 ++-- src/main/java/domain/activePiece/Chariot.java | 10 ++++++ .../java/domain/activePiece/Elephant.java | 5 +++ src/main/java/domain/activePiece/General.java | 5 +++ src/main/java/domain/activePiece/Guard.java | 5 +++ src/main/java/domain/activePiece/Horse.java | 5 +++ src/main/java/domain/activePiece/Soldier.java | 5 +++ .../java/domain/activePiece/CannonTest.java | 35 +++++++++++++++++-- .../java/domain/activePiece/ChariotTest.java | 35 +++++++++++++++++-- 12 files changed, 133 insertions(+), 14 deletions(-) diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index c5c069e730..e4f27bc403 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -14,6 +14,14 @@ private void validate(int value) { } } + public int min(Column other) { + return Math.min(other.value, value); + } + + public int max(Column other) { + return Math.max(other.value, value); + } + public int diff(Column other) { return this.value - other.value; } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 43ca458ea7..9e9444fdd6 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -13,6 +13,11 @@ public Position(int row, int column) { this.column = new Column(column); } + public Position(Row row, Column column) { + this.row = row; + this.column = column; + } + public boolean isSameRow(Position other) { return other.row.equals(this.row); } @@ -31,16 +36,20 @@ public int columnDiff(Position other) { public List makeColStraightRoute(Position other) { List routes = new ArrayList<>(); - for (int i = Math.min(this.column, other.column); i <= dest; i++) { - routes.add(new Position(i, col)); + int start = other.column.min(this.column); + int dest = other.column.max(this.column); + for (int i = start; i <= dest; i++) { + routes.add(new Position(other.row, new Column(i))); } return routes; } - public List makeRowStraightRoute(int row, int src, int dest) { + public List makeRowStraightRoute(Position other) { List routes = new ArrayList<>(); - for (int i = src; i <= dest; i++) { - routes.add(new Position(row, i)); + int start = other.row.min(this.row); + int dest = other.row.max(this.row); + for (int i = start; i <= dest; i++) { + routes.add(new Position(new Row(i), other.column)); } return routes; } diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index f5b8231177..33e064a55c 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -14,6 +14,14 @@ private void validate(int value) { } } + public int min(Row other) { + return Math.min(other.value, value); + } + + public int max(Row other) { + return Math.max(other.value, value); + } + public int diff(Row other) { return this.value - other.value; } diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/activePiece/Cannon.java index 670a1f6ca4..0bf823c3ac 100644 --- a/src/main/java/domain/activePiece/Cannon.java +++ b/src/main/java/domain/activePiece/Cannon.java @@ -3,7 +3,6 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; -import java.util.ArrayList; import java.util.List; public class Cannon extends ActivePiece { @@ -19,8 +18,10 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - List route = new ArrayList<>(); if (source.isSameCol(target)) { - return Posi + return source.makeRowStraightRoute(target); + } + + return source.makeColStraightRoute(target); } } diff --git a/src/main/java/domain/activePiece/Chariot.java b/src/main/java/domain/activePiece/Chariot.java index f373d346cb..7f46f02573 100644 --- a/src/main/java/domain/activePiece/Chariot.java +++ b/src/main/java/domain/activePiece/Chariot.java @@ -4,6 +4,7 @@ import domain.Position; import domain.piece.PieceType; import domain.piece.Team; +import java.util.List; public class Chariot extends ActivePiece { @@ -15,4 +16,13 @@ public Chariot(Team team) { public boolean canMove(Position source, Position target) { return source.isSameCol(target) || source.isSameRow(target); } + + @Override + public List searchRoute(Position source, Position target) { + if (source.isSameCol(target)) { + return source.makeRowStraightRoute(target); + } + + return source.makeColStraightRoute(target); + } } diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index c380de39b7..0bc1a6f798 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -26,4 +26,9 @@ public boolean canMove(Position source, Position target) { } return false; } + + @Override + public List searchRoute(Position source, Position target) { + return List.of(); + } } diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java index d9eae314de..c2f7420d5d 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/activePiece/General.java @@ -25,4 +25,9 @@ public boolean canMove(Position source, Position target) { } return false; } + + @Override + public List searchRoute(Position source, Position target) { + return List.of(source, target); + } } diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java index 63fde0fdd7..66249b540c 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/activePiece/Guard.java @@ -25,4 +25,9 @@ public boolean canMove(Position source, Position target) { } return false; } + + @Override + public List searchRoute(Position source, Position target) { + return List.of(source, target); + } } diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index abd075985c..b1528ac436 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -26,4 +26,9 @@ public boolean canMove(Position source, Position target) { } return false; } + + @Override + public List searchRoute(Position source, Position target) { + return List.of(); + } } diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index ffe816c8a8..537d7897e8 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -41,4 +41,9 @@ private boolean isValidDirection(Position source, Position target) { } return false; } + + @Override + public List searchRoute(Position source, Position target) { + return List.of(); + } } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index b7e8bff6ea..fdfb505c80 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -1,11 +1,14 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import domain.Column; import domain.Position; +import domain.Row; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class CannonTest { @@ -13,15 +16,41 @@ class CannonTest { @Test void 포는_직선_운동한다() { Piece cannon = new Cannon(Team.HAN); - assertThat(cannon.canMove(new Position(1,4), new Position(1,8))).isTrue(); + assertThat(cannon.canMove(new Position(1, 4), new Position(1, 8))).isTrue(); } @Test void 포는_직선이_아닌_방향으로_가지_못한다() { Piece cannon = new Cannon(Team.HAN); - assertThat(cannon.canMove(new Position(5,5), new Position(3,3))).isFalse(); + assertThat(cannon.canMove(new Position(5, 5), new Position(3, 3))).isFalse(); } + @Test + void 직선_방향_경로를_출력_한다() { + ActivePiece cannon = new Cannon(Team.HAN); + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(4), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)), + new Position(new Row(3), new Column(3)), + new Position(new Row(4), new Column(3)))); + + assertThat(cannon.searchRoute(src, dest)).isEqualTo(routes); + } + + @Test + void 잘못된_직선_방향_경로를_출력_한다() { + ActivePiece cannon = new Cannon(Team.HAN); + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(4), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(4)), new Position(new Row(3), new Column(4)), + new Position(new Row(5), new Column(4)), + new Position(new Row(7), new Column(4)))); + + assertThat(cannon.searchRoute(src, dest)).isNotEqualTo(routes); + } + } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index 60828ead9e..cfd2f96406 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -1,11 +1,14 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import domain.Column; import domain.Position; +import domain.Row; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class ChariotTest { @@ -13,15 +16,41 @@ class ChariotTest { @Test void 차는_직선_운동한다() { Piece cha = new Chariot(Team.HAN); - assertThat(cha.canMove(new Position(1,4), new Position(1,8))).isTrue(); + assertThat(cha.canMove(new Position(1, 4), new Position(1, 8))).isTrue(); } @Test void 차는_직선이_아닌_방향으로_가지_못한다() { Piece cha = new Chariot(Team.HAN); - assertThat(cha.canMove(new Position(5,5), new Position(3,3))).isFalse(); + assertThat(cha.canMove(new Position(5, 5), new Position(3, 3))).isFalse(); } + @Test + void 직선_방향_경로를_출력_한다() { + ActivePiece chariot = new Chariot(Team.HAN); + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(4), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)), + new Position(new Row(3), new Column(3)), + new Position(new Row(4), new Column(3)))); + + assertThat(chariot.searchRoute(src, dest)).isEqualTo(routes); + } + + @Test + void 잘못된_직선_방향_경로를_출력_한다() { + ActivePiece chariot = new Chariot(Team.HAN); + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(4), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(4)), new Position(new Row(3), new Column(4)), + new Position(new Row(5), new Column(4)), + new Position(new Row(7), new Column(4)))); + + assertThat(chariot.searchRoute(src, dest)).isNotEqualTo(routes); + } + } From f1ee429945939d3cc0b6063cc5b73c954bb3315c Mon Sep 17 00:00:00 2001 From: picetea44 Date: Fri, 27 Mar 2026 19:22:46 +0900 Subject: [PATCH 18/55] =?UTF-8?q?test:=20=EA=B6=81,=EC=82=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/activePiece/GeneralTest.java | 29 +++++++++++++++++++ .../java/domain/activePiece/GuardTest.java | 27 +++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index d258cbe332..8d31d297fe 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -3,9 +3,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import domain.Column; import domain.Position; +import domain.Row; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class GeneralTest { @@ -21,5 +25,30 @@ class GeneralTest { assertThat(general.canMove(new Position(5,5), new Position(6,6))).isFalse(); } + @Test + void 궁_정상_경로_출력_한다() { + ActivePiece general = new General(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + + assertThat(general.searchRoute(src,dest)).isEqualTo(routes); + } + + @Test + void 궁_비정상_경로_출력_한다() { + ActivePiece general = new General(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + + assertThat(general.searchRoute(src,dest)).isNotEqualTo(routes); + } + + } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 5b314743b6..12e7611036 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -3,9 +3,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import domain.Column; import domain.Position; +import domain.Row; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class GuardTest { @@ -20,6 +24,29 @@ class GuardTest { Piece guard = new Guard(Team.HAN); assertThat(guard.canMove(new Position(5,5), new Position(8,8))).isFalse(); } + @Test + void 사_정상_경로_출력_한다() { + ActivePiece guard = new Guard(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + + assertThat(guard.searchRoute(src,dest)).isEqualTo(routes); + } + + @Test + void 사_비정상_경로_출력_한다() { + ActivePiece guard = new Guard(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + + assertThat(guard.searchRoute(src,dest)).isNotEqualTo(routes); + } } From bf366d0ecc9c9ffef313cf7a183d49a39b38bb8e Mon Sep 17 00:00:00 2001 From: picetea44 Date: Fri, 27 Mar 2026 20:05:45 +0900 Subject: [PATCH 19/55] =?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=EA=B2=BD=EB=A1=9C=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Column.java | 4 ++++ src/main/java/domain/Position.java | 4 ++++ src/main/java/domain/Row.java | 4 ++++ src/main/java/domain/activePiece/Horse.java | 9 ++++++- .../java/domain/activePiece/HorseTest.java | 24 +++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index e4f27bc403..a91950e4dd 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -26,6 +26,10 @@ public int diff(Column other) { return this.value - other.value; } + public Column add(int measure) { + return new Column(this.value + measure); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 9e9444fdd6..bcc048607f 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -54,6 +54,10 @@ public List makeRowStraightRoute(Position other) { return routes; } + public Position addPosition(int x, int y) { + return new Position(this.row.add(x), this.column.add(y)); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index 33e064a55c..4a7ab79f5c 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -26,6 +26,10 @@ public int diff(Row other) { return this.value - other.value; } + public Row add(int measure) { + return new Row(this.value + measure); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index b1528ac436..cb751fc86b 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -1,6 +1,7 @@ package domain.activePiece; import domain.Position; +import domain.Row; import domain.piece.PieceType; import domain.piece.Team; import java.util.List; @@ -29,6 +30,12 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(); + if (source.columnDiff(target) == -2) + return List.of(source, source.addPosition(0,1),target); + if (source.columnDiff(target) == 2) + return List.of(source, source.addPosition(0,-1),target); + if (source.rowDiff(target) == -2) + return List.of(source, source.addPosition(1,0),target); + return List.of(source, source.addPosition(-1,0),target); } } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index 4b9426b289..3dcdab8e9c 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -6,6 +6,8 @@ import domain.Position; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class HorseTest { @@ -21,5 +23,27 @@ class HorseTest { assertThat(horse.canMove(new Position(5,5), new Position(8,8))).isFalse(); } + @Test + void 마_정상_경로_출력() { + ActivePiece horse = new Horse(Team.HAN); + Position src = new Position(3, 3); + Position mid = new Position(4,3); + Position dest = new Position(5,4); + List routes = List.of(src, mid, dest); + + assertThat(horse.searchRoute(src, dest)).isEqualTo(routes); + } + + @Test + void 마_비정상_경로_출력() { + ActivePiece horse = new Horse(Team.HAN); + Position src = new Position(3, 3); + Position mid = new Position(6,3); + Position dest = new Position(7,3); + List routes = new ArrayList<>(List.of(src, mid, dest)); + + assertThat(horse.searchRoute(src, dest)).isNotEqualTo(routes); + } + } From 6db9326f33fa006c248d4af3694df2b3952dbbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Fri, 27 Mar 2026 20:44:12 +0900 Subject: [PATCH 20/55] =?UTF-8?q?feat:=20=EC=83=81=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EA=B2=BD=EB=A1=9C=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=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/domain/Column.java | 4 +++ src/main/java/domain/Position.java | 4 +++ src/main/java/domain/Row.java | 4 +++ .../java/domain/activePiece/Elephant.java | 15 +++++++++- .../java/domain/activePiece/ElephantTest.java | 30 +++++++++++++++++-- 5 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/Column.java index a91950e4dd..a31911a239 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/Column.java @@ -14,6 +14,10 @@ private void validate(int value) { } } + public Column divide(Column col) { + return new Column((this.value + col.value) / 2); + } + public int min(Column other) { return Math.min(other.value, value); } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index bcc048607f..dd0078e672 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -58,6 +58,10 @@ public Position addPosition(int x, int y) { return new Position(this.row.add(x), this.column.add(y)); } + public Position middlePosition(Position other) { + return new Position(this.row.divide(other.row), this.column.divide(other.column)); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/Row.java index 4a7ab79f5c..3e91321520 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/Row.java @@ -30,6 +30,10 @@ public Row add(int measure) { return new Row(this.value + measure); } + public Row divide(Row row) { + return new Row((this.value + row.value) / 2); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index 0bc1a6f798..ba75d27f42 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -29,6 +29,19 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(); + if (source.columnDiff(target) == -3) { + Position mid = source.addPosition(0, 1); + return List.of(source, mid, source.addPosition(0, 1), mid.middlePosition(target), target); + } + if (source.columnDiff(target) == 3) { + Position mid = source.addPosition(0, -1); + return List.of(source, mid, mid.middlePosition(target), target); + } + if (source.rowDiff(target) == -3) { + Position mid = source.addPosition(1, 0); + return List.of(source, mid, mid.middlePosition(target), target); + } + Position mid = source.addPosition(-1, 0); + return List.of(source, mid, mid.middlePosition(target), target); } } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index f3d39cd7d5..f5cef96bf7 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -1,11 +1,11 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import domain.Position; import domain.piece.Piece; import domain.piece.Team; +import java.util.List; import org.junit.jupiter.api.Test; class ElephantTest { @@ -13,12 +13,36 @@ class ElephantTest { @Test void 정상_범위_입력() { Piece elephant = new Elephant(Team.HAN); - assertThat(elephant.canMove(new Position(5,5), new Position(7,8))).isTrue(); + assertThat(elephant.canMove(new Position(5, 5), new Position(7, 8))).isTrue(); } + @Test void 정상_범위가_아니면_거짓() { Piece elephant = new Elephant(Team.HAN); - assertThat(elephant.canMove(new Position(5,5), new Position(8,8))).isFalse(); + assertThat(elephant.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); + } + + @Test + void 상_정상_경로_출력() { + ActivePiece elephant = new Elephant(Team.HAN); + Position src = new Position(3, 3); + Position mid = new Position(4, 3); + Position mid2 = new Position(5, 4); + Position dest = new Position(6, 5); + List routes = List.of(src, mid, mid2, dest); + + assertThat(elephant.searchRoute(src, dest)).isEqualTo(routes); } + @Test + void 상_비정상_경로_출력() { + ActivePiece elephant = new Elephant(Team.HAN); + Position src = new Position(3, 3); + Position mid = new Position(5, 6); + Position mid2 = new Position(7, 7); + Position dest = new Position(8, 9); + List routes = List.of(src, mid, mid2, dest); + + assertThat(elephant.searchRoute(src, dest)).isNotEqualTo(routes); + } } From fbb114366403fffef2cb2965633e4d76515179f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Fri, 27 Mar 2026 20:47:54 +0900 Subject: [PATCH 21/55] =?UTF-8?q?feat:=20=EB=B3=91=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EA=B2=BD=EB=A1=9C=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=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/domain/activePiece/Soldier.java | 2 +- .../java/domain/activePiece/CannonTest.java | 1 - .../java/domain/activePiece/ChariotTest.java | 1 - .../java/domain/activePiece/GeneralTest.java | 13 +++--- .../java/domain/activePiece/GuardTest.java | 13 +++--- .../java/domain/activePiece/HorseTest.java | 16 +++---- .../java/domain/activePiece/SoldierTest.java | 45 +++++++++++++++---- 7 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index 537d7897e8..ef32aede9f 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -44,6 +44,6 @@ private boolean isValidDirection(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(); + return List.of(source, target); } } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index fdfb505c80..44e4c5a813 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -52,5 +52,4 @@ class CannonTest { assertThat(cannon.searchRoute(src, dest)).isNotEqualTo(routes); } - } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index cfd2f96406..d8b3af0b68 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -52,5 +52,4 @@ class ChariotTest { assertThat(chariot.searchRoute(src, dest)).isNotEqualTo(routes); } - } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index 8d31d297fe..fb048dbbc1 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -1,7 +1,6 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import domain.Column; import domain.Position; @@ -17,12 +16,13 @@ class GeneralTest { @Test void 정상_범위_입력() { Piece general = new General(Team.HAN); - assertThat(general.canMove(new Position(5,5), new Position(5,6))).isTrue(); + assertThat(general.canMove(new Position(5, 5), new Position(5, 6))).isTrue(); } + @Test void 정상_범위가_아니면_거짓() { Piece general = new General(Team.HAN); - assertThat(general.canMove(new Position(5,5), new Position(6,6))).isFalse(); + assertThat(general.canMove(new Position(5, 5), new Position(6, 6))).isFalse(); } @Test @@ -34,7 +34,7 @@ class GeneralTest { List routes = new ArrayList<>( List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); - assertThat(general.searchRoute(src,dest)).isEqualTo(routes); + assertThat(general.searchRoute(src, dest)).isEqualTo(routes); } @Test @@ -46,9 +46,6 @@ class GeneralTest { List routes = new ArrayList<>( List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(general.searchRoute(src,dest)).isNotEqualTo(routes); + assertThat(general.searchRoute(src, dest)).isNotEqualTo(routes); } - - - } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 12e7611036..1b7e272516 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -1,7 +1,6 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import domain.Column; import domain.Position; @@ -17,13 +16,15 @@ class GuardTest { @Test void 정상_범위_입력() { Piece guard = new Guard(Team.HAN); - assertThat(guard.canMove(new Position(5,5), new Position(6,5))).isTrue(); + assertThat(guard.canMove(new Position(5, 5), new Position(6, 5))).isTrue(); } + @Test void 정상_범위가_아니면_거짓() { Piece guard = new Guard(Team.HAN); - assertThat(guard.canMove(new Position(5,5), new Position(8,8))).isFalse(); + assertThat(guard.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); } + @Test void 사_정상_경로_출력_한다() { ActivePiece guard = new Guard(Team.HAN); @@ -33,7 +34,7 @@ class GuardTest { List routes = new ArrayList<>( List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); - assertThat(guard.searchRoute(src,dest)).isEqualTo(routes); + assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); } @Test @@ -45,8 +46,6 @@ class GuardTest { List routes = new ArrayList<>( List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(guard.searchRoute(src,dest)).isNotEqualTo(routes); + assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); } - - } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index 3dcdab8e9c..eade0e9622 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -1,7 +1,6 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import domain.Position; import domain.piece.Piece; @@ -15,20 +14,21 @@ class HorseTest { @Test void 정상_범위_입력() { Piece horse = new Horse(Team.HAN); - assertThat(horse.canMove(new Position(5,5), new Position(6,7))).isTrue(); + assertThat(horse.canMove(new Position(5, 5), new Position(6, 7))).isTrue(); } + @Test void 정상_범위가_아니면_거짓() { Piece horse = new Horse(Team.HAN); - assertThat(horse.canMove(new Position(5,5), new Position(8,8))).isFalse(); + assertThat(horse.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); } @Test void 마_정상_경로_출력() { ActivePiece horse = new Horse(Team.HAN); Position src = new Position(3, 3); - Position mid = new Position(4,3); - Position dest = new Position(5,4); + Position mid = new Position(4, 3); + Position dest = new Position(5, 4); List routes = List.of(src, mid, dest); assertThat(horse.searchRoute(src, dest)).isEqualTo(routes); @@ -38,12 +38,10 @@ class HorseTest { void 마_비정상_경로_출력() { ActivePiece horse = new Horse(Team.HAN); Position src = new Position(3, 3); - Position mid = new Position(6,3); - Position dest = new Position(7,3); + Position mid = new Position(6, 3); + Position dest = new Position(7, 3); List routes = new ArrayList<>(List.of(src, mid, dest)); assertThat(horse.searchRoute(src, dest)).isNotEqualTo(routes); } - - } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 6d36d0941f..aa341f7e29 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -1,11 +1,14 @@ package domain.activePiece; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import domain.Column; import domain.Position; +import domain.Row; import domain.piece.Piece; import domain.piece.Team; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; class SoldierTest { @@ -13,49 +16,73 @@ class SoldierTest { @Test void 한_진영에서_왼쪽_이동() { Piece soldier = new Soldier(Team.HAN); - assertThat(soldier.canMove(new Position(5,5), new Position(5,4))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(5, 4))).isTrue(); } @Test void 한_진영에서_오른쪽_이동() { Piece soldier = new Soldier(Team.HAN); - assertThat(soldier.canMove(new Position(5,5), new Position(5,6))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(5, 6))).isTrue(); } @Test void 한_진영에서_전진_이동() { Piece soldier = new Soldier(Team.HAN); - assertThat(soldier.canMove(new Position(5,5), new Position(4,5))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(4, 5))).isTrue(); } @Test void 한_진영에서_정상_범위가_아니면_거짓() { Piece soldier = new Elephant(Team.HAN); - assertThat(soldier.canMove(new Position(5,5), new Position(8,8))).isFalse(); + assertThat(soldier.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); } @Test void 초_진영에서_왼쪽_이동() { Piece soldier = new Soldier(Team.CHO); - assertThat(soldier.canMove(new Position(5,5), new Position(5,4))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(5, 4))).isTrue(); } @Test void 초_진영에서_오른쪽_이동() { Piece soldier = new Soldier(Team.CHO); - assertThat(soldier.canMove(new Position(5,5), new Position(5,6))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(5, 6))).isTrue(); } @Test void 초_진영에서_전진_이동() { Piece soldier = new Soldier(Team.CHO); - assertThat(soldier.canMove(new Position(5,5), new Position(6,5))).isTrue(); + assertThat(soldier.canMove(new Position(5, 5), new Position(6, 5))).isTrue(); } @Test void 초_진영에서_정상_범위가_아니면_거짓() { Piece soldier = new Elephant(Team.CHO); - assertThat(soldier.canMove(new Position(5,5), new Position(8,8))).isFalse(); + assertThat(soldier.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); + } + + @Test + void 병_정상_경로_출력_한다() { + ActivePiece guard = new Guard(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + + assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); + } + + @Test + void 병_비정상_경로_출력_한다() { + ActivePiece guard = new Guard(Team.HAN); + + Position src = new Position(new Row(1), new Column(3)); + Position dest = new Position(new Row(2), new Column(3)); + List routes = new ArrayList<>( + List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + + assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); } } From 99c9e0e8a1cff0f12244bfaa5750f90779eb6268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Fri, 27 Mar 2026 21:10:03 +0900 Subject: [PATCH 22/55] =?UTF-8?q?feat:=20=ED=9D=90=EB=A6=84=20=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=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/controller/JanggiController.java | 14 ++++++++++---- src/main/java/domain/board/Board.java | 1 - src/main/java/view/InputView.java | 10 ++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 31eea84d27..64b7b39b4c 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -8,6 +8,7 @@ import domain.piece.Piece; import domain.piece.Team; import java.util.HashMap; +import java.util.List; import java.util.Map; import view.InputView; import view.OutputView; @@ -26,8 +27,8 @@ public void run() { int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); - Map choBoard = initialBoard(choFormationNumber,Team.CHO); - Map hanBoard = initialBoard(hanFormationNumber,Team.HAN); + Map choBoard = initialBoard(choFormationNumber, Team.CHO); + Map hanBoard = initialBoard(hanFormationNumber, Team.HAN); Map board = new HashMap<>(); @@ -37,10 +38,15 @@ public void run() { outputView.printBoard(board); // 기물 이동 <-> 보드 출력 반복 // 이동 위치 입력 받기 - + List movePositions = inputView.askMovePiecePoisiton(Team.CHO); + Position src = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); + Position dest = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); + if (board.get(src).canMove(src, dest)) { + //List routes = board.get(src).searchRoute(src, dest); + } } - private Map initialBoard(int input,Team team) { + private Map initialBoard(int input, Team team) { if (input == 1) { return new LeftGwimaFactory().createFormation(team); } diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 1967f68cc2..ab867e4eea 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -11,6 +11,5 @@ public class Board { void move(Position source, Position target) { Piece whatPiece = board.get(source); whatPiece.canMove(source, target); - } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 3909d00c05..2687509b97 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,7 @@ package view; import domain.piece.Team; +import java.util.List; import java.util.Scanner; public class InputView { @@ -24,4 +25,13 @@ private int validRange(int number) { return number; } + + public List askMovePiecePoisiton(Team team) { + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5 , 4,3\n"); + try { + return List.of(scanner.nextLine().trim().split(",")); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("예시와 똑같은 형식으로 입력해주세요."); + } + } } From 55ee04d7ca3cf43fdd39ac39a55e3200c11661b2 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Fri, 27 Mar 2026 21:48:10 +0900 Subject: [PATCH 23/55] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=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/controller/JanggiController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 64b7b39b4c..6e7987e208 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,6 +1,7 @@ package controller; import domain.Position; +import domain.activePiece.ActivePiece; import domain.board.LeftGwimaFactory; import domain.board.RightGwimaFactory; import domain.board.WonangmaFactory; @@ -42,7 +43,8 @@ public void run() { Position src = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); Position dest = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); if (board.get(src).canMove(src, dest)) { - //List routes = board.get(src).searchRoute(src, dest); + ActivePiece piece = (ActivePiece) board.get(src); + List routes = piece.searchRoute(src, dest); } } From b387b44277dbbbed92375ec1912a9341b1bbc2eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Fri, 27 Mar 2026 22:15:53 +0900 Subject: [PATCH 24/55] =?UTF-8?q?feat:=20=ED=9D=90=EB=A6=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=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 | 3 ++- src/main/java/domain/Position.java | 4 ++-- .../java/domain/activePiece/ActivePiece.java | 15 +++++++++++-- .../java/domain/activePiece/Elephant.java | 8 +++---- src/main/java/domain/activePiece/General.java | 2 +- src/main/java/domain/activePiece/Guard.java | 2 +- src/main/java/domain/activePiece/Horse.java | 21 ++++++++++++------- src/main/java/domain/activePiece/Soldier.java | 5 +++-- src/main/java/domain/board/Board.java | 13 ++++++++++++ src/main/java/domain/piece/EmptyPiece.java | 5 +++++ src/main/java/domain/piece/Piece.java | 2 ++ .../java/domain/activePiece/CannonTest.java | 3 ++- .../java/domain/activePiece/ChariotTest.java | 2 +- .../java/domain/activePiece/ElephantTest.java | 2 +- .../java/domain/activePiece/GeneralTest.java | 2 +- .../java/domain/activePiece/GuardTest.java | 2 +- .../java/domain/activePiece/HorseTest.java | 2 +- .../java/domain/activePiece/SoldierTest.java | 2 +- 18 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 6e7987e208..8472e23e81 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -44,7 +44,8 @@ public void run() { Position dest = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); if (board.get(src).canMove(src, dest)) { ActivePiece piece = (ActivePiece) board.get(src); - List routes = piece.searchRoute(src, dest); + List routes = piece.searchRoute(src, dest); + //checkRoute(piece, routes); } } diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index dd0078e672..ec48a17bb1 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -38,7 +38,7 @@ public List makeColStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.column.min(this.column); int dest = other.column.max(this.column); - for (int i = start; i <= dest; i++) { + for (int i = start + 1; i <= dest; i++) { routes.add(new Position(other.row, new Column(i))); } return routes; @@ -48,7 +48,7 @@ public List makeRowStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.row.min(this.row); int dest = other.row.max(this.row); - for (int i = start; i <= dest; i++) { + for (int i = start + 1; i <= dest; i++) { routes.add(new Position(new Row(i), other.column)); } return routes; diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java index e7e568a27d..76df5b1fba 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -15,8 +15,14 @@ protected ActivePiece(Team team, PieceType type) { this.type = type; } - public boolean isSameTeam(Team other) { - return this.team == other; + public boolean isSameTeam(ActivePiece other) { + return this.team == other.team; + } + + public int isSameType() { + if (this.type == PieceType.BYEONG) { + return 1; + } } public abstract List searchRoute(Position source, Position target); @@ -25,4 +31,9 @@ public boolean isSameTeam(Team other) { public String toString() { return team.colorize(type.getDisplayName()); } + + @Override + public boolean isNotEmpty() { + return true; + } } diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index ba75d27f42..aea5e648e6 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -31,17 +31,17 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { if (source.columnDiff(target) == -3) { Position mid = source.addPosition(0, 1); - return List.of(source, mid, source.addPosition(0, 1), mid.middlePosition(target), target); + return List.of(mid, source.addPosition(0, 1), mid.middlePosition(target), target); } if (source.columnDiff(target) == 3) { Position mid = source.addPosition(0, -1); - return List.of(source, mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target), target); } if (source.rowDiff(target) == -3) { Position mid = source.addPosition(1, 0); - return List.of(source, mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target), target); } Position mid = source.addPosition(-1, 0); - return List.of(source, mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target), target); } } diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java index c2f7420d5d..4b94b46314 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/activePiece/General.java @@ -28,6 +28,6 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(source, target); + return List.of(target); } } diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java index 66249b540c..f878e0faa0 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/activePiece/Guard.java @@ -28,6 +28,6 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(source, target); + return List.of(target); } } diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index cb751fc86b..d1d16e2c06 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -1,7 +1,6 @@ package domain.activePiece; import domain.Position; -import domain.Row; import domain.piece.PieceType; import domain.piece.Team; import java.util.List; @@ -30,12 +29,18 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - if (source.columnDiff(target) == -2) - return List.of(source, source.addPosition(0,1),target); - if (source.columnDiff(target) == 2) - return List.of(source, source.addPosition(0,-1),target); - if (source.rowDiff(target) == -2) - return List.of(source, source.addPosition(1,0),target); - return List.of(source, source.addPosition(-1,0),target); + if (source.columnDiff(target) == -2) { + return List.of(source.addPosition(0, 1), target); + } + + if (source.columnDiff(target) == 2) { + return List.of(source.addPosition(0, -1), target); + } + + if (source.rowDiff(target) == -2) { + return List.of(source.addPosition(1, 0), target); + } + + return List.of(source.addPosition(-1, 0), target); } } diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index ef32aede9f..48e16c2313 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -21,7 +21,8 @@ public boolean canMove(Position source, Position target) { return true; } - if (isSameTeam(Team.CHO)) { + ActivePiece solider = new Soldier(Team.CHO); + if (isSameTeam(solider)) { if (target.rowDiff(source) == 1 && target.columnDiff(source) == 0) { return true; } @@ -44,6 +45,6 @@ private boolean isValidDirection(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(source, target); + return List.of(target); } } diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index ab867e4eea..117e4ee3ad 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -12,4 +12,17 @@ void move(Position source, Position target) { Piece whatPiece = board.get(source); whatPiece.canMove(source, target); } + + /* + public boolean checkRoute(ActivePiece piece, List routes) { + if (piece.) { + if (board.get(routes.get(0)).isNotEmpty()) { + if (piece.isSameTeam((ActivePiece) board.get(routes.get(0)))) { + return false; + } + } + } + + + return true; */ } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index edd234f39c..6793f0d94f 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -9,6 +9,11 @@ public boolean canMove(Position source, Position target) { return false; } + @Override + public boolean isNotEmpty() { + return false; + } + @Override public String toString() { return PieceType.EMPTY.getDisplayName(); diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index bb00362f4e..64fcdfcb8f 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -4,4 +4,6 @@ public interface Piece { boolean canMove(Position source, Position target); + + boolean isNotEmpty(); } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 44e4c5a813..899b1be6a6 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -45,8 +45,9 @@ class CannonTest { ActivePiece cannon = new Cannon(Team.HAN); Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(4), new Column(3)); + List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(4)), new Position(new Row(3), new Column(4)), + List.of(new Position(new Row(3), new Column(4)), new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index d8b3af0b68..5394dba7f9 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -46,7 +46,7 @@ class ChariotTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(4)), new Position(new Row(3), new Column(4)), + List.of(new Position(new Row(3), new Column(4)), new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index f5cef96bf7..185eca0e3d 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -41,7 +41,7 @@ class ElephantTest { Position mid = new Position(5, 6); Position mid2 = new Position(7, 7); Position dest = new Position(8, 9); - List routes = List.of(src, mid, mid2, dest); + List routes = List.of(mid, mid2, dest); assertThat(elephant.searchRoute(src, dest)).isNotEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index fb048dbbc1..8ab444b96a 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -44,7 +44,7 @@ class GeneralTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + List.of(new Position(new Row(3), new Column(3)))); assertThat(general.searchRoute(src, dest)).isNotEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 1b7e272516..3327d38f1f 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -44,7 +44,7 @@ class GuardTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + List.of(new Position(new Row(3), new Column(3)))); assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index eade0e9622..fc27044f8d 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -40,7 +40,7 @@ class HorseTest { Position src = new Position(3, 3); Position mid = new Position(6, 3); Position dest = new Position(7, 3); - List routes = new ArrayList<>(List.of(src, mid, dest)); + List routes = new ArrayList<>(List.of(mid, dest)); assertThat(horse.searchRoute(src, dest)).isNotEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index aa341f7e29..f916940a9d 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -80,7 +80,7 @@ class SoldierTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(3), new Column(3)))); + List.of(new Position(new Row(3), new Column(3)))); assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); } From 06de6198fc954cbc132529348494e55115ce7f37 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Sat, 28 Mar 2026 17:37:44 +0900 Subject: [PATCH 25/55] =?UTF-8?q?refactor:=20=EA=B8=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=9D=B4=EB=8F=99=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=8C=8C=EC=8B=B1=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=EB=A6=AC=20(Position)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 4 ++-- src/main/java/domain/Position.java | 8 ++++++++ src/main/java/view/InputView.java | 19 ++++++++++++++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 8472e23e81..7a5c017623 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -40,8 +40,8 @@ public void run() { // 기물 이동 <-> 보드 출력 반복 // 이동 위치 입력 받기 List movePositions = inputView.askMovePiecePoisiton(Team.CHO); - Position src = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); - Position dest = new Position(Integer.parseInt(movePositions.get(0)), Integer.parseInt(movePositions.get(1))); + Position src = Position.from(movePositions.get(0), movePositions.get(1)); + Position dest = Position.from(movePositions.get(2), movePositions.get(3)); if (board.get(src).canMove(src, dest)) { ActivePiece piece = (ActivePiece) board.get(src); List routes = piece.searchRoute(src, dest); diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index ec48a17bb1..6aea5413a1 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -13,6 +13,14 @@ public Position(int row, int column) { this.column = new Column(column); } + public static Position from(String row, String column) { + try { + return new Position(Integer.parseInt(row), Integer.parseInt(column)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("위치는 숫자로 입력해주세요."); + } + } + public Position(Row row, Column column) { this.row = row; this.column = column; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 2687509b97..be5accb46f 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,10 +1,13 @@ package view; import domain.piece.Team; +import java.util.Arrays; import java.util.List; import java.util.Scanner; +import java.util.stream.Collectors; public class InputView { + private static final int MOVE_INPUT_COUNT = 4; private final Scanner scanner = new Scanner(System.in); public Integer initialFormation(Team team) { @@ -27,11 +30,17 @@ private int validRange(int number) { } public List askMovePiecePoisiton(Team team) { - System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5 , 4,3\n"); - try { - return List.of(scanner.nextLine().trim().split(",")); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("예시와 똑같은 형식으로 입력해주세요."); + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3\n"); + List positions = Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .collect(Collectors.toList()); + validatePositionFormat(positions); + return positions; + } + + private void validatePositionFormat(List positions) { + if (positions.size() != MOVE_INPUT_COUNT) { + throw new IllegalArgumentException("예시와 똑같은 형식으로 입력해주세요. (예: 2,5,4,3)"); } } } From e8388ee54e833d244fa92500332796fed770f24f Mon Sep 17 00:00:00 2001 From: picetea44 Date: Sat, 28 Mar 2026 18:14:11 +0900 Subject: [PATCH 26/55] =?UTF-8?q?refactor:=20Turn=20=EA=B0=9C=EB=85=90=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 17 +++++++---- src/main/java/domain/Turn.java | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/main/java/domain/Turn.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 7a5c017623..45d3d57736 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,6 +1,7 @@ package controller; import domain.Position; +import domain.Turn; import domain.activePiece.ActivePiece; import domain.board.LeftGwimaFactory; import domain.board.RightGwimaFactory; @@ -35,18 +36,24 @@ public void run() { board.putAll(choBoard); board.putAll(hanBoard); - // 초기화된 보드 출력 outputView.printBoard(board); - // 기물 이동 <-> 보드 출력 반복 - // 이동 위치 입력 받기 - List movePositions = inputView.askMovePiecePoisiton(Team.CHO); + + Turn turn = Turn.first(); + while (true) { + turn = playTurn(board, turn); + } + } + + private Turn playTurn(Map board, Turn turn) { + List movePositions = inputView.askMovePiecePoisiton(turn.current()); Position src = Position.from(movePositions.get(0), movePositions.get(1)); Position dest = Position.from(movePositions.get(2), movePositions.get(3)); if (board.get(src).canMove(src, dest)) { ActivePiece piece = (ActivePiece) board.get(src); List routes = piece.searchRoute(src, dest); - //checkRoute(piece, routes); } + outputView.printBoard(board); + return turn.next(); } private Map initialBoard(int input, Team team) { diff --git a/src/main/java/domain/Turn.java b/src/main/java/domain/Turn.java new file mode 100644 index 0000000000..280e4dce17 --- /dev/null +++ b/src/main/java/domain/Turn.java @@ -0,0 +1,30 @@ +package domain; + +import domain.piece.Team; + +public class Turn { + private final Team current; + + private Turn(Team current) { + this.current = current; + } + + public static Turn first() { + return new Turn(Team.CHO); + } + + public Turn next() { + if (current == Team.CHO) { + return new Turn(Team.HAN); + } + return new Turn(Team.CHO); + } + + public boolean isTurn(Team team) { + return this.current == team; + } + + public Team current() { + return current; + } +} From 804af3d2ef00dc4a3a5d109f7c7835aef777ec3f Mon Sep 17 00:00:00 2001 From: picetea44 Date: Sat, 28 Mar 2026 18:33:30 +0900 Subject: [PATCH 27/55] =?UTF-8?q?refactor:=20Board=20=EB=82=B4=EB=B6=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=BA=A1=EC=8A=90=ED=99=94=20=EC=A7=84?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 25 +++++----- src/main/java/domain/board/Board.java | 46 +++++++++++++------ src/main/java/view/OutputView.java | 18 ++++---- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 45d3d57736..e2cbcc98df 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -2,7 +2,7 @@ import domain.Position; import domain.Turn; -import domain.activePiece.ActivePiece; +import domain.board.Board; import domain.board.LeftGwimaFactory; import domain.board.RightGwimaFactory; import domain.board.WonangmaFactory; @@ -25,17 +25,10 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - // 보드 초기화 int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); - Map choBoard = initialBoard(choFormationNumber, Team.CHO); - Map hanBoard = initialBoard(hanFormationNumber, Team.HAN); - - Map board = new HashMap<>(); - - board.putAll(choBoard); - board.putAll(hanBoard); + Board board = createBoard(choFormationNumber, hanFormationNumber); outputView.printBoard(board); Turn turn = Turn.first(); @@ -44,14 +37,18 @@ public void run() { } } - private Turn playTurn(Map board, Turn turn) { + private Board createBoard(int choFormationNumber, int hanFormationNumber) { + Map pieces = new HashMap<>(); + pieces.putAll(initialBoard(choFormationNumber, Team.CHO)); + pieces.putAll(initialBoard(hanFormationNumber, Team.HAN)); + return new Board(pieces); + } + + private Turn playTurn(Board board, Turn turn) { List movePositions = inputView.askMovePiecePoisiton(turn.current()); Position src = Position.from(movePositions.get(0), movePositions.get(1)); Position dest = Position.from(movePositions.get(2), movePositions.get(3)); - if (board.get(src).canMove(src, dest)) { - ActivePiece piece = (ActivePiece) board.get(src); - List routes = piece.searchRoute(src, dest); - } + board.move(src, dest); outputView.printBoard(board); return turn.next(); } diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 117e4ee3ad..9206947ff6 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -1,28 +1,48 @@ package domain.board; import domain.Position; +import domain.activePiece.ActivePiece; +import domain.piece.EmptyPiece; import domain.piece.Piece; import java.util.HashMap; +import java.util.List; import java.util.Map; public class Board { - private final Map board = new HashMap<>(); + private final Map pieces; - void move(Position source, Position target) { - Piece whatPiece = board.get(source); - whatPiece.canMove(source, target); + public Board(Map pieces) { + this.pieces = new HashMap<>(pieces); } - /* - public boolean checkRoute(ActivePiece piece, List routes) { - if (piece.) { - if (board.get(routes.get(0)).isNotEmpty()) { - if (piece.isSameTeam((ActivePiece) board.get(routes.get(0)))) { - return false; - } + public void move(Position src, Position dest) { + Piece piece = pieces.get(src); + validateCanMove(piece, src, dest); + List route = ((ActivePiece) piece).searchRoute(src, dest); + validateRoute(route); + applyMove(src, dest, piece); + } + + private void validateCanMove(Piece piece, Position src, Position dest) { + if (!piece.canMove(src, dest)) { + throw new IllegalArgumentException("이동할 수 없는 위치입니다."); + } + } + + private void validateRoute(List route) { + for (Position position : route) { + if (pieceAt(position).isNotEmpty()) { + throw new IllegalArgumentException("이동 경로에 기물이 있습니다."); } } + } + private void applyMove(Position src, Position dest, Piece piece) { + pieces.put(dest, piece); + pieces.put(src, new EmptyPiece()); + } - return true; */ -} + public Piece pieceAt(Position position) { + return pieces.getOrDefault(position, new EmptyPiece()); + } +} \ No newline at end of file diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index ef15f2aace..b44b0eff0a 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,25 +1,27 @@ package view; import domain.Position; -import domain.piece.EmptyPiece; +import domain.board.Board; import domain.piece.Piece; -import java.util.Map; public class OutputView { private static final int MAX_ROW = 10; private static final int MAX_COLUMN = 9; - private static final Piece EMPTY = new EmptyPiece(); - public void printBoard(Map board) { + public void printBoard(Board board) { StringBuilder sb = new StringBuilder(); for (int row = MAX_ROW; row >= 1; row--) { - for (int col = 1; col <= MAX_COLUMN; col++) { - Piece piece = board.getOrDefault(new Position(row, col), EMPTY); - sb.append(piece.toString()).append("\t"); - } + appendRow(sb, board, row); sb.append(System.lineSeparator()); } System.out.println(sb); } + + private void appendRow(StringBuilder sb, Board board, int row) { + for (int col = 1; col <= MAX_COLUMN; col++) { + Piece piece = board.pieceAt(new Position(row, col)); + sb.append(piece.toString()).append("\t"); + } + } } From 08f237b6fed9c0854bf4a5c64a0891205aa684d8 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Sat, 28 Mar 2026 20:38:40 +0900 Subject: [PATCH 28/55] =?UTF-8?q?refactor:=20=ED=8C=80=20=ED=8C=90?= =?UTF-8?q?=EB=B3=84=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20=EA=B7=9C=EC=B9=99=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=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/Position.java | 4 ++-- .../java/domain/activePiece/ActivePiece.java | 12 ++++++++++++ src/main/java/domain/activePiece/Elephant.java | 8 ++++---- src/main/java/domain/activePiece/General.java | 2 +- src/main/java/domain/activePiece/Guard.java | 2 +- src/main/java/domain/activePiece/Horse.java | 8 ++++---- src/main/java/domain/activePiece/Soldier.java | 18 ++++-------------- src/main/java/domain/board/Board.java | 11 +++++++++-- src/main/java/domain/piece/EmptyPiece.java | 5 +++++ src/main/java/domain/piece/Piece.java | 2 ++ src/main/java/domain/piece/Team.java | 7 +++++++ src/main/java/view/InputView.java | 2 +- 12 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java index 6aea5413a1..9d81955cf5 100644 --- a/src/main/java/domain/Position.java +++ b/src/main/java/domain/Position.java @@ -46,7 +46,7 @@ public List makeColStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.column.min(this.column); int dest = other.column.max(this.column); - for (int i = start + 1; i <= dest; i++) { + for (int i = start + 1; i < dest; i++) { routes.add(new Position(other.row, new Column(i))); } return routes; @@ -56,7 +56,7 @@ public List makeRowStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.row.min(this.row); int dest = other.row.max(this.row); - for (int i = start + 1; i <= dest; i++) { + for (int i = start + 1; i < dest; i++) { routes.add(new Position(new Row(i), other.column)); } return routes; diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java index 76df5b1fba..149fd43930 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -19,10 +19,22 @@ public boolean isSameTeam(ActivePiece other) { return this.team == other.team; } + public boolean isAlly(Piece other) { + if (!(other instanceof ActivePiece)) { + return false; + } + return isSameTeam((ActivePiece) other); + } + + protected int forwardDirection() { + return team.forwardRowDirection(); + } + public int isSameType() { if (this.type == PieceType.BYEONG) { return 1; } + return 0; } public abstract List searchRoute(Position source, Position target); diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/activePiece/Elephant.java index aea5e648e6..32428bdd8a 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/activePiece/Elephant.java @@ -31,17 +31,17 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { if (source.columnDiff(target) == -3) { Position mid = source.addPosition(0, 1); - return List.of(mid, source.addPosition(0, 1), mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target)); } if (source.columnDiff(target) == 3) { Position mid = source.addPosition(0, -1); - return List.of(mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target)); } if (source.rowDiff(target) == -3) { Position mid = source.addPosition(1, 0); - return List.of(mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target)); } Position mid = source.addPosition(-1, 0); - return List.of(mid, mid.middlePosition(target), target); + return List.of(mid, mid.middlePosition(target)); } } diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/activePiece/General.java index 4b94b46314..9d75a83a0f 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/activePiece/General.java @@ -28,6 +28,6 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(target); + return List.of(); } } diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/activePiece/Guard.java index f878e0faa0..6eda2dc35d 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/activePiece/Guard.java @@ -28,6 +28,6 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(target); + return List.of(); } } diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/activePiece/Horse.java index d1d16e2c06..a36a682f32 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/activePiece/Horse.java @@ -30,17 +30,17 @@ public boolean canMove(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { if (source.columnDiff(target) == -2) { - return List.of(source.addPosition(0, 1), target); + return List.of(source.addPosition(0, 1)); } if (source.columnDiff(target) == 2) { - return List.of(source.addPosition(0, -1), target); + return List.of(source.addPosition(0, -1)); } if (source.rowDiff(target) == -2) { - return List.of(source.addPosition(1, 0), target); + return List.of(source.addPosition(1, 0)); } - return List.of(source.addPosition(-1, 0), target); + return List.of(source.addPosition(-1, 0)); } } diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/activePiece/Soldier.java index 48e16c2313..7f81ca987c 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/activePiece/Soldier.java @@ -15,23 +15,13 @@ public Soldier(Team team) { @Override public boolean canMove(Position source, Position target) { - boolean sideMove = isValidDirection(source, target); - - if (sideMove) { + if (isValidSideMove(source, target)) { return true; } - - ActivePiece solider = new Soldier(Team.CHO); - if (isSameTeam(solider)) { - if (target.rowDiff(source) == 1 && target.columnDiff(source) == 0) { - return true; - } - } - - return target.rowDiff(source) == -1 && target.columnDiff(source) == 0; + return target.rowDiff(source) == forwardDirection() && target.columnDiff(source) == 0; } - private boolean isValidDirection(Position source, Position target) { + private boolean isValidSideMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); @@ -45,6 +35,6 @@ private boolean isValidDirection(Position source, Position target) { @Override public List searchRoute(Position source, Position target) { - return List.of(target); + return List.of(); } } diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 9206947ff6..7e8c24329a 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -19,7 +19,8 @@ public void move(Position src, Position dest) { Piece piece = pieces.get(src); validateCanMove(piece, src, dest); List route = ((ActivePiece) piece).searchRoute(src, dest); - validateRoute(route); + validateIntermediateRoute(route); + validateDestination(dest, piece); applyMove(src, dest, piece); } @@ -29,7 +30,7 @@ private void validateCanMove(Piece piece, Position src, Position dest) { } } - private void validateRoute(List route) { + private void validateIntermediateRoute(List route) { for (Position position : route) { if (pieceAt(position).isNotEmpty()) { throw new IllegalArgumentException("이동 경로에 기물이 있습니다."); @@ -37,6 +38,12 @@ private void validateRoute(List route) { } } + private void validateDestination(Position dest, Piece movingPiece) { + if (pieceAt(dest).isAlly(movingPiece)) { + throw new IllegalArgumentException("아군 기물이 있는 위치로 이동할 수 없습니다."); + } + } + private void applyMove(Position src, Position dest, Piece piece) { pieces.put(dest, piece); pieces.put(src, new EmptyPiece()); diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index 6793f0d94f..cd89be8123 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -14,6 +14,11 @@ public boolean isNotEmpty() { return false; } + @Override + public boolean isAlly(Piece other) { + return false; + } + @Override public String toString() { return PieceType.EMPTY.getDisplayName(); diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 64fcdfcb8f..04ab1e26b4 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -6,4 +6,6 @@ public interface Piece { boolean canMove(Position source, Position target); boolean isNotEmpty(); + + boolean isAlly(Piece other); } diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/piece/Team.java index 5d59b8073c..b224f0eb6a 100644 --- a/src/main/java/domain/piece/Team.java +++ b/src/main/java/domain/piece/Team.java @@ -42,6 +42,13 @@ public int getSoldierRow() { return soldierRow; } + public int forwardRowDirection() { + if (this == CHO) { + return 1; + } + return -1; + } + @Override public String toString() { return teamName; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index be5accb46f..80db967bdd 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -30,7 +30,7 @@ private int validRange(int number) { } public List askMovePiecePoisiton(Team team) { - System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3\n"); + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3)\n"); List positions = Arrays.stream(scanner.nextLine().split(",")) .map(String::trim) .collect(Collectors.toList()); From 3d7803c1f59aafcb18d7e84757005e4f9b63f5cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sat, 28 Mar 2026 20:53:24 +0900 Subject: [PATCH 29/55] =?UTF-8?q?refactor:=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=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/JanggiApplication.java | 1 - src/main/java/domain/Score.java | 16 ---------------- .../java/domain/activePiece/ActivePiece.java | 7 ------- .../java/domain/board/AbstractBoardFactory.java | 2 +- .../{FormationFactory.java => BoardFactory.java} | 2 +- 5 files changed, 2 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/domain/Score.java rename src/main/java/domain/board/{FormationFactory.java => BoardFactory.java} (83%) diff --git a/src/main/java/JanggiApplication.java b/src/main/java/JanggiApplication.java index cf818d44ae..8d3f95903c 100644 --- a/src/main/java/JanggiApplication.java +++ b/src/main/java/JanggiApplication.java @@ -6,6 +6,5 @@ public class JanggiApplication { public static void main(String[] args) { JanggiController janggiController = new JanggiController(new InputView(), new OutputView()); janggiController.run(); - } } diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java deleted file mode 100644 index 834b346152..0000000000 --- a/src/main/java/domain/Score.java +++ /dev/null @@ -1,16 +0,0 @@ -package domain; - -public class Score { - private final int value; - - public Score(int value) { - validate(value); - this.value = value; - } - - private void validate(int value) { - if (value < 0) { - throw new IllegalArgumentException("점수는 0 이상 이어야합니다."); - } - } -} diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/activePiece/ActivePiece.java index 149fd43930..8f68fc2afb 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/activePiece/ActivePiece.java @@ -30,13 +30,6 @@ protected int forwardDirection() { return team.forwardRowDirection(); } - public int isSameType() { - if (this.type == PieceType.BYEONG) { - return 1; - } - return 0; - } - public abstract List searchRoute(Position source, Position target); @Override diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index 2924a5f011..5d789adbb7 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.Map; -public abstract class AbstractBoardFactory implements FormationFactory { +public abstract class AbstractBoardFactory implements BoardFactory { @Override public Map createFormation(Team team) { diff --git a/src/main/java/domain/board/FormationFactory.java b/src/main/java/domain/board/BoardFactory.java similarity index 83% rename from src/main/java/domain/board/FormationFactory.java rename to src/main/java/domain/board/BoardFactory.java index 1333019c9c..682fa92ac9 100644 --- a/src/main/java/domain/board/FormationFactory.java +++ b/src/main/java/domain/board/BoardFactory.java @@ -5,6 +5,6 @@ import domain.piece.Team; import java.util.Map; -public interface FormationFactory { +public interface BoardFactory { Map createFormation(Team team); } From 91ee3f1f5cecf8d6291fe7bcab4094ee590a4704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sat, 28 Mar 2026 21:05:42 +0900 Subject: [PATCH 30/55] =?UTF-8?q?refactor:=20=EB=B3=B4=EB=93=9C=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EC=8B=9C=20=EC=97=B4=EA=B3=BC=20=ED=96=89=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 80db967bdd..1d22dd6370 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -30,7 +30,7 @@ private int validRange(int number) { } public List askMovePiecePoisiton(Team team) { - System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3)\n"); + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3)"); List positions = Arrays.stream(scanner.nextLine().split(",")) .map(String::trim) .collect(Collectors.toList()); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index b44b0eff0a..0e11312767 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -12,12 +12,22 @@ public class OutputView { public void printBoard(Board board) { StringBuilder sb = new StringBuilder(); for (int row = MAX_ROW; row >= 1; row--) { + sb.append(row).append("\t"); appendRow(sb, board, row); sb.append(System.lineSeparator()); } + appendColumnHeader(sb); System.out.println(sb); } + private void appendColumnHeader(StringBuilder sb) { + sb.append(" \t"); + for (int col = 1; col <= MAX_COLUMN; col++) { + sb.append(col).append("\t"); + } + sb.append(System.lineSeparator()); + } + private void appendRow(StringBuilder sb, Board board, int row) { for (int col = 1; col <= MAX_COLUMN; col++) { Piece piece = board.pieceAt(new Position(row, col)); From 6f4a476ae68127fcd77ac0e174a649ad9f3ac7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sat, 28 Mar 2026 21:07:53 +0900 Subject: [PATCH 31/55] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=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/view/InputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 1d22dd6370..cdf3e598d8 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -30,7 +30,7 @@ private int validRange(int number) { } public List askMovePiecePoisiton(Team team) { - System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 입력하세요. (예: 2,5,4,3)"); + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 행과 열 순서대로 입력하세요. ( 예: 2,5,4,3 )"); List positions = Arrays.stream(scanner.nextLine().split(",")) .map(String::trim) .collect(Collectors.toList()); From 9dec8bf8941786d9d3f573a3db7713fea3d0c967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sat, 28 Mar 2026 21:17:36 +0900 Subject: [PATCH 32/55] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9E=AC=EB=B6=84=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 6 +++--- src/main/java/domain/board/AbstractBoardFactory.java | 4 ++-- src/main/java/domain/board/Board.java | 6 +++--- src/main/java/domain/board/BoardFactory.java | 4 ++-- src/main/java/domain/board/LeftGwimaFactory.java | 4 ++-- src/main/java/domain/board/RightGwimaFactory.java | 4 ++-- src/main/java/domain/board/WonangmaFactory.java | 4 ++-- src/main/java/domain/board/YanggwimaFactory.java | 4 ++-- src/main/java/domain/{piece => game}/Team.java | 2 +- src/main/java/domain/{ => game}/Turn.java | 4 +--- .../domain/{activePiece => piece}/ActivePiece.java | 8 +++----- .../java/domain/{activePiece => piece}/Cannon.java | 7 +++---- .../java/domain/{activePiece => piece}/Chariot.java | 7 +++---- .../java/domain/{activePiece => piece}/Elephant.java | 7 +++---- src/main/java/domain/piece/EmptyPiece.java | 2 +- .../java/domain/{activePiece => piece}/General.java | 7 +++---- .../java/domain/{activePiece => piece}/Guard.java | 7 +++---- .../java/domain/{activePiece => piece}/Horse.java | 7 +++---- src/main/java/domain/piece/Piece.java | 2 +- src/main/java/domain/piece/PieceType.java | 8 +------- .../java/domain/{activePiece => piece}/Soldier.java | 7 +++---- src/main/java/domain/{ => position}/Column.java | 2 +- src/main/java/domain/{ => position}/Position.java | 2 +- src/main/java/domain/{ => position}/Row.java | 2 +- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 2 +- src/test/java/domain/PositionTest.java | 1 + src/test/java/domain/activePiece/CannonTest.java | 10 ++++++---- src/test/java/domain/activePiece/ChariotTest.java | 10 ++++++---- src/test/java/domain/activePiece/ElephantTest.java | 6 ++++-- src/test/java/domain/activePiece/GeneralTest.java | 10 ++++++---- src/test/java/domain/activePiece/GuardTest.java | 10 ++++++---- src/test/java/domain/activePiece/HorseTest.java | 6 ++++-- src/test/java/domain/activePiece/SoldierTest.java | 12 ++++++++---- 34 files changed, 93 insertions(+), 93 deletions(-) rename src/main/java/domain/{piece => game}/Team.java (98%) rename src/main/java/domain/{ => game}/Turn.java (92%) rename src/main/java/domain/{activePiece => piece}/ActivePiece.java (86%) rename src/main/java/domain/{activePiece => piece}/Cannon.java (83%) rename src/main/java/domain/{activePiece => piece}/Chariot.java (83%) rename src/main/java/domain/{activePiece => piece}/Elephant.java (92%) rename src/main/java/domain/{activePiece => piece}/General.java (87%) rename src/main/java/domain/{activePiece => piece}/Guard.java (87%) rename src/main/java/domain/{activePiece => piece}/Horse.java (91%) rename src/main/java/domain/{activePiece => piece}/Soldier.java (90%) rename src/main/java/domain/{ => position}/Column.java (97%) rename src/main/java/domain/{ => position}/Position.java (98%) rename src/main/java/domain/{ => position}/Row.java (97%) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index e2cbcc98df..6f2655a0b3 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,14 +1,14 @@ package controller; -import domain.Position; -import domain.Turn; +import domain.position.Position; +import domain.game.Turn; import domain.board.Board; import domain.board.LeftGwimaFactory; import domain.board.RightGwimaFactory; import domain.board.WonangmaFactory; import domain.board.YanggwimaFactory; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index 5d789adbb7..b1a4ebf569 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -1,9 +1,9 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; import domain.piece.PieceType; -import domain.piece.Team; +import domain.game.Team; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 7e8c24329a..6fc339abac 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -1,7 +1,7 @@ package domain.board; -import domain.Position; -import domain.activePiece.ActivePiece; +import domain.position.Position; +import domain.piece.ActivePiece; import domain.piece.EmptyPiece; import domain.piece.Piece; import java.util.HashMap; @@ -52,4 +52,4 @@ private void applyMove(Position src, Position dest, Piece piece) { public Piece pieceAt(Position position) { return pieces.getOrDefault(position, new EmptyPiece()); } -} \ No newline at end of file +} diff --git a/src/main/java/domain/board/BoardFactory.java b/src/main/java/domain/board/BoardFactory.java index 682fa92ac9..284627b0d9 100644 --- a/src/main/java/domain/board/BoardFactory.java +++ b/src/main/java/domain/board/BoardFactory.java @@ -1,8 +1,8 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.Map; public interface BoardFactory { diff --git a/src/main/java/domain/board/LeftGwimaFactory.java b/src/main/java/domain/board/LeftGwimaFactory.java index 43645f2595..ea04168f22 100644 --- a/src/main/java/domain/board/LeftGwimaFactory.java +++ b/src/main/java/domain/board/LeftGwimaFactory.java @@ -1,9 +1,9 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; import domain.piece.PieceType; -import domain.piece.Team; +import domain.game.Team; import java.util.Map; public class LeftGwimaFactory extends AbstractBoardFactory { diff --git a/src/main/java/domain/board/RightGwimaFactory.java b/src/main/java/domain/board/RightGwimaFactory.java index 9d4e34511b..a1def17cc2 100644 --- a/src/main/java/domain/board/RightGwimaFactory.java +++ b/src/main/java/domain/board/RightGwimaFactory.java @@ -1,9 +1,9 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; import domain.piece.PieceType; -import domain.piece.Team; +import domain.game.Team; import java.util.Map; public class RightGwimaFactory extends AbstractBoardFactory { diff --git a/src/main/java/domain/board/WonangmaFactory.java b/src/main/java/domain/board/WonangmaFactory.java index b4fe7d1554..7e55b21961 100644 --- a/src/main/java/domain/board/WonangmaFactory.java +++ b/src/main/java/domain/board/WonangmaFactory.java @@ -1,9 +1,9 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; import domain.piece.PieceType; -import domain.piece.Team; +import domain.game.Team; import java.util.Map; public class WonangmaFactory extends AbstractBoardFactory { diff --git a/src/main/java/domain/board/YanggwimaFactory.java b/src/main/java/domain/board/YanggwimaFactory.java index e0c96a9714..592f1148b0 100644 --- a/src/main/java/domain/board/YanggwimaFactory.java +++ b/src/main/java/domain/board/YanggwimaFactory.java @@ -1,9 +1,9 @@ package domain.board; -import domain.Position; +import domain.position.Position; import domain.piece.Piece; import domain.piece.PieceType; -import domain.piece.Team; +import domain.game.Team; import java.util.Map; public class YanggwimaFactory extends AbstractBoardFactory { diff --git a/src/main/java/domain/piece/Team.java b/src/main/java/domain/game/Team.java similarity index 98% rename from src/main/java/domain/piece/Team.java rename to src/main/java/domain/game/Team.java index b224f0eb6a..78af7a7bc4 100644 --- a/src/main/java/domain/piece/Team.java +++ b/src/main/java/domain/game/Team.java @@ -1,4 +1,4 @@ -package domain.piece; +package domain.game; public enum Team { CHO("초", "\u001B[34m", 1, 2, 3, 4), diff --git a/src/main/java/domain/Turn.java b/src/main/java/domain/game/Turn.java similarity index 92% rename from src/main/java/domain/Turn.java rename to src/main/java/domain/game/Turn.java index 280e4dce17..ada7f3fdbb 100644 --- a/src/main/java/domain/Turn.java +++ b/src/main/java/domain/game/Turn.java @@ -1,6 +1,4 @@ -package domain; - -import domain.piece.Team; +package domain.game; public class Turn { private final Team current; diff --git a/src/main/java/domain/activePiece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java similarity index 86% rename from src/main/java/domain/activePiece/ActivePiece.java rename to src/main/java/domain/piece/ActivePiece.java index 8f68fc2afb..16ebcc40ad 100644 --- a/src/main/java/domain/activePiece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -1,9 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.Piece; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public abstract class ActivePiece implements Piece { diff --git a/src/main/java/domain/activePiece/Cannon.java b/src/main/java/domain/piece/Cannon.java similarity index 83% rename from src/main/java/domain/activePiece/Cannon.java rename to src/main/java/domain/piece/Cannon.java index 0bf823c3ac..8e6bf517b6 100644 --- a/src/main/java/domain/activePiece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Cannon extends ActivePiece { diff --git a/src/main/java/domain/activePiece/Chariot.java b/src/main/java/domain/piece/Chariot.java similarity index 83% rename from src/main/java/domain/activePiece/Chariot.java rename to src/main/java/domain/piece/Chariot.java index 7f46f02573..7b4592123d 100644 --- a/src/main/java/domain/activePiece/Chariot.java +++ b/src/main/java/domain/piece/Chariot.java @@ -1,9 +1,8 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Chariot extends ActivePiece { diff --git a/src/main/java/domain/activePiece/Elephant.java b/src/main/java/domain/piece/Elephant.java similarity index 92% rename from src/main/java/domain/activePiece/Elephant.java rename to src/main/java/domain/piece/Elephant.java index 32428bdd8a..d1c018c844 100644 --- a/src/main/java/domain/activePiece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Elephant extends ActivePiece { diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index cd89be8123..568700ba19 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -1,6 +1,6 @@ package domain.piece; -import domain.Position; +import domain.position.Position; public class EmptyPiece implements Piece { diff --git a/src/main/java/domain/activePiece/General.java b/src/main/java/domain/piece/General.java similarity index 87% rename from src/main/java/domain/activePiece/General.java rename to src/main/java/domain/piece/General.java index 9d75a83a0f..c7f9906323 100644 --- a/src/main/java/domain/activePiece/General.java +++ b/src/main/java/domain/piece/General.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class General extends ActivePiece { diff --git a/src/main/java/domain/activePiece/Guard.java b/src/main/java/domain/piece/Guard.java similarity index 87% rename from src/main/java/domain/activePiece/Guard.java rename to src/main/java/domain/piece/Guard.java index 6eda2dc35d..8b05b09325 100644 --- a/src/main/java/domain/activePiece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Guard extends ActivePiece { diff --git a/src/main/java/domain/activePiece/Horse.java b/src/main/java/domain/piece/Horse.java similarity index 91% rename from src/main/java/domain/activePiece/Horse.java rename to src/main/java/domain/piece/Horse.java index a36a682f32..738be975ae 100644 --- a/src/main/java/domain/activePiece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Horse extends ActivePiece { diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 04ab1e26b4..d0372ba8e4 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; public interface Piece { boolean canMove(Position source, Position target); diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index 8feade7d95..3da2145c1c 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -1,12 +1,6 @@ package domain.piece; -import domain.activePiece.Cannon; -import domain.activePiece.Chariot; -import domain.activePiece.Elephant; -import domain.activePiece.General; -import domain.activePiece.Guard; -import domain.activePiece.Horse; -import domain.activePiece.Soldier; +import domain.game.Team; import java.util.List; import java.util.function.Function; diff --git a/src/main/java/domain/activePiece/Soldier.java b/src/main/java/domain/piece/Soldier.java similarity index 90% rename from src/main/java/domain/activePiece/Soldier.java rename to src/main/java/domain/piece/Soldier.java index 7f81ca987c..0a72092825 100644 --- a/src/main/java/domain/activePiece/Soldier.java +++ b/src/main/java/domain/piece/Soldier.java @@ -1,8 +1,7 @@ -package domain.activePiece; +package domain.piece; -import domain.Position; -import domain.piece.PieceType; -import domain.piece.Team; +import domain.position.Position; +import domain.game.Team; import java.util.List; public class Soldier extends ActivePiece { diff --git a/src/main/java/domain/Column.java b/src/main/java/domain/position/Column.java similarity index 97% rename from src/main/java/domain/Column.java rename to src/main/java/domain/position/Column.java index a31911a239..561f0c141e 100644 --- a/src/main/java/domain/Column.java +++ b/src/main/java/domain/position/Column.java @@ -1,4 +1,4 @@ -package domain; +package domain.position; public class Column { private final int value; diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/position/Position.java similarity index 98% rename from src/main/java/domain/Position.java rename to src/main/java/domain/position/Position.java index 9d81955cf5..35fe85fac2 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.ArrayList; import java.util.List; diff --git a/src/main/java/domain/Row.java b/src/main/java/domain/position/Row.java similarity index 97% rename from src/main/java/domain/Row.java rename to src/main/java/domain/position/Row.java index 3e91321520..de16442b18 100644 --- a/src/main/java/domain/Row.java +++ b/src/main/java/domain/position/Row.java @@ -1,4 +1,4 @@ -package domain; +package domain.position; public class Row { private final int value; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index cdf3e598d8..dceb02be85 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,6 @@ package view; -import domain.piece.Team; +import domain.game.Team; import java.util.Arrays; import java.util.List; import java.util.Scanner; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0e11312767..da154afca9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,6 @@ package view; -import domain.Position; +import domain.position.Position; import domain.board.Board; import domain.piece.Piece; diff --git a/src/test/java/domain/PositionTest.java b/src/test/java/domain/PositionTest.java index 7b823ee790..05473fe7f0 100644 --- a/src/test/java/domain/PositionTest.java +++ b/src/test/java/domain/PositionTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import domain.position.Position; import org.junit.jupiter.api.Test; class PositionTest { diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 899b1be6a6..17066efa34 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Column; -import domain.Position; -import domain.Row; +import domain.piece.ActivePiece; +import domain.piece.Cannon; +import domain.position.Column; +import domain.position.Position; +import domain.position.Row; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index 5394dba7f9..32993165d0 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Column; -import domain.Position; -import domain.Row; +import domain.piece.ActivePiece; +import domain.piece.Chariot; +import domain.position.Column; +import domain.position.Position; +import domain.position.Row; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index 185eca0e3d..6be11d845f 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -2,9 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Position; +import domain.piece.ActivePiece; +import domain.piece.Elephant; +import domain.position.Position; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index 8ab444b96a..0324c6e173 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Column; -import domain.Position; -import domain.Row; +import domain.piece.ActivePiece; +import domain.piece.General; +import domain.position.Column; +import domain.position.Position; +import domain.position.Row; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 3327d38f1f..007744a643 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Column; -import domain.Position; -import domain.Row; +import domain.piece.ActivePiece; +import domain.piece.Guard; +import domain.position.Column; +import domain.position.Position; +import domain.position.Row; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index fc27044f8d..c6e09c4906 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -2,9 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Position; +import domain.piece.ActivePiece; +import domain.piece.Horse; +import domain.position.Position; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index f916940a9d..1e3c42d0a3 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -2,11 +2,15 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.Column; -import domain.Position; -import domain.Row; +import domain.piece.ActivePiece; +import domain.piece.Elephant; +import domain.piece.Guard; +import domain.piece.Soldier; +import domain.position.Column; +import domain.position.Position; +import domain.position.Row; import domain.piece.Piece; -import domain.piece.Team; +import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; From 45de3b0208f9a9ca89676bea51c64c65378c910b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sat, 28 Mar 2026 21:51:45 +0900 Subject: [PATCH 33/55] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=ED=9D=90=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/JanggiController.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 6f2655a0b3..2147fb83da 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,14 +1,14 @@ package controller; -import domain.position.Position; -import domain.game.Turn; import domain.board.Board; import domain.board.LeftGwimaFactory; import domain.board.RightGwimaFactory; import domain.board.WonangmaFactory; import domain.board.YanggwimaFactory; -import domain.piece.Piece; import domain.game.Team; +import domain.game.Turn; +import domain.piece.Piece; +import domain.position.Position; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,10 +25,7 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - int choFormationNumber = inputView.initialFormation(Team.CHO); - int hanFormationNumber = inputView.initialFormation(Team.HAN); - - Board board = createBoard(choFormationNumber, hanFormationNumber); + Board board = createBoard(); outputView.printBoard(board); Turn turn = Turn.first(); @@ -37,7 +34,9 @@ public void run() { } } - private Board createBoard(int choFormationNumber, int hanFormationNumber) { + private Board createBoard() { + int choFormationNumber = inputView.initialFormation(Team.CHO); + int hanFormationNumber = inputView.initialFormation(Team.HAN); Map pieces = new HashMap<>(); pieces.putAll(initialBoard(choFormationNumber, Team.CHO)); pieces.putAll(initialBoard(hanFormationNumber, Team.HAN)); From 9dbbbddb7f7a2be432cb9bda19b320a45674ab71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 19:16:36 +0900 Subject: [PATCH 34/55] =?UTF-8?q?refactor:=20=EC=9E=AC=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=20=ED=8F=AC=ED=95=A8=20=EA=B2=8C=EC=9E=84=20=ED=9D=90=EB=A6=84?= =?UTF-8?q?=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/JanggiApplication.java | 4 +- .../java/controller/JanggiController.java | 42 +++++++------------ .../domain/board/AbstractBoardFactory.java | 13 ++++++ src/main/java/domain/board/Board.java | 14 ++++++- src/main/java/domain/game/Team.java | 14 ++----- src/main/java/domain/piece/ActivePiece.java | 11 +++-- src/main/java/domain/piece/Cannon.java | 6 ++- .../domain/piece/ConsolePieceAppearance.java | 32 ++++++++++++++ src/main/java/domain/piece/EmptyPiece.java | 7 +++- src/main/java/domain/piece/Piece.java | 6 +++ .../java/domain/piece/PieceAppearance.java | 9 ++++ src/main/java/domain/piece/PieceType.java | 24 ++++------- src/main/java/view/InputView.java | 36 +++++++++------- src/main/java/view/OutputView.java | 11 +++-- 14 files changed, 150 insertions(+), 79 deletions(-) create mode 100644 src/main/java/domain/piece/ConsolePieceAppearance.java create mode 100644 src/main/java/domain/piece/PieceAppearance.java diff --git a/src/main/java/JanggiApplication.java b/src/main/java/JanggiApplication.java index 8d3f95903c..985dfb3321 100644 --- a/src/main/java/JanggiApplication.java +++ b/src/main/java/JanggiApplication.java @@ -1,10 +1,12 @@ import controller.JanggiController; +import domain.piece.ConsolePieceAppearance; import view.InputView; import view.OutputView; public class JanggiApplication { public static void main(String[] args) { - JanggiController janggiController = new JanggiController(new InputView(), new OutputView()); + JanggiController janggiController = new JanggiController(new InputView(), + new OutputView(new ConsolePieceAppearance())); janggiController.run(); } } diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index 2147fb83da..ad1d71f64a 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,10 +1,7 @@ package controller; +import domain.board.AbstractBoardFactory; import domain.board.Board; -import domain.board.LeftGwimaFactory; -import domain.board.RightGwimaFactory; -import domain.board.WonangmaFactory; -import domain.board.YanggwimaFactory; import domain.game.Team; import domain.game.Turn; import domain.piece.Piece; @@ -27,7 +24,6 @@ public JanggiController(InputView inputView, OutputView outputView) { public void run() { Board board = createBoard(); outputView.printBoard(board); - Turn turn = Turn.first(); while (true) { turn = playTurn(board, turn); @@ -38,33 +34,23 @@ private Board createBoard() { int choFormationNumber = inputView.initialFormation(Team.CHO); int hanFormationNumber = inputView.initialFormation(Team.HAN); Map pieces = new HashMap<>(); - pieces.putAll(initialBoard(choFormationNumber, Team.CHO)); - pieces.putAll(initialBoard(hanFormationNumber, Team.HAN)); + pieces.putAll(AbstractBoardFactory.from(choFormationNumber).createFormation(Team.CHO)); + pieces.putAll(AbstractBoardFactory.from(hanFormationNumber).createFormation(Team.HAN)); return new Board(pieces); } private Turn playTurn(Board board, Turn turn) { - List movePositions = inputView.askMovePiecePoisiton(turn.current()); - Position src = Position.from(movePositions.get(0), movePositions.get(1)); - Position dest = Position.from(movePositions.get(2), movePositions.get(3)); - board.move(src, dest); - outputView.printBoard(board); - return turn.next(); - } - - private Map initialBoard(int input, Team team) { - if (input == 1) { - return new LeftGwimaFactory().createFormation(team); - } - - if (input == 2) { - return new RightGwimaFactory().createFormation(team); - } - - if (input == 3) { - return new WonangmaFactory().createFormation(team); + while (true) { + try { + List movePositions = inputView.askMovePiecePoisiton(turn.current()); + Position src = Position.from(movePositions.get(0), movePositions.get(1)); + Position dest = Position.from(movePositions.get(2), movePositions.get(3)); + board.move(src, dest); + outputView.printBoard(board); + return turn.next(); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } } - - return new YanggwimaFactory().createFormation(team); } } diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index b1a4ebf569..2d45ccde1e 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -9,6 +9,19 @@ public abstract class AbstractBoardFactory implements BoardFactory { + public static BoardFactory from(int number) { + if (number == 1) { + return new LeftGwimaFactory(); + } + if (number == 2) { + return new RightGwimaFactory(); + } + if (number == 3) { + return new WonangmaFactory(); + } + return new YanggwimaFactory(); + } + @Override public Map createFormation(Team team) { Map pieces = new HashMap<>(); diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 6fc339abac..2bf912109f 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -1,9 +1,9 @@ package domain.board; -import domain.position.Position; import domain.piece.ActivePiece; import domain.piece.EmptyPiece; import domain.piece.Piece; +import domain.position.Position; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,11 +19,21 @@ public void move(Position src, Position dest) { Piece piece = pieces.get(src); validateCanMove(piece, src, dest); List route = ((ActivePiece) piece).searchRoute(src, dest); - validateIntermediateRoute(route); + if (piece.isCannon()) { + validateCannonRoute(route, dest); + } else { + validateIntermediateRoute(route); + } validateDestination(dest, piece); applyMove(src, dest, piece); } + private void validateCannonRoute(List route, Position dest) { + //포는 포를 못 넘음 + //포가 넘어야할 기물은 하나여야함 + //포는 포를 잡을 수 없음 + } + private void validateCanMove(Piece piece, Position src, Position dest) { if (!piece.canMove(src, dest)) { throw new IllegalArgumentException("이동할 수 없는 위치입니다."); diff --git a/src/main/java/domain/game/Team.java b/src/main/java/domain/game/Team.java index 78af7a7bc4..f2c44ee055 100644 --- a/src/main/java/domain/game/Team.java +++ b/src/main/java/domain/game/Team.java @@ -1,31 +1,23 @@ package domain.game; public enum Team { - CHO("초", "\u001B[34m", 1, 2, 3, 4), - HAN("한", "\u001B[31m", 10, 9, 8, 7); - - private static final String RESET = "\u001B[0m"; + CHO("초", 1, 2, 3, 4), + HAN("한", 10, 9, 8, 7); private final String teamName; - private final String colorCode; private final int backRow; private final int generalRow; private final int cannonRow; private final int soldierRow; - Team(String teamName, String colorCode, int backRow, int generalRow, int cannonRow, int soldierRow) { + Team(String teamName, int backRow, int generalRow, int cannonRow, int soldierRow) { this.teamName = teamName; - this.colorCode = colorCode; this.backRow = backRow; this.generalRow = generalRow; this.cannonRow = cannonRow; this.soldierRow = soldierRow; } - public String colorize(String text) { - return colorCode + text + RESET; - } - public int getBackRow() { return backRow; } diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index 16ebcc40ad..12cda0fdcc 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -1,7 +1,7 @@ package domain.piece; -import domain.position.Position; import domain.game.Team; +import domain.position.Position; import java.util.List; public abstract class ActivePiece implements Piece { @@ -13,7 +13,7 @@ protected ActivePiece(Team team, PieceType type) { this.type = type; } - public boolean isSameTeam(ActivePiece other) { + private boolean isSameTeam(ActivePiece other) { return this.team == other.team; } @@ -30,9 +30,14 @@ protected int forwardDirection() { public abstract List searchRoute(Position source, Position target); + @Override + public String display(PieceAppearance colorizer) { + return colorizer.colorize(team, type); + } + @Override public String toString() { - return team.colorize(type.getDisplayName()); + return type.name(); } @Override diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 8e6bf517b6..4bd7b124b6 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -1,7 +1,7 @@ package domain.piece; -import domain.position.Position; import domain.game.Team; +import domain.position.Position; import java.util.List; public class Cannon extends ActivePiece { @@ -23,4 +23,8 @@ public List searchRoute(Position source, Position target) { return source.makeColStraightRoute(target); } + + public boolean isCannon() { + return true; + } } diff --git a/src/main/java/domain/piece/ConsolePieceAppearance.java b/src/main/java/domain/piece/ConsolePieceAppearance.java new file mode 100644 index 0000000000..73a01c8d0a --- /dev/null +++ b/src/main/java/domain/piece/ConsolePieceAppearance.java @@ -0,0 +1,32 @@ +package domain.piece; + +import domain.game.Team; +import java.util.Map; + +public class ConsolePieceAppearance implements PieceAppearance { + private static final String RESET = "\u001B[0m"; + private static final Map COLORS = Map.of( + Team.CHO, "\u001B[34m", + Team.HAN, "\u001B[31m" + ); + + private static final Map DISPLAY_NAMES = Map.of( + PieceType.CHA, "차", + PieceType.MA, "마", + PieceType.SANG, "상", + PieceType.SA, "사", + PieceType.GENERAL, "궁", + PieceType.PHO, "포", + PieceType.BYEONG, "병" + ); + + @Override + public String colorize(Team team, PieceType type) { + return COLORS.get(team) + DISPLAY_NAMES.get(type) + RESET; + } + + @Override + public String colorizeEmpty() { + return "ㅡ"; + } +} diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index 568700ba19..645da8c56e 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -19,8 +19,13 @@ public boolean isAlly(Piece other) { return false; } + @Override + public String display(PieceAppearance colorizer) { + return colorizer.colorizeEmpty(); + } + @Override public String toString() { - return PieceType.EMPTY.getDisplayName(); + return PieceType.EMPTY.name(); } } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index d0372ba8e4..a4dd63b273 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -8,4 +8,10 @@ public interface Piece { boolean isNotEmpty(); boolean isAlly(Piece other); + + String display(PieceAppearance colorizer); + + default boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/PieceAppearance.java b/src/main/java/domain/piece/PieceAppearance.java new file mode 100644 index 0000000000..a4cad188e8 --- /dev/null +++ b/src/main/java/domain/piece/PieceAppearance.java @@ -0,0 +1,9 @@ +package domain.piece; + +import domain.game.Team; + +public interface PieceAppearance { + String colorize(Team team, PieceType type); + + String colorizeEmpty(); +} diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index 3da2145c1c..f77a34cf61 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -5,31 +5,25 @@ import java.util.function.Function; public enum PieceType { - CHA(13.0, "차", List.of(1, 9), Chariot::new), - MA(5.0, "마", List.of(2, 3, 7, 8), Horse::new), - SANG(3.0, "상", List.of(2, 3, 7, 8), Elephant::new), - SA(3.0, "사", List.of(4, 6), Guard::new), - GENERAL(0.0, "궁", List.of(5), General::new), - PHO(7.0, "포", List.of(2, 8), Cannon::new), - BYEONG(2.0, "병", List.of(1, 3, 5, 7, 9), Soldier::new), - EMPTY(0.0, "ㅡ", List.of(), team -> new EmptyPiece()); + CHA(13.0, List.of(1, 9), Chariot::new), + MA(5.0, List.of(2, 3, 7, 8), Horse::new), + SANG(3.0, List.of(2, 3, 7, 8), Elephant::new), + SA(3.0, List.of(4, 6), Guard::new), + GENERAL(0.0, List.of(5), General::new), + PHO(7.0, List.of(2, 8), Cannon::new), + BYEONG(2.0, List.of(1, 3, 5, 7, 9), Soldier::new), + EMPTY(0.0, List.of(), team -> new EmptyPiece()); private final double score; - private final String displayName; private final List initialColumns; private final Function pieceFactory; - PieceType(double score, String displayName, List initialColumns, Function pieceFactory) { + PieceType(double score, List initialColumns, Function pieceFactory) { this.score = score; - this.displayName = displayName; this.initialColumns = initialColumns; this.pieceFactory = pieceFactory; } - public String getDisplayName() { - return displayName; - } - public List getInitialColumns() { return initialColumns; } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index dceb02be85..830685b190 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -11,14 +11,17 @@ public class InputView { private final Scanner scanner = new Scanner(System.in); public Integer initialFormation(Team team) { - System.out.println(team + " 진영 배치 전략을 입력 하세요.\n1. 왼상\n2. 오른상\n3. 원앙마\n4. 양귀마 "); - try { - int parseNumber = Integer.parseInt(scanner.nextLine()); - return validRange(parseNumber); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("숫자를 입력해주세요."); + while (true) { + System.out.println(team + " 진영 배치 전략을 입력 하세요.\n1. 왼상\n2. 오른상\n3. 원앙마\n4. 양귀마 "); + try { + int parseNumber = Integer.parseInt(scanner.nextLine()); + return validRange(parseNumber); + } catch (NumberFormatException e) { + System.out.println("숫자를 입력해주세요."); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } } - } private int validRange(int number) { @@ -26,16 +29,21 @@ private int validRange(int number) { throw new IllegalArgumentException("1 ~ 4 사이의 숫자로 입력해주세요."); } return number; - } public List askMovePiecePoisiton(Team team) { - System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 행과 열 순서대로 입력하세요. ( 예: 2,5,4,3 )"); - List positions = Arrays.stream(scanner.nextLine().split(",")) - .map(String::trim) - .collect(Collectors.toList()); - validatePositionFormat(positions); - return positions; + while (true) { + System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 행과 열 순서대로 입력하세요. ( 예: 2,5,4,3 )"); + try { + List positions = Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .collect(Collectors.toList()); + validatePositionFormat(positions); + return positions; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } } private void validatePositionFormat(List positions) { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index da154afca9..cbe20e0db2 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,13 +1,18 @@ package view; -import domain.position.Position; import domain.board.Board; import domain.piece.Piece; +import domain.piece.PieceAppearance; +import domain.position.Position; public class OutputView { - private static final int MAX_ROW = 10; private static final int MAX_COLUMN = 9; + private final PieceAppearance appearance; + + public OutputView(PieceAppearance appearance) { + this.appearance = appearance; + } public void printBoard(Board board) { StringBuilder sb = new StringBuilder(); @@ -31,7 +36,7 @@ private void appendColumnHeader(StringBuilder sb) { private void appendRow(StringBuilder sb, Board board, int row) { for (int col = 1; col <= MAX_COLUMN; col++) { Piece piece = board.pieceAt(new Position(row, col)); - sb.append(piece.toString()).append("\t"); + sb.append(piece.display(appearance)).append("\t"); } } } From 16ad9c7dc3d3bd65ff06a022404235b1d1e21381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 19:29:32 +0900 Subject: [PATCH 35/55] =?UTF-8?q?feat:=20=ED=8F=AC=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/board/Board.java | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 2bf912109f..d165f6dd94 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -29,9 +29,24 @@ public void move(Position src, Position dest) { } private void validateCannonRoute(List route, Position dest) { - //포는 포를 못 넘음 - //포가 넘어야할 기물은 하나여야함 - //포는 포를 잡을 수 없음 + int count = 0; + for (Position position : route) { + if (pieceAt(position).isCannon()) { + throw new IllegalArgumentException("포는 포를 넘지 못합니다."); + } + + if (pieceAt(position).isNotEmpty()) { + count++; + } + } + + if (count != 1) { + throw new IllegalArgumentException("포가 넘을 수 있는 기물의 개수는 하나입니다."); + } + + if (pieceAt(dest).isCannon()) { + throw new IllegalArgumentException("포는 포를 잡을 수 없습니다."); + } } private void validateCanMove(Piece piece, Position src, Position dest) { From 7bc74d0820dd8558ee33d2193d5d0f8cb26f0697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 19:33:45 +0900 Subject: [PATCH 36/55] =?UTF-8?q?refactor:=20AbstractBoardFactory=20if=20?= =?UTF-8?q?=EB=B6=84=EA=B8=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/board/AbstractBoardFactory.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index 2d45ccde1e..f956f303c7 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -1,25 +1,23 @@ package domain.board; -import domain.position.Position; +import domain.game.Team; import domain.piece.Piece; import domain.piece.PieceType; -import domain.game.Team; +import domain.position.Position; import java.util.HashMap; import java.util.Map; public abstract class AbstractBoardFactory implements BoardFactory { - public static BoardFactory from(int number) { - if (number == 1) { - return new LeftGwimaFactory(); - } - if (number == 2) { - return new RightGwimaFactory(); - } - if (number == 3) { - return new WonangmaFactory(); - } - return new YanggwimaFactory(); + private static final Map factories = Map.of( + 1, new LeftGwimaFactory(), + 2, new RightGwimaFactory(), + 3, new WonangmaFactory(), + 4, new YanggwimaFactory() + ); + + public static AbstractBoardFactory from(int input) { + return factories.get(input); } @Override From 5343fffd11361aab13d5b35f22371e2a1e18bc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 19:49:03 +0900 Subject: [PATCH 37/55] =?UTF-8?q?test:=20=EA=B8=B0=EB=AC=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradlew | 0 src/test/java/domain/PositionTest.java | 6 +++--- src/test/java/domain/activePiece/CannonTest.java | 9 ++++----- src/test/java/domain/activePiece/ChariotTest.java | 9 ++++----- src/test/java/domain/activePiece/ElephantTest.java | 6 +++--- src/test/java/domain/activePiece/GeneralTest.java | 7 +++---- src/test/java/domain/activePiece/GuardTest.java | 7 +++---- src/test/java/domain/activePiece/HorseTest.java | 6 +++--- src/test/java/domain/activePiece/SoldierTest.java | 9 ++++----- 9 files changed, 27 insertions(+), 32 deletions(-) mode change 100755 => 100644 gradlew diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/src/test/java/domain/PositionTest.java b/src/test/java/domain/PositionTest.java index 05473fe7f0..96f586ee9e 100644 --- a/src/test/java/domain/PositionTest.java +++ b/src/test/java/domain/PositionTest.java @@ -10,7 +10,7 @@ class PositionTest { @Test void 경계값_최대_범위의_위치를_생성한다() { - Position position = new Position(9, 10); + Position position = new Position(10, 9); assertThat(position).isNotNull(); } @@ -22,8 +22,8 @@ class PositionTest { } @Test - void 행이_10이면_예외가_발생한다() { - assertThatThrownBy(() -> new Position(10, 5)) + void 행이_11이면_예외가_발생한다() { + assertThatThrownBy(() -> new Position(11, 5)) .isInstanceOf(IllegalArgumentException.class); } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 17066efa34..2f1244f789 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Cannon; +import domain.piece.Piece; import domain.position.Column; import domain.position.Position; import domain.position.Row; -import domain.piece.Piece; -import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -35,9 +35,8 @@ class CannonTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)), - new Position(new Row(3), new Column(3)), - new Position(new Row(4), new Column(3)))); + List.of(new Position(new Row(2), new Column(3)), + new Position(new Row(3), new Column(3)))); assertThat(cannon.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index 32993165d0..b836fe67c8 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Chariot; +import domain.piece.Piece; import domain.position.Column; import domain.position.Position; import domain.position.Row; -import domain.piece.Piece; -import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -35,9 +35,8 @@ class ChariotTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)), - new Position(new Row(3), new Column(3)), - new Position(new Row(4), new Column(3)))); + List.of(new Position(new Row(2), new Column(3)), + new Position(new Row(3), new Column(3)))); assertThat(chariot.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index 6be11d845f..1e37d0d5f3 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -2,11 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Elephant; -import domain.position.Position; import domain.piece.Piece; -import domain.game.Team; +import domain.position.Position; import java.util.List; import org.junit.jupiter.api.Test; @@ -31,7 +31,7 @@ class ElephantTest { Position mid = new Position(4, 3); Position mid2 = new Position(5, 4); Position dest = new Position(6, 5); - List routes = List.of(src, mid, mid2, dest); + List routes = List.of(mid, mid2); assertThat(elephant.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index 0324c6e173..79a6363585 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.General; +import domain.piece.Piece; import domain.position.Column; import domain.position.Position; import domain.position.Row; -import domain.piece.Piece; -import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -33,8 +33,7 @@ class GeneralTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); - List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + List routes = new ArrayList<>(); assertThat(general.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 007744a643..af0e87ec35 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Guard; +import domain.piece.Piece; import domain.position.Column; import domain.position.Position; import domain.position.Row; -import domain.piece.Piece; -import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -33,8 +33,7 @@ class GuardTest { Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); - List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + List routes = new ArrayList<>(); assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index c6e09c4906..67008ae26c 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -2,11 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Horse; -import domain.position.Position; import domain.piece.Piece; -import domain.game.Team; +import domain.position.Position; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -31,7 +31,7 @@ class HorseTest { Position src = new Position(3, 3); Position mid = new Position(4, 3); Position dest = new Position(5, 4); - List routes = List.of(src, mid, dest); + List routes = List.of(mid); assertThat(horse.searchRoute(src, dest)).isEqualTo(routes); } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 1e3c42d0a3..6b1cd289fe 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -2,15 +2,15 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.game.Team; import domain.piece.ActivePiece; import domain.piece.Elephant; import domain.piece.Guard; +import domain.piece.Piece; import domain.piece.Soldier; import domain.position.Column; import domain.position.Position; import domain.position.Row; -import domain.piece.Piece; -import domain.game.Team; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -66,13 +66,12 @@ class SoldierTest { } @Test - void 병_정상_경로_출력_한다() { + void 병은_빈_경로_출력_한다() { ActivePiece guard = new Guard(Team.HAN); Position src = new Position(new Row(1), new Column(3)); Position dest = new Position(new Row(2), new Column(3)); - List routes = new ArrayList<>( - List.of(new Position(new Row(1), new Column(3)), new Position(new Row(2), new Column(3)))); + List routes = new ArrayList<>(); assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); } From 036506b1d3bec8e1687ee251ec9c0b9d056fe3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 20:25:21 +0900 Subject: [PATCH 38/55] =?UTF-8?q?test:=20Board=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20Test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BoardTest.java | 151 ++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/test/java/domain/BoardTest.java diff --git a/src/test/java/domain/BoardTest.java b/src/test/java/domain/BoardTest.java new file mode 100644 index 0000000000..ea6ee19afa --- /dev/null +++ b/src/test/java/domain/BoardTest.java @@ -0,0 +1,151 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import domain.board.Board; +import domain.game.Team; +import domain.piece.Cannon; +import domain.piece.Chariot; +import domain.piece.EmptyPiece; +import domain.piece.Piece; +import domain.piece.Soldier; +import domain.position.Position; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +public class BoardTest { + + @Test + void 기물이_이동하면_원래_위치는_빈칸이_된다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Chariot(Team.HAN)); + Board board = new Board(pieces); + + board.move(new Position(1, 1), new Position(1, 5)); + + assertThat(board.pieceAt(new Position(1, 1)).isNotEmpty()).isFalse(); + } + + @Test + void 기물이_이동하면_도착_위치에_기물이_있다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Chariot(Team.HAN)); + Board board = new Board(pieces); + + board.move(new Position(1, 1), new Position(1, 5)); + + assertThat(board.pieceAt(new Position(1, 5)).isNotEmpty()).isTrue(); + } + + @Test + void 이동_경로에_기물이_있으면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Chariot(Team.HAN)); + pieces.put(new Position(1, 3), new Soldier(Team.CHO)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이동 경로에 기물이 있습니다."); + } + + @Test + void 아군_기물이_있는_위치로_이동하면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Chariot(Team.HAN)); + pieces.put(new Position(1, 5), new Chariot(Team.HAN)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("아군 기물이 있는 위치로 이동할 수 없습니다."); + } + + @Test + void 적_기물을_잡으면_도착지에_내_기물이_있다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Chariot(Team.HAN)); + pieces.put(new Position(1, 5), new Chariot(Team.CHO)); + Board board = new Board(pieces); + + board.move(new Position(1, 1), new Position(1, 5)); + + assertThat(board.pieceAt(new Position(1, 5))).isInstanceOf(Chariot.class); + assertThat(board.pieceAt(new Position(1, 1))).isInstanceOf(EmptyPiece.class); + } + + @Test + void 이동할_수_없는_방향이면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(5, 5), new Chariot(Team.HAN)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(5, 5), new Position(3, 3))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이동할 수 없는 위치입니다."); + } + + @Test + void 포는_기물_하나를_넘어_이동한다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Cannon(Team.HAN)); + pieces.put(new Position(1, 3), new Soldier(Team.CHO)); + Board board = new Board(pieces); + + board.move(new Position(1, 1), new Position(1, 5)); + + assertThat(board.pieceAt(new Position(1, 5)).isNotEmpty()).isTrue(); + assertThat(board.pieceAt(new Position(1, 1)).isNotEmpty()).isFalse(); + } + + @Test + void 포가_넘을_기물이_없으면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Cannon(Team.HAN)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("포가 넘을 수 있는 기물의 개수는 하나입니다."); + } + + @Test + void 포가_두_개_이상의_기물을_넘으면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Cannon(Team.HAN)); + pieces.put(new Position(1, 3), new Soldier(Team.CHO)); + pieces.put(new Position(1, 5), new Soldier(Team.CHO)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 7))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("포가 넘을 수 있는 기물의 개수는 하나입니다."); + } + + @Test + void 포는_포를_넘지_못한다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Cannon(Team.HAN)); + pieces.put(new Position(1, 3), new Cannon(Team.CHO)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("포는 포를 넘지 못합니다."); + } + + @Test + void 포는_포를_잡을_수_없다() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new Cannon(Team.HAN)); + pieces.put(new Position(1, 3), new Soldier(Team.CHO)); + pieces.put(new Position(1, 5), new Cannon(Team.CHO)); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("포는 포를 잡을 수 없습니다."); + } +} From 78593eea200dd24bce76ea4793bfea74716af5f2 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Sun, 29 Mar 2026 20:37:53 +0900 Subject: [PATCH 39/55] =?UTF-8?q?test:=20Board,=20Turn,=20Position=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradlew | 0 .../java/domain/activePiece/SoldierTest.java | 36 +++++++++++------- .../java/domain/{ => board}/BoardTest.java | 14 ++++++- src/test/java/domain/game/TurnTest.java | 38 +++++++++++++++++++ .../domain/{ => position}/PositionTest.java | 10 ++++- 5 files changed, 81 insertions(+), 17 deletions(-) mode change 100644 => 100755 gradlew rename src/test/java/domain/{ => board}/BoardTest.java (92%) create mode 100644 src/test/java/domain/game/TurnTest.java rename src/test/java/domain/{ => position}/PositionTest.java (91%) diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 6b1cd289fe..0a2fa2aeab 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -4,8 +4,6 @@ import domain.game.Team; import domain.piece.ActivePiece; -import domain.piece.Elephant; -import domain.piece.Guard; import domain.piece.Piece; import domain.piece.Soldier; import domain.position.Column; @@ -35,9 +33,15 @@ class SoldierTest { assertThat(soldier.canMove(new Position(5, 5), new Position(4, 5))).isTrue(); } + @Test + void 한_진영에서_후진_불가() { + Piece soldier = new Soldier(Team.HAN); + assertThat(soldier.canMove(new Position(5, 5), new Position(6, 5))).isFalse(); + } + @Test void 한_진영에서_정상_범위가_아니면_거짓() { - Piece soldier = new Elephant(Team.HAN); + Piece soldier = new Soldier(Team.HAN); assertThat(soldier.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); } @@ -59,33 +63,39 @@ class SoldierTest { assertThat(soldier.canMove(new Position(5, 5), new Position(6, 5))).isTrue(); } + @Test + void 초_진영에서_후진_불가() { + Piece soldier = new Soldier(Team.CHO); + assertThat(soldier.canMove(new Position(5, 5), new Position(4, 5))).isFalse(); + } + @Test void 초_진영에서_정상_범위가_아니면_거짓() { - Piece soldier = new Elephant(Team.CHO); + Piece soldier = new Soldier(Team.CHO); assertThat(soldier.canMove(new Position(5, 5), new Position(8, 8))).isFalse(); } @Test void 병은_빈_경로_출력_한다() { - ActivePiece guard = new Guard(Team.HAN); + ActivePiece soldier = new Soldier(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position src = new Position(new Row(5), new Column(5)); + Position dest = new Position(new Row(4), new Column(5)); List routes = new ArrayList<>(); - assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); + assertThat(soldier.searchRoute(src, dest)).isEqualTo(routes); } @Test void 병_비정상_경로_출력_한다() { - ActivePiece guard = new Guard(Team.HAN); + ActivePiece soldier = new Soldier(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position src = new Position(new Row(5), new Column(5)); + Position dest = new Position(new Row(4), new Column(5)); List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(3)))); + List.of(new Position(new Row(3), new Column(5)))); - assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(soldier.searchRoute(src, dest)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/BoardTest.java b/src/test/java/domain/board/BoardTest.java similarity index 92% rename from src/test/java/domain/BoardTest.java rename to src/test/java/domain/board/BoardTest.java index ea6ee19afa..88c013022d 100644 --- a/src/test/java/domain/BoardTest.java +++ b/src/test/java/domain/board/BoardTest.java @@ -1,9 +1,8 @@ -package domain; +package domain.board; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import domain.board.Board; import domain.game.Team; import domain.piece.Cannon; import domain.piece.Chariot; @@ -148,4 +147,15 @@ public class BoardTest { .isInstanceOf(IllegalArgumentException.class) .hasMessage("포는 포를 잡을 수 없습니다."); } + + @Test + void 빈_칸에서_이동_시도하면_예외() { + Map pieces = new HashMap<>(); + pieces.put(new Position(1, 1), new EmptyPiece()); + Board board = new Board(pieces); + + assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이동할 수 없는 위치입니다."); + } } diff --git a/src/test/java/domain/game/TurnTest.java b/src/test/java/domain/game/TurnTest.java new file mode 100644 index 0000000000..f656c6e3d8 --- /dev/null +++ b/src/test/java/domain/game/TurnTest.java @@ -0,0 +1,38 @@ +package domain.game; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class TurnTest { + + @Test + void 게임은_초_진영부터_시작한다() { + Turn turn = Turn.first(); + assertThat(turn.isTurn(Team.CHO)).isTrue(); + } + + @Test + void 초_진영_다음_턴은_한_진영이다() { + Turn turn = Turn.first(); + assertThat(turn.next().isTurn(Team.HAN)).isTrue(); + } + + @Test + void 한_진영_다음_턴은_초_진영이다() { + Turn turn = Turn.first().next(); + assertThat(turn.next().isTurn(Team.CHO)).isTrue(); + } + + @Test + void 현재_팀의_턴이면_true를_반환한다() { + Turn turn = Turn.first(); + assertThat(turn.isTurn(Team.CHO)).isTrue(); + } + + @Test + void 현재_팀이_아니면_false를_반환한다() { + Turn turn = Turn.first(); + assertThat(turn.isTurn(Team.HAN)).isFalse(); + } +} diff --git a/src/test/java/domain/PositionTest.java b/src/test/java/domain/position/PositionTest.java similarity index 91% rename from src/test/java/domain/PositionTest.java rename to src/test/java/domain/position/PositionTest.java index 96f586ee9e..9d07f1ac60 100644 --- a/src/test/java/domain/PositionTest.java +++ b/src/test/java/domain/position/PositionTest.java @@ -1,13 +1,19 @@ -package domain; +package domain.position; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import domain.position.Position; import org.junit.jupiter.api.Test; class PositionTest { + @Test + void 경계값_최소_범위의_위치를_생성한다() { + Position position = new Position(1, 1); + + assertThat(position).isNotNull(); + } + @Test void 경계값_최대_범위의_위치를_생성한다() { Position position = new Position(10, 9); From 32db79b56a3997612df5e5f9b277d822b3989e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=80=ED=98=84?= Date: Sun, 29 Mar 2026 20:40:37 +0900 Subject: [PATCH 40/55] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9634e0221f..c88a33caae 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ -# java-janggi +## 기능 요구사항 체크리스트 -장기 미션 저장소. +### 게임 초기화 + +- [x] 두 플레이어가 각각 진형을 선택한다 +- [x] 진형 선택지: 왼상마(귀마), 오른상마(귀마), 원앙마, 양귀마 +- [x] 선택한 진형에 따라 마(馬)와 상(象)의 위치가 결정된다 + +### 기물 이동 + +- [x] 차(車): 직선(가로/세로) 이동, 이동 경로에 기물이 없어야 한다 +- [x] 마(馬): 직선 1칸 + 대각선 1칸 이동, 첫 번째 칸에 기물이 없어야 한다 +- [x] 상(象): 직선 1칸 + 대각선 2칸 이동, 이동 경로 2칸에 기물이 없어야 한다 +- [x] 궁(將/帥): 상하좌우 1칸 이동 +- [x] 사(士): 상하좌우 1칸 이동 +- [x] 포(包): 직선 이동, 반드시 기물 1개를 뛰어넘어야 하며 포를 넘거나 포를 잡을 수 없다 +- [x] 병/졸(兵/卒): 앞 또는 좌우 1칸 이동 + +### 이동 유효성 검증 + +- [x] 이동 불가능한 위치로 이동 시 예외 처리 +- [x] 이동 경로 중간에 기물이 있을 경우 이동 불가 (포 제외) +- [x] 아군 기물이 있는 위치로 이동 불가 +- [x] 적군 기물이 있는 위치로 이동 시 해당 기물 잡기 +- [x] 포의 경우 이동 경로에 정확히 1개의 기물이 있어야 이동 가능 +- [x] 포는 포를 뛰어넘거나 포를 잡을 수 없다 + +### 게임 진행 + +- [x] 초(CHO)가 먼저 시작하고 이후 번갈아 진행한다 +- [x] 매 턴 현재 보드 상태를 출력한다 +- [x] 잘못된 입력 시 재입력을 받는다 + +### 출력 + +- [x] 10x9 보드를 콘솔에 출력한다 +- [x] 초(CHO)는 파란색, 한(HAN)은 빨간색으로 구분하여 출력한다 +- [x] 빈 칸은 `ㅡ`로 표시한다 + +--- From 7ef7e9d3882b8db9a4070f46477028b83a9fac62 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Tue, 31 Mar 2026 17:48:06 +0900 Subject: [PATCH 41/55] =?UTF-8?q?refactor:=20EmptyPiece=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=ED=86=A4=20=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/board/Board.java | 4 ++-- src/main/java/domain/piece/EmptyPiece.java | 10 ++++++++++ src/main/java/domain/piece/PieceType.java | 2 +- src/test/java/domain/board/BoardTest.java | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index d165f6dd94..a8a4f92c1e 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -71,10 +71,10 @@ private void validateDestination(Position dest, Piece movingPiece) { private void applyMove(Position src, Position dest, Piece piece) { pieces.put(dest, piece); - pieces.put(src, new EmptyPiece()); + pieces.put(src, EmptyPiece.getInstance()); } public Piece pieceAt(Position position) { - return pieces.getOrDefault(position, new EmptyPiece()); + return pieces.getOrDefault(position, EmptyPiece.getInstance()); } } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index 645da8c56e..eb1802a1ec 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -4,6 +4,16 @@ public class EmptyPiece implements Piece { + private EmptyPiece() {} + + private static class LazyHolder { + private static final EmptyPiece INSTANCE = new EmptyPiece(); + } + + public static EmptyPiece getInstance() { + return LazyHolder.INSTANCE; + } + @Override public boolean canMove(Position source, Position target) { return false; diff --git a/src/main/java/domain/piece/PieceType.java b/src/main/java/domain/piece/PieceType.java index f77a34cf61..0835706c0a 100644 --- a/src/main/java/domain/piece/PieceType.java +++ b/src/main/java/domain/piece/PieceType.java @@ -12,7 +12,7 @@ public enum PieceType { GENERAL(0.0, List.of(5), General::new), PHO(7.0, List.of(2, 8), Cannon::new), BYEONG(2.0, List.of(1, 3, 5, 7, 9), Soldier::new), - EMPTY(0.0, List.of(), team -> new EmptyPiece()); + EMPTY(0.0, List.of(), team -> EmptyPiece.getInstance()),; private final double score; private final List initialColumns; diff --git a/src/test/java/domain/board/BoardTest.java b/src/test/java/domain/board/BoardTest.java index 88c013022d..ec90b54ced 100644 --- a/src/test/java/domain/board/BoardTest.java +++ b/src/test/java/domain/board/BoardTest.java @@ -151,7 +151,7 @@ public class BoardTest { @Test void 빈_칸에서_이동_시도하면_예외() { Map pieces = new HashMap<>(); - pieces.put(new Position(1, 1), new EmptyPiece()); + pieces.put(new Position(1, 1), EmptyPiece.getInstance()); Board board = new Board(pieces); assertThatThrownBy(() -> board.move(new Position(1, 1), new Position(1, 5))) From ccae38449ac5ae870825bab0459a2849d7c99e92 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Tue, 31 Mar 2026 17:56:43 +0900 Subject: [PATCH 42/55] =?UTF-8?q?refactor:=20Row,=20Column=20=EB=A7=A4?= =?UTF-8?q?=EC=A7=81=20=EB=84=98=EB=B2=84=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/position/Column.java | 6 +++++- src/main/java/domain/position/Row.java | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/position/Column.java b/src/main/java/domain/position/Column.java index 561f0c141e..624f11d1a6 100644 --- a/src/main/java/domain/position/Column.java +++ b/src/main/java/domain/position/Column.java @@ -1,6 +1,10 @@ package domain.position; public class Column { + + private static final int MIN_COLUMNS_NUMBER = 1; + private static final int MAX_COLUMNS_NUMBER = 9; + private final int value; public Column(int value) { @@ -9,7 +13,7 @@ public Column(int value) { } private void validate(int value) { - if (value <= 0 || value > 9) { + if (value <= MIN_COLUMNS_NUMBER || value > MAX_COLUMNS_NUMBER) { throw new IllegalArgumentException("열의 위치는 1-9 사이에 있어야 합니다."); } } diff --git a/src/main/java/domain/position/Row.java b/src/main/java/domain/position/Row.java index de16442b18..4e5c5ac9d1 100644 --- a/src/main/java/domain/position/Row.java +++ b/src/main/java/domain/position/Row.java @@ -1,6 +1,10 @@ package domain.position; public class Row { + + private static final int MIN_ROW_NUMBER = 1; + private static final int MAX_ROW_NUMBER = 9; + private final int value; public Row(int value) { From 494396ba6ae4633f59953f37212394f40b06cf58 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Tue, 31 Mar 2026 20:29:46 +0900 Subject: [PATCH 43/55] =?UTF-8?q?refactor:=20=EC=98=A4=ED=83=88=EC=9E=90,?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=EC=B6=9C=EB=A0=A5=20=EC=B1=85=EC=9E=84=20?= =?UTF-8?q?=EC=95=84=EC=9B=83=ED=92=8B=20=EB=B7=B0=EC=97=90=20=EC=9C=84?= =?UTF-8?q?=EC=9E=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/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index ad1d71f64a..b6f10e2e41 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -42,14 +42,14 @@ private Board createBoard() { private Turn playTurn(Board board, Turn turn) { while (true) { try { - List movePositions = inputView.askMovePiecePoisiton(turn.current()); + List movePositions = inputView.askMovePiecePosition(turn.current()); Position src = Position.from(movePositions.get(0), movePositions.get(1)); Position dest = Position.from(movePositions.get(2), movePositions.get(3)); board.move(src, dest); outputView.printBoard(board); return turn.next(); } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); + outputView.printError(e.getMessage()); } } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 830685b190..6d4b982fde 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -31,7 +31,7 @@ private int validRange(int number) { return number; } - public List askMovePiecePoisiton(Team team) { + public List askMovePiecePosition(Team team) { while (true) { System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 행과 열 순서대로 입력하세요. ( 예: 2,5,4,3 )"); try { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index cbe20e0db2..93f4bd06fd 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -25,6 +25,10 @@ public void printBoard(Board board) { System.out.println(sb); } + public void printError(String message) { + System.out.println(message); + } + private void appendColumnHeader(StringBuilder sb) { sb.append(" \t"); for (int col = 1; col <= MAX_COLUMN; col++) { From 168cc30f466b19dea6055888a00d0243f99e85f2 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Tue, 31 Mar 2026 20:39:00 +0900 Subject: [PATCH 44/55] =?UTF-8?q?refactor:=20dx,=20dy=20=EC=B6=95=EC=95=BD?= =?UTF-8?q?=EC=96=B4=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20static=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/Elephant.java | 8 ++++---- src/main/java/domain/piece/General.java | 8 ++++---- src/main/java/domain/piece/Guard.java | 8 ++++---- src/main/java/domain/piece/Horse.java | 8 ++++---- src/main/java/domain/piece/Soldier.java | 8 ++++---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index d1c018c844..ca0d10d6dd 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -6,8 +6,8 @@ public class Elephant extends ActivePiece { - private final List dx = List.of(2, 3, -2, -3, -3, -2, 2, 3); - private final List dy = List.of(3, 2, 3, 2, -2, -3, -3, -2); + private static final List rowOffsets = List.of(2, 3, -2, -3, -3, -2, 2, 3); + private static final List columnOffsets = List.of(3, 2, 3, 2, -2, -3, -3, -2); public Elephant(Team team) { super(team, PieceType.SANG); @@ -18,8 +18,8 @@ public boolean canMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); - for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + for (int i = 0; i < rowOffsets.size(); i++) { + if (rowOffsets.get(i) == rowDiff && columnOffsets.get(i) == colDiff) { return true; } } diff --git a/src/main/java/domain/piece/General.java b/src/main/java/domain/piece/General.java index c7f9906323..ce0e335cdc 100644 --- a/src/main/java/domain/piece/General.java +++ b/src/main/java/domain/piece/General.java @@ -5,8 +5,8 @@ import java.util.List; public class General extends ActivePiece { - private final List dx = List.of(-1, 1, 0, 0); - private final List dy = List.of(0, 0, -1, 1); + private static final List rowOffsets = List.of(-1, 1, 0, 0); + private static final List columnOffsets = List.of(0, 0, -1, 1); public General(Team team) { super(team, PieceType.GENERAL); @@ -17,8 +17,8 @@ public boolean canMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); - for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + for (int i = 0; i < rowOffsets.size(); i++) { + if (rowOffsets.get(i) == rowDiff && columnOffsets.get(i) == colDiff) { return true; } } diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index 8b05b09325..73fc3bc42c 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -5,8 +5,8 @@ import java.util.List; public class Guard extends ActivePiece { - private final List dx = List.of(-1, 1, 0, 0); - private final List dy = List.of(0, 0, -1, 1); + private static final List rowOffsets = List.of(-1, 1, 0, 0); + private static final List columnOffsets = List.of(0, 0, -1, 1); public Guard(Team team) { super(team, PieceType.SA); @@ -17,8 +17,8 @@ public boolean canMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); - for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + for (int i = 0; i < rowOffsets.size(); i++) { + if (rowOffsets.get(i) == rowDiff && columnOffsets.get(i) == colDiff) { return true; } } diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index 738be975ae..bb2a9a6812 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -6,8 +6,8 @@ public class Horse extends ActivePiece { - private final List dx = List.of(1, 2, 2, 1, -1, -2, -2, -1); - private final List dy = List.of(2, 1, -1, -2, -2, -1, 1, 2); + private static final List rowOffsets = List.of(1, 2, 2, 1, -1, -2, -2, -1); + private static final List columnOffsets = List.of(2, 1, -1, -2, -2, -1, 1, 2); public Horse(Team team) { super(team, PieceType.MA); @@ -18,8 +18,8 @@ public boolean canMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); - for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == rowDiff && dy.get(i) == colDiff) { + for (int i = 0; i < rowOffsets.size(); i++) { + if (rowOffsets.get(i) == rowDiff && columnOffsets.get(i) == colDiff) { return true; } } diff --git a/src/main/java/domain/piece/Soldier.java b/src/main/java/domain/piece/Soldier.java index 0a72092825..b026fed23a 100644 --- a/src/main/java/domain/piece/Soldier.java +++ b/src/main/java/domain/piece/Soldier.java @@ -5,8 +5,8 @@ import java.util.List; public class Soldier extends ActivePiece { - private final List dx = List.of(-1, 1); - private final List dy = List.of(0, 0); + private static final List rowOffsets = List.of(-1, 1); + private static final List columnOffsets = List.of(0, 0); public Soldier(Team team) { super(team, PieceType.BYEONG); @@ -24,8 +24,8 @@ private boolean isValidSideMove(Position source, Position target) { int rowDiff = target.rowDiff(source); int colDiff = target.columnDiff(source); - for (int i = 0; i < dx.size(); i++) { - if (dx.get(i) == colDiff && dy.get(i) == rowDiff) { + for (int i = 0; i < rowOffsets.size(); i++) { + if (rowOffsets.get(i) == colDiff && columnOffsets.get(i) == rowDiff) { return true; } } From b5268720810ac43e799cc88894709641abf70291 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Tue, 31 Mar 2026 21:58:58 +0900 Subject: [PATCH 45/55] =?UTF-8?q?refactor:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F?= =?UTF-8?q?=20JanggiGame=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/JanggiController.java | 39 ++++++---------- src/main/java/domain/game/JanggiGame.java | 44 +++++++++++++++++++ src/main/java/domain/position/Column.java | 2 +- src/main/java/view/InputView.java | 15 ++++--- 4 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 src/main/java/domain/game/JanggiGame.java diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index b6f10e2e41..e9c80c3d5a 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,14 +1,9 @@ package controller; -import domain.board.AbstractBoardFactory; -import domain.board.Board; +import domain.game.JanggiGame; import domain.game.Team; -import domain.game.Turn; -import domain.piece.Piece; import domain.position.Position; -import java.util.HashMap; import java.util.List; -import java.util.Map; import view.InputView; import view.OutputView; @@ -22,32 +17,26 @@ public JanggiController(InputView inputView, OutputView outputView) { } public void run() { - Board board = createBoard(); - outputView.printBoard(board); - Turn turn = Turn.first(); - while (true) { - turn = playTurn(board, turn); + JanggiGame game = createGame(); + outputView.printBoard(game.getBoard()); + while (game.isRunning()) { + playTurn(game); } } - private Board createBoard() { - int choFormationNumber = inputView.initialFormation(Team.CHO); - int hanFormationNumber = inputView.initialFormation(Team.HAN); - Map pieces = new HashMap<>(); - pieces.putAll(AbstractBoardFactory.from(choFormationNumber).createFormation(Team.CHO)); - pieces.putAll(AbstractBoardFactory.from(hanFormationNumber).createFormation(Team.HAN)); - return new Board(pieces); + private JanggiGame createGame() { + int choFormation = inputView.initialFormation(Team.CHO); + int hanFormation = inputView.initialFormation(Team.HAN); + return JanggiGame.of(choFormation, hanFormation); } - private Turn playTurn(Board board, Turn turn) { + private void playTurn(JanggiGame game) { while (true) { try { - List movePositions = inputView.askMovePiecePosition(turn.current()); - Position src = Position.from(movePositions.get(0), movePositions.get(1)); - Position dest = Position.from(movePositions.get(2), movePositions.get(3)); - board.move(src, dest); - outputView.printBoard(board); - return turn.next(); + List positions = inputView.askMovePiecePosition(game.currentTurn()); + game.move(positions.get(0), positions.get(1)); + outputView.printBoard(game.getBoard()); + return; } catch (IllegalArgumentException e) { outputView.printError(e.getMessage()); } diff --git a/src/main/java/domain/game/JanggiGame.java b/src/main/java/domain/game/JanggiGame.java new file mode 100644 index 0000000000..6cb1acdaad --- /dev/null +++ b/src/main/java/domain/game/JanggiGame.java @@ -0,0 +1,44 @@ +package domain.game; + +import domain.board.AbstractBoardFactory; +import domain.board.Board; +import domain.piece.Piece; +import domain.position.Position; +import java.util.HashMap; +import java.util.Map; + +public class JanggiGame { + private Turn turn; + private final Board board; + + public JanggiGame(Turn turn, Board board) { + this.turn = turn; + this.board = board; + } + + public static JanggiGame of(int choFormation, int hanFormation) { + Map pieces = new HashMap<>(); + pieces.putAll(AbstractBoardFactory.from(choFormation) + .createFormation(Team.CHO)); + pieces.putAll(AbstractBoardFactory.from(hanFormation) + .createFormation(Team.HAN)); + return new JanggiGame(Turn.first(),new Board(pieces)); + } + + public void move(Position src, Position dest) { + board.move(src, dest); + turn = turn.next(); + } + + public boolean isRunning() { + return true; // TODO: 종료 조건 구현 + } + + public Team currentTurn() { + return turn.current(); + } + + public Board getBoard() { + return board; + } +} diff --git a/src/main/java/domain/position/Column.java b/src/main/java/domain/position/Column.java index 624f11d1a6..0896db4233 100644 --- a/src/main/java/domain/position/Column.java +++ b/src/main/java/domain/position/Column.java @@ -13,7 +13,7 @@ public Column(int value) { } private void validate(int value) { - if (value <= MIN_COLUMNS_NUMBER || value > MAX_COLUMNS_NUMBER) { + if (value < MIN_COLUMNS_NUMBER || value > MAX_COLUMNS_NUMBER) { throw new IllegalArgumentException("열의 위치는 1-9 사이에 있어야 합니다."); } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 6d4b982fde..eedcf80d6c 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,7 @@ package view; import domain.game.Team; +import domain.position.Position; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -31,23 +32,25 @@ private int validRange(int number) { return number; } - public List askMovePiecePosition(Team team) { + public List askMovePiecePosition(Team team) { while (true) { System.out.println(team + "의 차례입니다. 움직일 기물의 위치와 이동할 위치를 행과 열 순서대로 입력하세요. ( 예: 2,5,4,3 )"); try { - List positions = Arrays.stream(scanner.nextLine().split(",")) + List inputs = Arrays.stream(scanner.nextLine().split(",")) .map(String::trim) .collect(Collectors.toList()); - validatePositionFormat(positions); - return positions; + validatePositionFormat(inputs); + Position src = Position.from(inputs.get(0), inputs.get(1)); + Position dest = Position.from(inputs.get(2), inputs.get(3)); + return List.of(src, dest); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } - private void validatePositionFormat(List positions) { - if (positions.size() != MOVE_INPUT_COUNT) { + private void validatePositionFormat(List inputs) { + if (inputs.size() != MOVE_INPUT_COUNT) { throw new IllegalArgumentException("예시와 똑같은 형식으로 입력해주세요. (예: 2,5,4,3)"); } } From 726d94c083df51b76d1555d699e40af878b2ef21 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Wed, 1 Apr 2026 20:36:26 +0900 Subject: [PATCH 46/55] =?UTF-8?q?refactor:=20Board=20null=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EA=B0=80=EB=8A=A5=EC=84=B1=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EC=B6=95=EC=95=BD=EC=96=B4=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/board/Board.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index a8a4f92c1e..bc7a4dc829 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -15,20 +15,20 @@ public Board(Map pieces) { this.pieces = new HashMap<>(pieces); } - public void move(Position src, Position dest) { - Piece piece = pieces.get(src); - validateCanMove(piece, src, dest); - List route = ((ActivePiece) piece).searchRoute(src, dest); + public void move(Position source, Position destination) { + Piece piece = pieceAt(source); + validateCanMove(piece, source, destination); + List route = ((ActivePiece) piece).searchRoute(source, destination); if (piece.isCannon()) { - validateCannonRoute(route, dest); + validateCannonRoute(route, destination); } else { validateIntermediateRoute(route); } - validateDestination(dest, piece); - applyMove(src, dest, piece); + validateDestination(destination, piece); + applyMove(source, destination, piece); } - private void validateCannonRoute(List route, Position dest) { + private void validateCannonRoute(List route, Position destination) { int count = 0; for (Position position : route) { if (pieceAt(position).isCannon()) { @@ -44,7 +44,7 @@ private void validateCannonRoute(List route, Position dest) { throw new IllegalArgumentException("포가 넘을 수 있는 기물의 개수는 하나입니다."); } - if (pieceAt(dest).isCannon()) { + if (pieceAt(destination).isCannon()) { throw new IllegalArgumentException("포는 포를 잡을 수 없습니다."); } } From 28ebeff0860740954dbce25979233c94e2953a84 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Wed, 1 Apr 2026 21:12:24 +0900 Subject: [PATCH 47/55] =?UTF-8?q?refactor:=20Board=EC=97=90=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EB=8B=A4=EC=9A=B4=EC=BA=90?= =?UTF-8?q?=EC=8A=A4=ED=8C=85=20=EC=A0=9C=EA=B1=B0,=20searchRoute()=20Piec?= =?UTF-8?q?e=EB=A1=9C=20=EC=8A=B9=EA=B2=A9,=20isCannon()=20=EB=94=94?= =?UTF-8?q?=ED=8F=B4=ED=8A=B8=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/board/Board.java | 6 +++--- src/main/java/domain/piece/ActivePiece.java | 2 -- src/main/java/domain/piece/Chariot.java | 5 +++++ src/main/java/domain/piece/Elephant.java | 5 +++++ src/main/java/domain/piece/EmptyPiece.java | 11 +++++++++++ src/main/java/domain/piece/General.java | 5 +++++ src/main/java/domain/piece/Guard.java | 5 +++++ src/main/java/domain/piece/Horse.java | 5 +++++ src/main/java/domain/piece/Piece.java | 7 ++++--- src/main/java/domain/piece/Soldier.java | 5 +++++ 10 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index bc7a4dc829..3cab461332 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -18,7 +18,7 @@ public Board(Map pieces) { public void move(Position source, Position destination) { Piece piece = pieceAt(source); validateCanMove(piece, source, destination); - List route = ((ActivePiece) piece).searchRoute(source, destination); + List route = piece.searchRoute(source, destination); if (piece.isCannon()) { validateCannonRoute(route, destination); } else { @@ -63,8 +63,8 @@ private void validateIntermediateRoute(List route) { } } - private void validateDestination(Position dest, Piece movingPiece) { - if (pieceAt(dest).isAlly(movingPiece)) { + private void validateDestination(Position destination, Piece movingPiece) { + if (pieceAt(destination).isAlly(movingPiece)) { throw new IllegalArgumentException("아군 기물이 있는 위치로 이동할 수 없습니다."); } } diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index 12cda0fdcc..4463069fa9 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -28,8 +28,6 @@ protected int forwardDirection() { return team.forwardRowDirection(); } - public abstract List searchRoute(Position source, Position target); - @Override public String display(PieceAppearance colorizer) { return colorizer.colorize(team, type); diff --git a/src/main/java/domain/piece/Chariot.java b/src/main/java/domain/piece/Chariot.java index 7b4592123d..b5ad99a909 100644 --- a/src/main/java/domain/piece/Chariot.java +++ b/src/main/java/domain/piece/Chariot.java @@ -24,4 +24,9 @@ public List searchRoute(Position source, Position target) { return source.makeColStraightRoute(target); } + + @Override + public boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index ca0d10d6dd..a2bdc93b41 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -43,4 +43,9 @@ public List searchRoute(Position source, Position target) { Position mid = source.addPosition(-1, 0); return List.of(mid, mid.middlePosition(target)); } + + @Override + public boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index eb1802a1ec..bb24249c9e 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -1,6 +1,7 @@ package domain.piece; import domain.position.Position; +import java.util.List; public class EmptyPiece implements Piece { @@ -19,6 +20,11 @@ public boolean canMove(Position source, Position target) { return false; } + @Override + public List searchRoute(Position source, Position target) { + return List.of(); + } + @Override public boolean isNotEmpty() { return false; @@ -34,6 +40,11 @@ public String display(PieceAppearance colorizer) { return colorizer.colorizeEmpty(); } + @Override + public boolean isCannon() { + return false; + } + @Override public String toString() { return PieceType.EMPTY.name(); diff --git a/src/main/java/domain/piece/General.java b/src/main/java/domain/piece/General.java index ce0e335cdc..5fdb2029e7 100644 --- a/src/main/java/domain/piece/General.java +++ b/src/main/java/domain/piece/General.java @@ -29,4 +29,9 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } + + @Override + public boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index 73fc3bc42c..bfde381e9e 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -29,4 +29,9 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } + + @Override + public boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index bb2a9a6812..42d4509dcf 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -42,4 +42,9 @@ public List searchRoute(Position source, Position target) { return List.of(source.addPosition(-1, 0)); } + + @Override + public boolean isCannon() { + return false; + } } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index a4dd63b273..542167a89f 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -1,17 +1,18 @@ package domain.piece; import domain.position.Position; +import java.util.List; public interface Piece { boolean canMove(Position source, Position target); + List searchRoute(Position source, Position target); + boolean isNotEmpty(); boolean isAlly(Piece other); String display(PieceAppearance colorizer); - default boolean isCannon() { - return false; - } + boolean isCannon(); } diff --git a/src/main/java/domain/piece/Soldier.java b/src/main/java/domain/piece/Soldier.java index b026fed23a..e168753cc2 100644 --- a/src/main/java/domain/piece/Soldier.java +++ b/src/main/java/domain/piece/Soldier.java @@ -36,4 +36,9 @@ private boolean isValidSideMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } + + @Override + public boolean isCannon() { + return false; + } } From 745799b5a9b8ca98365d0baafbabca3a01c8306f Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 15:51:22 +0900 Subject: [PATCH 48/55] =?UTF-8?q?refactor:=20AbstractBoardFactory=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=B1=85=EC=9E=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/FormationConverter.java | 18 ++++++++++++++++++ src/main/java/controller/JanggiController.java | 5 +++-- .../domain/board/AbstractBoardFactory.java | 18 +++++++++++------- src/main/java/domain/board/Board.java | 10 +++++----- src/main/java/domain/board/FormationType.java | 8 ++++++++ src/main/java/domain/game/JanggiGame.java | 3 ++- 6 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 src/main/java/controller/FormationConverter.java create mode 100644 src/main/java/domain/board/FormationType.java diff --git a/src/main/java/controller/FormationConverter.java b/src/main/java/controller/FormationConverter.java new file mode 100644 index 0000000000..0881e16428 --- /dev/null +++ b/src/main/java/controller/FormationConverter.java @@ -0,0 +1,18 @@ +package controller; + +import domain.board.FormationType; + +public final class FormationConverter { + + private FormationConverter() {} + + public static FormationType convert(int formationType) { + if (formationType == 1) return FormationType.LEFT_GIWMA; + if (formationType == 2) return FormationType.RIGHT_GIWMA; + if (formationType == 3) return FormationType.WONANGMA; + if (formationType == 4) return FormationType.YANGGWIMA; + + throw new IllegalArgumentException("올바르지 않은 상차림 번호입니다."); + }; + +} diff --git a/src/main/java/controller/JanggiController.java b/src/main/java/controller/JanggiController.java index e9c80c3d5a..a8f8765b92 100644 --- a/src/main/java/controller/JanggiController.java +++ b/src/main/java/controller/JanggiController.java @@ -1,5 +1,6 @@ package controller; +import domain.board.FormationType; import domain.game.JanggiGame; import domain.game.Team; import domain.position.Position; @@ -25,8 +26,8 @@ public void run() { } private JanggiGame createGame() { - int choFormation = inputView.initialFormation(Team.CHO); - int hanFormation = inputView.initialFormation(Team.HAN); + FormationType choFormation = FormationConverter.convert(inputView.initialFormation(Team.CHO)); + FormationType hanFormation = FormationConverter.convert(inputView.initialFormation(Team.HAN)); return JanggiGame.of(choFormation, hanFormation); } diff --git a/src/main/java/domain/board/AbstractBoardFactory.java b/src/main/java/domain/board/AbstractBoardFactory.java index f956f303c7..8a82b4b564 100644 --- a/src/main/java/domain/board/AbstractBoardFactory.java +++ b/src/main/java/domain/board/AbstractBoardFactory.java @@ -9,15 +9,19 @@ public abstract class AbstractBoardFactory implements BoardFactory { - private static final Map factories = Map.of( - 1, new LeftGwimaFactory(), - 2, new RightGwimaFactory(), - 3, new WonangmaFactory(), - 4, new YanggwimaFactory() + private static final Map factories = Map.of( + FormationType.LEFT_GIWMA, new LeftGwimaFactory(), + FormationType.RIGHT_GIWMA, new RightGwimaFactory(), + FormationType.WONANGMA, new WonangmaFactory(), + FormationType.YANGGWIMA, new YanggwimaFactory() ); - public static AbstractBoardFactory from(int input) { - return factories.get(input); + public static AbstractBoardFactory from(FormationType type) { + AbstractBoardFactory factory = factories.get(type); + if (factory == null) { + throw new IllegalStateException("해당 타입의 팩토리가 등록되지 않았습니다."); + } + return factory; } @Override diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 3cab461332..28255a386c 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -49,8 +49,8 @@ private void validateCannonRoute(List route, Position destination) { } } - private void validateCanMove(Piece piece, Position src, Position dest) { - if (!piece.canMove(src, dest)) { + private void validateCanMove(Piece piece, Position source, Position destination) { + if (!piece.canMove(source, destination)) { throw new IllegalArgumentException("이동할 수 없는 위치입니다."); } } @@ -69,9 +69,9 @@ private void validateDestination(Position destination, Piece movingPiece) { } } - private void applyMove(Position src, Position dest, Piece piece) { - pieces.put(dest, piece); - pieces.put(src, EmptyPiece.getInstance()); + private void applyMove(Position source, Position destination, Piece piece) { + pieces.put(destination, piece); + pieces.put(source, EmptyPiece.getInstance()); } public Piece pieceAt(Position position) { diff --git a/src/main/java/domain/board/FormationType.java b/src/main/java/domain/board/FormationType.java new file mode 100644 index 0000000000..2b1133c8e5 --- /dev/null +++ b/src/main/java/domain/board/FormationType.java @@ -0,0 +1,8 @@ +package domain.board; + +public enum FormationType { + LEFT_GIWMA, + RIGHT_GIWMA, + WONANGMA, + YANGGWIMA +} diff --git a/src/main/java/domain/game/JanggiGame.java b/src/main/java/domain/game/JanggiGame.java index 6cb1acdaad..130421e286 100644 --- a/src/main/java/domain/game/JanggiGame.java +++ b/src/main/java/domain/game/JanggiGame.java @@ -2,6 +2,7 @@ import domain.board.AbstractBoardFactory; import domain.board.Board; +import domain.board.FormationType; import domain.piece.Piece; import domain.position.Position; import java.util.HashMap; @@ -16,7 +17,7 @@ public JanggiGame(Turn turn, Board board) { this.board = board; } - public static JanggiGame of(int choFormation, int hanFormation) { + public static JanggiGame of(FormationType choFormation, FormationType hanFormation) { Map pieces = new HashMap<>(); pieces.putAll(AbstractBoardFactory.from(choFormation) .createFormation(Team.CHO)); From 8bcf4436a82154f8ed7d25054ccf18d64cba3682 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 15:53:11 +0900 Subject: [PATCH 49/55] =?UTF-8?q?refactor:=20ActivePiece=20isSameTeam=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EC=BA=90=EC=8A=A4=ED=8C=85=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/piece/ActivePiece.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index 4463069fa9..038280dffb 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -13,15 +13,9 @@ protected ActivePiece(Team team, PieceType type) { this.type = type; } - private boolean isSameTeam(ActivePiece other) { - return this.team == other.team; - } - + @Override public boolean isAlly(Piece other) { - if (!(other instanceof ActivePiece)) { - return false; - } - return isSameTeam((ActivePiece) other); + return other instanceof ActivePiece activePiece && this.team == activePiece.team; } protected int forwardDirection() { From 9c423a627028d6b216b9da8a2ec1217095bf5a3e Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 16:06:41 +0900 Subject: [PATCH 50/55] =?UTF-8?q?refactor:=20PositionTest=20=EA=B5=AC?= =?UTF-8?q?=EC=B2=B4=EC=A0=81=EC=9D=B8=20=EC=98=88=EC=99=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/position/PositionTest.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/test/java/domain/position/PositionTest.java b/src/test/java/domain/position/PositionTest.java index 9d07f1ac60..3a9848c272 100644 --- a/src/test/java/domain/position/PositionTest.java +++ b/src/test/java/domain/position/PositionTest.java @@ -24,31 +24,36 @@ class PositionTest { @Test void 행이_0이면_예외가_발생한다() { assertThatThrownBy(() -> new Position(0, 5)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("행의 위치는"); } @Test void 행이_11이면_예외가_발생한다() { assertThatThrownBy(() -> new Position(11, 5)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("행의 위치는"); } @Test void 열이_0이면_예외가_발생한다() { assertThatThrownBy(() -> new Position(5, 0)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("열의 위치는"); } @Test void 열이_11이면_예외가_발생한다() { assertThatThrownBy(() -> new Position(5, 11)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("열의 위치는"); } @Test void 행과_열이_모두_음수이면_예외가_발생한다() { assertThatThrownBy(() -> new Position(-1, -1)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("행의 위치는"); } @Test From b1455ff8e6e4a44eba568bb839a04afcacae9aae Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 16:17:08 +0900 Subject: [PATCH 51/55] =?UTF-8?q?refactor:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=95=EC=95=BD=EC=96=B4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/JanggiGame.java | 4 ++-- src/main/java/domain/position/Column.java | 4 ++-- src/main/java/domain/position/Position.java | 8 ++++---- src/main/java/view/InputView.java | 6 +++--- src/main/java/view/OutputView.java | 8 ++++---- src/test/java/domain/activePiece/CannonTest.java | 12 ++++++------ src/test/java/domain/activePiece/ChariotTest.java | 12 ++++++------ src/test/java/domain/activePiece/ElephantTest.java | 14 +++++++------- src/test/java/domain/activePiece/GeneralTest.java | 12 ++++++------ src/test/java/domain/activePiece/GuardTest.java | 12 ++++++------ src/test/java/domain/activePiece/HorseTest.java | 14 +++++++------- src/test/java/domain/activePiece/SoldierTest.java | 12 ++++++------ 12 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/main/java/domain/game/JanggiGame.java b/src/main/java/domain/game/JanggiGame.java index 130421e286..bb589051f0 100644 --- a/src/main/java/domain/game/JanggiGame.java +++ b/src/main/java/domain/game/JanggiGame.java @@ -26,8 +26,8 @@ public static JanggiGame of(FormationType choFormation, FormationType hanFormati return new JanggiGame(Turn.first(),new Board(pieces)); } - public void move(Position src, Position dest) { - board.move(src, dest); + public void move(Position source, Position destination) { + board.move(source, destination); turn = turn.next(); } diff --git a/src/main/java/domain/position/Column.java b/src/main/java/domain/position/Column.java index 0896db4233..1073e21625 100644 --- a/src/main/java/domain/position/Column.java +++ b/src/main/java/domain/position/Column.java @@ -18,8 +18,8 @@ private void validate(int value) { } } - public Column divide(Column col) { - return new Column((this.value + col.value) / 2); + public Column divide(Column column) { + return new Column((this.value + column.value) / 2); } public int min(Column other) { diff --git a/src/main/java/domain/position/Position.java b/src/main/java/domain/position/Position.java index 35fe85fac2..0f3c9a6d7c 100644 --- a/src/main/java/domain/position/Position.java +++ b/src/main/java/domain/position/Position.java @@ -45,8 +45,8 @@ public int columnDiff(Position other) { public List makeColStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.column.min(this.column); - int dest = other.column.max(this.column); - for (int i = start + 1; i < dest; i++) { + int end = other.column.max(this.column); + for (int i = start + 1; i < end; i++) { routes.add(new Position(other.row, new Column(i))); } return routes; @@ -55,8 +55,8 @@ public List makeColStraightRoute(Position other) { public List makeRowStraightRoute(Position other) { List routes = new ArrayList<>(); int start = other.row.min(this.row); - int dest = other.row.max(this.row); - for (int i = start + 1; i < dest; i++) { + int end = other.row.max(this.row); + for (int i = start + 1; i < end; i++) { routes.add(new Position(new Row(i), other.column)); } return routes; diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index eedcf80d6c..ead5829444 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -40,9 +40,9 @@ public List askMovePiecePosition(Team team) { .map(String::trim) .collect(Collectors.toList()); validatePositionFormat(inputs); - Position src = Position.from(inputs.get(0), inputs.get(1)); - Position dest = Position.from(inputs.get(2), inputs.get(3)); - return List.of(src, dest); + Position source = Position.from(inputs.get(0), inputs.get(1)); + Position destination = Position.from(inputs.get(2), inputs.get(3)); + return List.of(source, destination); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 93f4bd06fd..1a1892d8ff 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -31,15 +31,15 @@ public void printError(String message) { private void appendColumnHeader(StringBuilder sb) { sb.append(" \t"); - for (int col = 1; col <= MAX_COLUMN; col++) { - sb.append(col).append("\t"); + for (int column = 1; column <= MAX_COLUMN; column++) { + sb.append(column).append("\t"); } sb.append(System.lineSeparator()); } private void appendRow(StringBuilder sb, Board board, int row) { - for (int col = 1; col <= MAX_COLUMN; col++) { - Piece piece = board.pieceAt(new Position(row, col)); + for (int column = 1; column <= MAX_COLUMN; column++) { + Piece piece = board.pieceAt(new Position(row, column)); sb.append(piece.display(appearance)).append("\t"); } } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 2f1244f789..9a76333d50 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -32,26 +32,26 @@ class CannonTest { @Test void 직선_방향_경로를_출력_한다() { ActivePiece cannon = new Cannon(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(4), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(2), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(cannon.searchRoute(src, dest)).isEqualTo(routes); + assertThat(cannon.searchRoute(source, destination)).isEqualTo(routes); } @Test void 잘못된_직선_방향_경로를_출력_한다() { ActivePiece cannon = new Cannon(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(4), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(4)), new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); - assertThat(cannon.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(cannon.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index b836fe67c8..f3bcf49e31 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -32,25 +32,25 @@ class ChariotTest { @Test void 직선_방향_경로를_출력_한다() { ActivePiece chariot = new Chariot(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(4), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(2), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(chariot.searchRoute(src, dest)).isEqualTo(routes); + assertThat(chariot.searchRoute(source, destination)).isEqualTo(routes); } @Test void 잘못된_직선_방향_경로를_출력_한다() { ActivePiece chariot = new Chariot(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(4), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(4), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(4)), new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); - assertThat(chariot.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(chariot.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index 1e37d0d5f3..447b99048a 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -27,24 +27,24 @@ class ElephantTest { @Test void 상_정상_경로_출력() { ActivePiece elephant = new Elephant(Team.HAN); - Position src = new Position(3, 3); + Position source = new Position(3, 3); Position mid = new Position(4, 3); Position mid2 = new Position(5, 4); - Position dest = new Position(6, 5); + Position destination = new Position(6, 5); List routes = List.of(mid, mid2); - assertThat(elephant.searchRoute(src, dest)).isEqualTo(routes); + assertThat(elephant.searchRoute(source, destination)).isEqualTo(routes); } @Test void 상_비정상_경로_출력() { ActivePiece elephant = new Elephant(Team.HAN); - Position src = new Position(3, 3); + Position source = new Position(3, 3); Position mid = new Position(5, 6); Position mid2 = new Position(7, 7); - Position dest = new Position(8, 9); - List routes = List.of(mid, mid2, dest); + Position destination = new Position(8, 9); + List routes = List.of(mid, mid2, destination); - assertThat(elephant.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(elephant.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index 79a6363585..ae28a0dc1d 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -31,22 +31,22 @@ class GeneralTest { void 궁_정상_경로_출력_한다() { ActivePiece general = new General(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>(); - assertThat(general.searchRoute(src, dest)).isEqualTo(routes); + assertThat(general.searchRoute(source, destination)).isEqualTo(routes); } @Test void 궁_비정상_경로_출력_한다() { ActivePiece general = new General(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(3)))); - assertThat(general.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(general.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index af0e87ec35..7664638494 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -31,22 +31,22 @@ class GuardTest { void 사_정상_경로_출력_한다() { ActivePiece guard = new Guard(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>(); - assertThat(guard.searchRoute(src, dest)).isEqualTo(routes); + assertThat(guard.searchRoute(source, destination)).isEqualTo(routes); } @Test void 사_비정상_경로_출력_한다() { ActivePiece guard = new Guard(Team.HAN); - Position src = new Position(new Row(1), new Column(3)); - Position dest = new Position(new Row(2), new Column(3)); + Position source = new Position(new Row(1), new Column(3)); + Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(3)))); - assertThat(guard.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(guard.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index 67008ae26c..6565077ca1 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -28,22 +28,22 @@ class HorseTest { @Test void 마_정상_경로_출력() { ActivePiece horse = new Horse(Team.HAN); - Position src = new Position(3, 3); + Position source = new Position(3, 3); Position mid = new Position(4, 3); - Position dest = new Position(5, 4); + Position destination = new Position(5, 4); List routes = List.of(mid); - assertThat(horse.searchRoute(src, dest)).isEqualTo(routes); + assertThat(horse.searchRoute(source, destination)).isEqualTo(routes); } @Test void 마_비정상_경로_출력() { ActivePiece horse = new Horse(Team.HAN); - Position src = new Position(3, 3); + Position source = new Position(3, 3); Position mid = new Position(6, 3); - Position dest = new Position(7, 3); - List routes = new ArrayList<>(List.of(mid, dest)); + Position destination = new Position(7, 3); + List routes = new ArrayList<>(List.of(mid, destination)); - assertThat(horse.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(horse.searchRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 0a2fa2aeab..2b524bcbb8 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -79,23 +79,23 @@ class SoldierTest { void 병은_빈_경로_출력_한다() { ActivePiece soldier = new Soldier(Team.HAN); - Position src = new Position(new Row(5), new Column(5)); - Position dest = new Position(new Row(4), new Column(5)); + Position source = new Position(new Row(5), new Column(5)); + Position destination = new Position(new Row(4), new Column(5)); List routes = new ArrayList<>(); - assertThat(soldier.searchRoute(src, dest)).isEqualTo(routes); + assertThat(soldier.searchRoute(source, destination)).isEqualTo(routes); } @Test void 병_비정상_경로_출력_한다() { ActivePiece soldier = new Soldier(Team.HAN); - Position src = new Position(new Row(5), new Column(5)); - Position dest = new Position(new Row(4), new Column(5)); + Position source = new Position(new Row(5), new Column(5)); + Position destination = new Position(new Row(4), new Column(5)); List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(5)))); - assertThat(soldier.searchRoute(src, dest)).isNotEqualTo(routes); + assertThat(soldier.searchRoute(source, destination)).isNotEqualTo(routes); } } From e73c69264a712475b79cd9711091353a5b52854c Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 21:02:19 +0900 Subject: [PATCH 52/55] =?UTF-8?q?refactor:=20searchRoute=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=ED=8C=90=EB=B3=84=20=EC=B1=85=EC=9E=84=20=EA=B8=B0?= =?UTF-8?q?=EB=AC=BC=EC=97=90=20=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/board/Board.java | 47 +++------------------ src/main/java/domain/piece/ActivePiece.java | 21 +++++++++ src/main/java/domain/piece/Cannon.java | 25 +++++++++++ src/main/java/domain/piece/Chariot.java | 4 -- src/main/java/domain/piece/Elephant.java | 4 -- src/main/java/domain/piece/EmptyPiece.java | 4 ++ src/main/java/domain/piece/General.java | 5 --- src/main/java/domain/piece/Guard.java | 5 --- src/main/java/domain/piece/Horse.java | 4 -- src/main/java/domain/piece/Piece.java | 2 + src/main/java/domain/piece/Soldier.java | 5 --- 11 files changed, 57 insertions(+), 69 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 28255a386c..47763578ed 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -1,12 +1,12 @@ package domain.board; -import domain.piece.ActivePiece; import domain.piece.EmptyPiece; import domain.piece.Piece; import domain.position.Position; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class Board { private final Map pieces; @@ -19,56 +19,19 @@ public void move(Position source, Position destination) { Piece piece = pieceAt(source); validateCanMove(piece, source, destination); List route = piece.searchRoute(source, destination); - if (piece.isCannon()) { - validateCannonRoute(route, destination); - } else { - validateIntermediateRoute(route); - } - validateDestination(destination, piece); + List piecesOnRoute = route.stream() + .map(this::pieceAt) + .collect(Collectors.toList()); + piece.validateRoute(piecesOnRoute, pieceAt(destination)); applyMove(source, destination, piece); } - private void validateCannonRoute(List route, Position destination) { - int count = 0; - for (Position position : route) { - if (pieceAt(position).isCannon()) { - throw new IllegalArgumentException("포는 포를 넘지 못합니다."); - } - - if (pieceAt(position).isNotEmpty()) { - count++; - } - } - - if (count != 1) { - throw new IllegalArgumentException("포가 넘을 수 있는 기물의 개수는 하나입니다."); - } - - if (pieceAt(destination).isCannon()) { - throw new IllegalArgumentException("포는 포를 잡을 수 없습니다."); - } - } - private void validateCanMove(Piece piece, Position source, Position destination) { if (!piece.canMove(source, destination)) { throw new IllegalArgumentException("이동할 수 없는 위치입니다."); } } - private void validateIntermediateRoute(List route) { - for (Position position : route) { - if (pieceAt(position).isNotEmpty()) { - throw new IllegalArgumentException("이동 경로에 기물이 있습니다."); - } - } - } - - private void validateDestination(Position destination, Piece movingPiece) { - if (pieceAt(destination).isAlly(movingPiece)) { - throw new IllegalArgumentException("아군 기물이 있는 위치로 이동할 수 없습니다."); - } - } - private void applyMove(Position source, Position destination, Piece piece) { pieces.put(destination, piece); pieces.put(source, EmptyPiece.getInstance()); diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index 038280dffb..37c561a72f 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -18,6 +18,27 @@ public boolean isAlly(Piece other) { return other instanceof ActivePiece activePiece && this.team == activePiece.team; } + @Override + public void validateRoute(List piecesOnRoute, Piece destinationPiece) { + for (Piece piece : piecesOnRoute) { + if (piece.isNotEmpty()) { + throw new IllegalArgumentException("이동 경로에 기물이 있습니다."); + } + } + validateDestination(destinationPiece); + } + + private void validateDestination(Piece destinationPiece) { + if (destinationPiece.isAlly(this)) { + throw new IllegalArgumentException("아군 기물이 있는 위치로 이동할 수 없습니다."); + } + } + + @Override + public boolean isCannon() { + return false; + } + protected int forwardDirection() { return team.forwardRowDirection(); } diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 4bd7b124b6..18b2580f2f 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -24,6 +24,31 @@ public List searchRoute(Position source, Position target) { return source.makeColStraightRoute(target); } + @Override + public void validateRoute(List piecesOnRoute, Piece destinationPiece) { + int count = 0; + for (Piece piece : piecesOnRoute) { + if (piece.isCannon()) { + throw new IllegalArgumentException("포는 포를 넘지 못합니다."); + } + if (piece.isNotEmpty()) { + count++; + } + } + + if (count != 1) { + throw new IllegalArgumentException("포가 넘을 수 있는 기물의 개수는 하나입니다."); + } + + if (destinationPiece.isCannon()) { + throw new IllegalArgumentException("포는 포를 잡을 수 없습니다."); + } + if (destinationPiece.isAlly(this)) { + throw new IllegalArgumentException("아군 기물이 있는 위치로 이동할 수 없습니다."); + } + } + + @Override public boolean isCannon() { return true; } diff --git a/src/main/java/domain/piece/Chariot.java b/src/main/java/domain/piece/Chariot.java index b5ad99a909..9da1272e4d 100644 --- a/src/main/java/domain/piece/Chariot.java +++ b/src/main/java/domain/piece/Chariot.java @@ -25,8 +25,4 @@ public List searchRoute(Position source, Position target) { return source.makeColStraightRoute(target); } - @Override - public boolean isCannon() { - return false; - } } diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index a2bdc93b41..546ff686dc 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -44,8 +44,4 @@ public List searchRoute(Position source, Position target) { return List.of(mid, mid.middlePosition(target)); } - @Override - public boolean isCannon() { - return false; - } } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index bb24249c9e..3b30a94001 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -25,6 +25,10 @@ public List searchRoute(Position source, Position target) { return List.of(); } + @Override + public void validateRoute(List piecesOnRoute, Piece destinationPiece) { + } + @Override public boolean isNotEmpty() { return false; diff --git a/src/main/java/domain/piece/General.java b/src/main/java/domain/piece/General.java index 5fdb2029e7..ce0e335cdc 100644 --- a/src/main/java/domain/piece/General.java +++ b/src/main/java/domain/piece/General.java @@ -29,9 +29,4 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } - - @Override - public boolean isCannon() { - return false; - } } diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index bfde381e9e..73fc3bc42c 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -29,9 +29,4 @@ public boolean canMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } - - @Override - public boolean isCannon() { - return false; - } } diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index 42d4509dcf..774a6a3cd4 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -43,8 +43,4 @@ public List searchRoute(Position source, Position target) { return List.of(source.addPosition(-1, 0)); } - @Override - public boolean isCannon() { - return false; - } } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 542167a89f..858d006235 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -8,6 +8,8 @@ public interface Piece { List searchRoute(Position source, Position target); + void validateRoute(List piecesOnRoute, Piece destinationPiece); + boolean isNotEmpty(); boolean isAlly(Piece other); diff --git a/src/main/java/domain/piece/Soldier.java b/src/main/java/domain/piece/Soldier.java index e168753cc2..b026fed23a 100644 --- a/src/main/java/domain/piece/Soldier.java +++ b/src/main/java/domain/piece/Soldier.java @@ -36,9 +36,4 @@ private boolean isValidSideMove(Position source, Position target) { public List searchRoute(Position source, Position target) { return List.of(); } - - @Override - public boolean isCannon() { - return false; - } } From d151d75494b5bc9ac0c48472b2480b9a70cd9334 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 21:21:30 +0900 Subject: [PATCH 53/55] =?UTF-8?q?refactor:=20searchRoute=20->=20calculateR?= =?UTF-8?q?oute=EB=A1=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=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/board/Board.java | 2 +- src/main/java/domain/piece/Cannon.java | 2 +- src/main/java/domain/piece/Chariot.java | 2 +- src/main/java/domain/piece/Elephant.java | 2 +- src/main/java/domain/piece/EmptyPiece.java | 2 +- src/main/java/domain/piece/General.java | 2 +- src/main/java/domain/piece/Guard.java | 2 +- src/main/java/domain/piece/Horse.java | 2 +- src/main/java/domain/piece/Piece.java | 2 +- src/main/java/domain/piece/Soldier.java | 2 +- src/test/java/domain/activePiece/CannonTest.java | 4 ++-- src/test/java/domain/activePiece/ChariotTest.java | 4 ++-- src/test/java/domain/activePiece/ElephantTest.java | 4 ++-- src/test/java/domain/activePiece/GeneralTest.java | 4 ++-- src/test/java/domain/activePiece/GuardTest.java | 4 ++-- src/test/java/domain/activePiece/HorseTest.java | 4 ++-- src/test/java/domain/activePiece/SoldierTest.java | 4 ++-- 17 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/domain/board/Board.java b/src/main/java/domain/board/Board.java index 47763578ed..b8aae3e8a9 100644 --- a/src/main/java/domain/board/Board.java +++ b/src/main/java/domain/board/Board.java @@ -18,7 +18,7 @@ public Board(Map pieces) { public void move(Position source, Position destination) { Piece piece = pieceAt(source); validateCanMove(piece, source, destination); - List route = piece.searchRoute(source, destination); + List route = piece.calculateRoute(source, destination); List piecesOnRoute = route.stream() .map(this::pieceAt) .collect(Collectors.toList()); diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 18b2580f2f..2f8508bb75 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -16,7 +16,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { if (source.isSameCol(target)) { return source.makeRowStraightRoute(target); } diff --git a/src/main/java/domain/piece/Chariot.java b/src/main/java/domain/piece/Chariot.java index 9da1272e4d..8674404bc0 100644 --- a/src/main/java/domain/piece/Chariot.java +++ b/src/main/java/domain/piece/Chariot.java @@ -17,7 +17,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { if (source.isSameCol(target)) { return source.makeRowStraightRoute(target); } diff --git a/src/main/java/domain/piece/Elephant.java b/src/main/java/domain/piece/Elephant.java index 546ff686dc..21c17bc2e2 100644 --- a/src/main/java/domain/piece/Elephant.java +++ b/src/main/java/domain/piece/Elephant.java @@ -27,7 +27,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { if (source.columnDiff(target) == -3) { Position mid = source.addPosition(0, 1); return List.of(mid, mid.middlePosition(target)); diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index 3b30a94001..a4d3c793b4 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -21,7 +21,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { return List.of(); } diff --git a/src/main/java/domain/piece/General.java b/src/main/java/domain/piece/General.java index ce0e335cdc..48d44f15d9 100644 --- a/src/main/java/domain/piece/General.java +++ b/src/main/java/domain/piece/General.java @@ -26,7 +26,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { return List.of(); } } diff --git a/src/main/java/domain/piece/Guard.java b/src/main/java/domain/piece/Guard.java index 73fc3bc42c..b5b89ea615 100644 --- a/src/main/java/domain/piece/Guard.java +++ b/src/main/java/domain/piece/Guard.java @@ -26,7 +26,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { return List.of(); } } diff --git a/src/main/java/domain/piece/Horse.java b/src/main/java/domain/piece/Horse.java index 774a6a3cd4..70e337260c 100644 --- a/src/main/java/domain/piece/Horse.java +++ b/src/main/java/domain/piece/Horse.java @@ -27,7 +27,7 @@ public boolean canMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { if (source.columnDiff(target) == -2) { return List.of(source.addPosition(0, 1)); } diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 858d006235..1d8657a056 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -6,7 +6,7 @@ public interface Piece { boolean canMove(Position source, Position target); - List searchRoute(Position source, Position target); + List calculateRoute(Position source, Position target); void validateRoute(List piecesOnRoute, Piece destinationPiece); diff --git a/src/main/java/domain/piece/Soldier.java b/src/main/java/domain/piece/Soldier.java index b026fed23a..f69187e88e 100644 --- a/src/main/java/domain/piece/Soldier.java +++ b/src/main/java/domain/piece/Soldier.java @@ -33,7 +33,7 @@ private boolean isValidSideMove(Position source, Position target) { } @Override - public List searchRoute(Position source, Position target) { + public List calculateRoute(Position source, Position target) { return List.of(); } } diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 9a76333d50..06bb377243 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -38,7 +38,7 @@ class CannonTest { List.of(new Position(new Row(2), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(cannon.searchRoute(source, destination)).isEqualTo(routes); + assertThat(cannon.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -52,6 +52,6 @@ class CannonTest { new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); - assertThat(cannon.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(cannon.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index f3bcf49e31..c30505948a 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -38,7 +38,7 @@ class ChariotTest { List.of(new Position(new Row(2), new Column(3)), new Position(new Row(3), new Column(3)))); - assertThat(chariot.searchRoute(source, destination)).isEqualTo(routes); + assertThat(chariot.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -51,6 +51,6 @@ class ChariotTest { new Position(new Row(5), new Column(4)), new Position(new Row(7), new Column(4)))); - assertThat(chariot.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(chariot.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index 447b99048a..039e5cb3d1 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -33,7 +33,7 @@ class ElephantTest { Position destination = new Position(6, 5); List routes = List.of(mid, mid2); - assertThat(elephant.searchRoute(source, destination)).isEqualTo(routes); + assertThat(elephant.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -45,6 +45,6 @@ class ElephantTest { Position destination = new Position(8, 9); List routes = List.of(mid, mid2, destination); - assertThat(elephant.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(elephant.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index ae28a0dc1d..e3eaf73453 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -35,7 +35,7 @@ class GeneralTest { Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>(); - assertThat(general.searchRoute(source, destination)).isEqualTo(routes); + assertThat(general.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -47,6 +47,6 @@ class GeneralTest { List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(3)))); - assertThat(general.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(general.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 7664638494..0be2fce087 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -35,7 +35,7 @@ class GuardTest { Position destination = new Position(new Row(2), new Column(3)); List routes = new ArrayList<>(); - assertThat(guard.searchRoute(source, destination)).isEqualTo(routes); + assertThat(guard.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -47,6 +47,6 @@ class GuardTest { List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(3)))); - assertThat(guard.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(guard.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index 6565077ca1..e33c2ecaa7 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -33,7 +33,7 @@ class HorseTest { Position destination = new Position(5, 4); List routes = List.of(mid); - assertThat(horse.searchRoute(source, destination)).isEqualTo(routes); + assertThat(horse.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -44,6 +44,6 @@ class HorseTest { Position destination = new Position(7, 3); List routes = new ArrayList<>(List.of(mid, destination)); - assertThat(horse.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(horse.calculateRoute(source, destination)).isNotEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 2b524bcbb8..4e53dbbb54 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -83,7 +83,7 @@ class SoldierTest { Position destination = new Position(new Row(4), new Column(5)); List routes = new ArrayList<>(); - assertThat(soldier.searchRoute(source, destination)).isEqualTo(routes); + assertThat(soldier.calculateRoute(source, destination)).isEqualTo(routes); } @Test @@ -95,7 +95,7 @@ class SoldierTest { List routes = new ArrayList<>( List.of(new Position(new Row(3), new Column(5)))); - assertThat(soldier.searchRoute(source, destination)).isNotEqualTo(routes); + assertThat(soldier.calculateRoute(source, destination)).isNotEqualTo(routes); } } From 92b4ee99e057205962352664dd1a5173b4bba523 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 21:31:13 +0900 Subject: [PATCH 54/55] =?UTF-8?q?refactor:=20isCannon=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/piece/ActivePiece.java | 5 ----- src/main/java/domain/piece/Cannon.java | 8 ++------ src/main/java/domain/piece/EmptyPiece.java | 5 ----- src/main/java/domain/piece/Piece.java | 2 -- 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/main/java/domain/piece/ActivePiece.java b/src/main/java/domain/piece/ActivePiece.java index 37c561a72f..6e0cb0685d 100644 --- a/src/main/java/domain/piece/ActivePiece.java +++ b/src/main/java/domain/piece/ActivePiece.java @@ -34,11 +34,6 @@ private void validateDestination(Piece destinationPiece) { } } - @Override - public boolean isCannon() { - return false; - } - protected int forwardDirection() { return team.forwardRowDirection(); } diff --git a/src/main/java/domain/piece/Cannon.java b/src/main/java/domain/piece/Cannon.java index 2f8508bb75..9369eb014c 100644 --- a/src/main/java/domain/piece/Cannon.java +++ b/src/main/java/domain/piece/Cannon.java @@ -28,7 +28,7 @@ public List calculateRoute(Position source, Position target) { public void validateRoute(List piecesOnRoute, Piece destinationPiece) { int count = 0; for (Piece piece : piecesOnRoute) { - if (piece.isCannon()) { + if (piece instanceof Cannon) { throw new IllegalArgumentException("포는 포를 넘지 못합니다."); } if (piece.isNotEmpty()) { @@ -40,7 +40,7 @@ public void validateRoute(List piecesOnRoute, Piece destinationPiece) { throw new IllegalArgumentException("포가 넘을 수 있는 기물의 개수는 하나입니다."); } - if (destinationPiece.isCannon()) { + if (destinationPiece instanceof Cannon) { throw new IllegalArgumentException("포는 포를 잡을 수 없습니다."); } if (destinationPiece.isAlly(this)) { @@ -48,8 +48,4 @@ public void validateRoute(List piecesOnRoute, Piece destinationPiece) { } } - @Override - public boolean isCannon() { - return true; - } } diff --git a/src/main/java/domain/piece/EmptyPiece.java b/src/main/java/domain/piece/EmptyPiece.java index a4d3c793b4..13bd430774 100644 --- a/src/main/java/domain/piece/EmptyPiece.java +++ b/src/main/java/domain/piece/EmptyPiece.java @@ -44,11 +44,6 @@ public String display(PieceAppearance colorizer) { return colorizer.colorizeEmpty(); } - @Override - public boolean isCannon() { - return false; - } - @Override public String toString() { return PieceType.EMPTY.name(); diff --git a/src/main/java/domain/piece/Piece.java b/src/main/java/domain/piece/Piece.java index 1d8657a056..0ee81a9543 100644 --- a/src/main/java/domain/piece/Piece.java +++ b/src/main/java/domain/piece/Piece.java @@ -15,6 +15,4 @@ public interface Piece { boolean isAlly(Piece other); String display(PieceAppearance colorizer); - - boolean isCannon(); } From 24664945fda2ac1cafbc463c6b86b399dd4fe9d5 Mon Sep 17 00:00:00 2001 From: picetea44 Date: Thu, 2 Apr 2026 22:11:00 +0900 Subject: [PATCH 55/55] =?UTF-8?q?test:=20=EB=AC=B4=EC=9D=98=EB=AF=B8?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/activePiece/CannonTest.java | 15 +++++++-------- src/test/java/domain/activePiece/ChariotTest.java | 14 +++++++------- .../java/domain/activePiece/ElephantTest.java | 12 ++++++------ src/test/java/domain/activePiece/GeneralTest.java | 11 ----------- src/test/java/domain/activePiece/GuardTest.java | 11 ----------- src/test/java/domain/activePiece/HorseTest.java | 11 +++++------ src/test/java/domain/activePiece/SoldierTest.java | 12 ------------ 7 files changed, 25 insertions(+), 61 deletions(-) diff --git a/src/test/java/domain/activePiece/CannonTest.java b/src/test/java/domain/activePiece/CannonTest.java index 06bb377243..6d23af267c 100644 --- a/src/test/java/domain/activePiece/CannonTest.java +++ b/src/test/java/domain/activePiece/CannonTest.java @@ -30,7 +30,7 @@ class CannonTest { } @Test - void 직선_방향_경로를_출력_한다() { + void 같은_열의_행_방향_경로를_계산한다() { ActivePiece cannon = new Cannon(Team.HAN); Position source = new Position(new Row(1), new Column(3)); Position destination = new Position(new Row(4), new Column(3)); @@ -42,16 +42,15 @@ class CannonTest { } @Test - void 잘못된_직선_방향_경로를_출력_한다() { + void 같은_행의_열_방향_경로를_계산한다() { ActivePiece cannon = new Cannon(Team.HAN); Position source = new Position(new Row(1), new Column(3)); - Position destination = new Position(new Row(4), new Column(3)); - + Position destination = new Position(new Row(1), new Column(7)); List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(4)), - new Position(new Row(5), new Column(4)), - new Position(new Row(7), new Column(4)))); + List.of(new Position(new Row(1), new Column(4)), + new Position(new Row(1), new Column(5)), + new Position(new Row(1), new Column(6)))); - assertThat(cannon.calculateRoute(source, destination)).isNotEqualTo(routes); + assertThat(cannon.calculateRoute(source, destination)).isEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ChariotTest.java b/src/test/java/domain/activePiece/ChariotTest.java index c30505948a..7e55fd2c59 100644 --- a/src/test/java/domain/activePiece/ChariotTest.java +++ b/src/test/java/domain/activePiece/ChariotTest.java @@ -30,7 +30,7 @@ class ChariotTest { } @Test - void 직선_방향_경로를_출력_한다() { + void 같은_열의_행_방향_경로를_계산한다() { ActivePiece chariot = new Chariot(Team.HAN); Position source = new Position(new Row(1), new Column(3)); Position destination = new Position(new Row(4), new Column(3)); @@ -42,15 +42,15 @@ class ChariotTest { } @Test - void 잘못된_직선_방향_경로를_출력_한다() { + void 같은_행의_열_방향_경로를_계산한다() { ActivePiece chariot = new Chariot(Team.HAN); Position source = new Position(new Row(1), new Column(3)); - Position destination = new Position(new Row(4), new Column(3)); + Position destination = new Position(new Row(1), new Column(7)); List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(4)), - new Position(new Row(5), new Column(4)), - new Position(new Row(7), new Column(4)))); + List.of(new Position(new Row(1), new Column(4)), + new Position(new Row(1), new Column(5)), + new Position(new Row(1), new Column(6)))); - assertThat(chariot.calculateRoute(source, destination)).isNotEqualTo(routes); + assertThat(chariot.calculateRoute(source, destination)).isEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/ElephantTest.java b/src/test/java/domain/activePiece/ElephantTest.java index 039e5cb3d1..d45ccf4bc1 100644 --- a/src/test/java/domain/activePiece/ElephantTest.java +++ b/src/test/java/domain/activePiece/ElephantTest.java @@ -37,14 +37,14 @@ class ElephantTest { } @Test - void 상_비정상_경로_출력() { + void 상_열_방향_경로를_계산한다() { ActivePiece elephant = new Elephant(Team.HAN); Position source = new Position(3, 3); - Position mid = new Position(5, 6); - Position mid2 = new Position(7, 7); - Position destination = new Position(8, 9); - List routes = List.of(mid, mid2, destination); + Position mid = new Position(3, 4); + Position mid2 = new Position(4, 5); + Position destination = new Position(5, 6); + List routes = List.of(mid, mid2); - assertThat(elephant.calculateRoute(source, destination)).isNotEqualTo(routes); + assertThat(elephant.calculateRoute(source, destination)).isEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/GeneralTest.java b/src/test/java/domain/activePiece/GeneralTest.java index e3eaf73453..5849069d35 100644 --- a/src/test/java/domain/activePiece/GeneralTest.java +++ b/src/test/java/domain/activePiece/GeneralTest.java @@ -38,15 +38,4 @@ class GeneralTest { assertThat(general.calculateRoute(source, destination)).isEqualTo(routes); } - @Test - void 궁_비정상_경로_출력_한다() { - ActivePiece general = new General(Team.HAN); - - Position source = new Position(new Row(1), new Column(3)); - Position destination = new Position(new Row(2), new Column(3)); - List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(3)))); - - assertThat(general.calculateRoute(source, destination)).isNotEqualTo(routes); - } } diff --git a/src/test/java/domain/activePiece/GuardTest.java b/src/test/java/domain/activePiece/GuardTest.java index 0be2fce087..e0647015f5 100644 --- a/src/test/java/domain/activePiece/GuardTest.java +++ b/src/test/java/domain/activePiece/GuardTest.java @@ -38,15 +38,4 @@ class GuardTest { assertThat(guard.calculateRoute(source, destination)).isEqualTo(routes); } - @Test - void 사_비정상_경로_출력_한다() { - ActivePiece guard = new Guard(Team.HAN); - - Position source = new Position(new Row(1), new Column(3)); - Position destination = new Position(new Row(2), new Column(3)); - List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(3)))); - - assertThat(guard.calculateRoute(source, destination)).isNotEqualTo(routes); - } } diff --git a/src/test/java/domain/activePiece/HorseTest.java b/src/test/java/domain/activePiece/HorseTest.java index e33c2ecaa7..7be01f014a 100644 --- a/src/test/java/domain/activePiece/HorseTest.java +++ b/src/test/java/domain/activePiece/HorseTest.java @@ -7,7 +7,6 @@ import domain.piece.Horse; import domain.piece.Piece; import domain.position.Position; -import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; @@ -37,13 +36,13 @@ class HorseTest { } @Test - void 마_비정상_경로_출력() { + void 마_열_방향_경로를_계산한다() { ActivePiece horse = new Horse(Team.HAN); Position source = new Position(3, 3); - Position mid = new Position(6, 3); - Position destination = new Position(7, 3); - List routes = new ArrayList<>(List.of(mid, destination)); + Position mid = new Position(3, 4); + Position destination = new Position(4, 5); + List routes = List.of(mid); - assertThat(horse.calculateRoute(source, destination)).isNotEqualTo(routes); + assertThat(horse.calculateRoute(source, destination)).isEqualTo(routes); } } diff --git a/src/test/java/domain/activePiece/SoldierTest.java b/src/test/java/domain/activePiece/SoldierTest.java index 4e53dbbb54..4c3135eb88 100644 --- a/src/test/java/domain/activePiece/SoldierTest.java +++ b/src/test/java/domain/activePiece/SoldierTest.java @@ -86,16 +86,4 @@ class SoldierTest { assertThat(soldier.calculateRoute(source, destination)).isEqualTo(routes); } - @Test - void 병_비정상_경로_출력_한다() { - ActivePiece soldier = new Soldier(Team.HAN); - - Position source = new Position(new Row(5), new Column(5)); - Position destination = new Position(new Row(4), new Column(5)); - List routes = new ArrayList<>( - List.of(new Position(new Row(3), new Column(5)))); - - assertThat(soldier.calculateRoute(source, destination)).isNotEqualTo(routes); - } - }