[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฐ๋ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#257
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฐ๋ ๋ฏธ์
์ ์ถํฉ๋๋ค.#257frombunny wants to merge 58 commits intowoowacourse:frombunnyfrom
Conversation
- Piece ๊ตฌํ - PieceType ๊ตฌํ - Board ์์ฑ ๊ตฌํ
- ์ด๊ธฐ ํฌ์ง์ ๋ํ Enum ์ ์ - Enum์ ๋ฐ์์, ์ด๊ธฐํํ๋ ํฉํ ๋ฆฌ ์ถ๊ฐ - Board๋ ํฉํ ๋ฆฌ์์ ์์ฑ๋ ์ ์๋๋ก ๊ตฌ์กฐ ๋ณ๊ฒฝ
- ์์ ์ ์ขํ๋จ์ผ๋ก ์์ - ๋๋ฝ๋ ํฌ ์ด๊ธฐํ ๋ก์ง ์ถ๊ฐ
- KING -> GENERAL - ROOK -> CHARIOT - ADVISOR -> GUARD - PAWN -> SOLDIER
- ์ธํฐํ์ด์ค ๋ฉ์๋๋ก getPathPositions, canMove๋ฅผ ๊ฐ์ง - ๊ฐ๊ฐ์ ๊ธฐ๋ฌผ ๊ตฌํ ํด๋์ค ์ถ๊ฐ - BoardFactory ๋ณ๊ฒฝ - ํ ์คํธ ์ฝ๋ ๋ณ๊ฒฝ
- ๋ฐฉํฅ์ ๋ํ Direction ๊ตฌํ - ์กธ ์์ง์ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ - ์ฌ ์์ง์ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ - ๊ถ ์์ง์ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ - ํ ์คํธ ํจํค์ง ์์น ์์
- ๋ง์ ๋ํ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ
- ์์ ๋ํ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ - Horse ๊ณต๋ฐฑ ์ถ๊ฐ
- ์ฐจ์ ๋ํ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ
- ํฌ์ ๋ํ ์ด๋ ๊ฒฝ๋ก ๊ตฌํ
- ์ด๋ ์๋์ ํ์ ์์ ์์ฑ - ์กธ/๋ณ ์์ง์์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์์ฑ
- Path ํด๋์ค ์์ฑ - Board์ getPath() ์์ฑ
- Piece๋ฅผ ์ธํฐํ์ด์ค์์ record๋ก ๋ณ๊ฒฝ - Piece์์ MoveStrategy๋ฅผ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝ
- canMove์์ ์์ง์ผ ์ ์๋ ๊ฒฝ์ฐ ์์ธ ๋ฐ์ - ํฌ์ ๋ํ ํ ์คํธ ์ถ๊ฐ - ์ต์ข ๋ชฉ์ ์ง์ ๋ํด ๊ฐ์ ์ง์์ธ์ง ๋ค๋ฅธ ์ง์์ธ์ง๋ ๋ณด๋๊ฐ ํ๋จ
- ๋ง์ ๋ํ ๊ธฐ๋ฌผ์ ์์ง์ ์ ํจ์ฑ ํ์ธ - ์์ ๋ํ ๊ธฐ๋ฌผ์ ์์ง์ ์ ํจ์ฑ ํ์ธ - ํฌ ์๋ฌ ๋ฉ์์ง ์์ - ์์ง์ด๋ ๊ณณ์ด ๊ธฐ๋ฌผ์ด ์๋ ๊ฒฝ์ฐ์ ๋ํด ์๋ฌ ํ์ธ
- ๊ฐ๋จํ ํํ๋ก, ์์ง์๋ง ํ์ธํ ์ ์๋๋ก ๋ทฐ ๋ฐ ์ปจํธ๋กค๋ฌ ๊ตฌํ - ํ์ฌ ์ขํ, ์ด๋ ์ขํ๋ก ํ์ธ๋ง ํ ์ ์๋๋ก ํ์ธ
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฐ๋~ ๋ฆฌ๋ทฐ์ด ๋ฒ ๋ฃจ์ค์
๋๋ค.
์ด์ ์ ์ ์๊ฒ ๊ณต์ ์ฃผ์ ๋๋ก ํผ๋๋ฐฑ ๋ฐ์๊ณผ ํจ๊ป ๊ตฌ์กฐ ๋ง๊ป ๋ฐ๊พธ์
๋ ๋ฉ๋๋ค.
ํผ๋๋ฐฑ์ ํ
์คํธ ์ฝ๋ ์์ฃผ๋ก ๋จ๊ฒจ๋๋ ธ๋๋ฐ, ์ด๋ฏธ ํ
์คํธ ์ผ์ด์ค๊ฐ ๋ถ์กฑํ๋ค๋ ๊ฑธ ์๊ณ ๊ณ์
์ ์์ฑํ๊ธฐ ํธํ์๊ฒ ๋ถ์กฑํ ์ผ์ด์ค ๋จ๊ฒจ๋๋ ธ์ต๋๋ค. ๊ตฌ์กฐ๋ฅผ ๋ง๊ป ๋ฐ๊พธ์ค ๋ ์ถ์ฒ๋๋ฆฌ๋ ๋ฐฉํฅ์ ๋ถ์กฑํ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๊ณ ํ
์คํธ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌํฉํฐ๋ง์ ํตํด ์ํ๋ ๊ตฌ์กฐ๋ก ๊ฐ์ ํ๋๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
๋ค์ ๋ฆฌ๋ทฐ ์์ฒญ์๋ ํ๋ก๋์ ์ฝ๋ ์์ฃผ๋ก ํผ๋๋ฐฑ ๋จ๊ฒจ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ง๋ฌธ์ ๋ต๋ณ๋ ๊ทธ ๋ ๋จ๊ฒจ๋๋ฆด๊ฒ์~
| public void move(Position from, Position to) { | ||
| Piece fromPiece = pieces.get(from); | ||
| Piece toPiece = pieces.get(to); | ||
| List<Position> pathPositions = fromPiece.getPathPositions(from, to); | ||
| List<Path> path = getPath(pathPositions); | ||
| fromPiece.canMove(path, toPiece); | ||
|
|
||
| if (toPiece != null && fromPiece.isSameTeam(toPiece)) { | ||
| throw new IllegalStateException("๊ฐ์ ํ์ ๊ธฐ๋ฌผ์ ์ก์ ์ ์์ต๋๋ค."); | ||
| } | ||
|
|
||
| Piece remove = pieces.remove(from); | ||
| pieces.put(to, remove); | ||
| } |
There was a problem hiding this comment.
move์ ์ฐ๊ด๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
| public List<Path> getPath(List<Position> positions) { | ||
| List<Path> paths = new ArrayList<>(); | ||
| for (Position position : positions) { | ||
| if (pieces.containsKey(position)) { |
There was a problem hiding this comment.
pieces.containsKey(position)์ด false์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ ์๋๋ฐ, ๋๋์ด positions๋ ํญ์ peices์ ์ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ผ ๊ฒ ๊ฐ๋ค์. false์ธ ์ํฉ์ด ์ค์ ํ๋ก๋์
์์ ๋ฐ์ํ ์ ์์์ง ๊ฒํ ํด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| } | ||
|
|
||
| private void validateRange(int x, int y) { | ||
| if (x < MIN_RANGE || x > MAX_WIDTH_RANGE) { |
There was a problem hiding this comment.
x < MIN_RANGE ๊ฐ true์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค~
| throw new IllegalArgumentException("์ขํ ๊ฐ์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค."); | ||
| } | ||
|
|
||
| if (y < MIN_RANGE || y > MIN_HEIGHT_RANGE) { |
There was a problem hiding this comment.
y < MIN_RANGE๊ฐ true์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
| if (!((dx == 0 && dy != 0) || (dx != 0 && dy == 0))) { | ||
| throw new IllegalArgumentException("ํฌ๋ฅผ ํด๋น ์์น๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค."); | ||
| } |
There was a problem hiding this comment.
ํฌ๋ฅผ ์ด๋์ํฌ ์ ์๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
| @Override | ||
| public void canMove(List<Path> paths, Piece to) { | ||
| if (!paths.isEmpty()) { | ||
| throw new IllegalArgumentException("์ด๋ ๊ฒฝ๋ก์ ๊ธฐ๋ฌผ์ด ์กด์ฌํ๋ฉด ์ด๋ํ ์ ์์ต๋๋ค."); | ||
| } | ||
| } |
There was a problem hiding this comment.
์ฐจ์ canMove์ ์ฐ๊ด๋ ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
์ด์ธ์๋ ChoSoldier, Elephant, General, Guard, HanSoldier, Horse์ canMove์ ์ฐ๊ด๋ ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
| @Test | ||
| void ํฌ๋_๊ธฐ๋ฌผ์ด_์ฌ์ด์_ํ๋์_๊ธฐ๋ฌผ์ด_์์ผ๋ฉด_์ ์์ ์ผ๋ก_์์ง์ผ_์_์๋ค() { | ||
| List<Path> paths = List.of(new Path(new Position(3, 0), new Piece(PieceType.HORSE, Team.HAN, new HorseStrategy()))); | ||
|
|
||
| assertDoesNotThrow(() -> piece.canMove(paths, new Piece(PieceType.HORSE, Team.HAN, new HorseStrategy()))); | ||
| } |
There was a problem hiding this comment.
ํ
์คํธ ์ฝ๋๋ง ์ดํด๋ด์๋ ํฌ์ ์์์ ๊ณผ ๋์ ์ ์ดํดํ๊ธฐ ์ด๋ ต๋ค์ ใ
ใ
(3, 0)์ ๋ง์ด ์๋ค๋๊ฑด ์๊ฒ ์ง๋ง, canMove(paths, new Piece(HORSE))์์ ์์์ , ๋์ฐฉ์ ์ ์๊ธฐ ์ด๋ ต๊ณ ๊ฐ์๊ธฐ HORSE ๊ธฐ๋ฌผ์ ์ ๋ฐ์์ผํ๋์ง ํ์
์ด ์ด๋ ต๋ค์. ๊ตฌ์กฐ ๊ฐ์ ํ์ค ๋ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์์ง ๊ฐ์ด ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
|
|
||
|
|
||
| @Test | ||
| void ๋ง๋_์๋ก_๋์นธ_์ผ์ชฝ์ผ๋ก_์ธ์นธ_์์ง์ผ_์_์๋_๊ฒฝ๋ก๊ฐ_์๋ค() { |
There was a problem hiding this comment.
Elephant ํ ์คํธ์ธ๋ฐ ๋ค์ด๋ฐ์ ๋ง์ ์ฐ๊ด๋ ํ ์คํธ์ฒ๋ผ ์ง์ด์ก๋ค์. ํ ์คํธ ๋ช ์์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| } | ||
|
|
||
| @Test | ||
| void ์กธ์_์ฐ๋ก_ํ์นธ_์์ง์ผ_์_์๋_๊ฒฝ๋ก๊ฐ_์๋ค() { |
There was a problem hiding this comment.
์ฌ๊ธฐ๋ ์ฌ์ ์ฐ๊ด๋ ํ ์คํธ์ธ๋ฐ ์กธ๋ก ํํ๋์ด ์์ต๋๋ค~
|
|
||
| import static org.assertj.core.api.Assertions.assertThat; | ||
|
|
||
| class SoldierChoTest { |
There was a problem hiding this comment.
์ด, ํ์ ๋ณ์ฌ ๋ชจ๋ ํ์ง์ด ๋ถ๊ฐ๋ฅํ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค์~
|
์๋
ํ์ธ์, ๋ฒ ๋ฃจ์ค! ๋ฆฌ๋ทฐ ์์ฒญ์ด ๋ฆ์ด์ง ์ ์ฃ์กํฉ๋๋ค..๐ฅฒ ์ง๊ธ ๋์๋ณด๋ฉด ๋ ๋ฆ๊ฒ ๋ธ๋ค๊ณ ํด์ ์ฝ๋๊ฐ ํฌ๊ฒ ์ข์์ง์ง๋ ์์์ ๊ฒ ๊ฐ์๋ฐ, ํ์ ์ด์์ผ๋ก ์ค๋ ๋ถ์ก๊ณ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ
์คํธ์ฝ๋ ๊ด๋ จํด์ ํผ๋๋ฐฑ์ ์ฃผ์ ๋ถ๋ถ๋ค์ ๋ณด๋ฉด์, ์กฐ๊ธ ๋ ํ
์คํธ์ฝ๋๋ฅผ ๊ผผ๊ผผํ ์ง๋๋ก ๋
ธ๋ ฅํด๋ณด์์ต๋๋ค! ์ ๋ต ์ค๊ณ์ ๋ํ ๊ณ ๋ฏผ๋๋ฆ ์์๋ณด๋ค๋ ์กฐํฉ์ ํ์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ํ์ด๋ณด๋ ค๊ณ ํ์ต๋๋ค. ๋, ์ ์ฌํ์ง๋ง ์กฐ๊ธ์ฉ ๋ค๋ฅธ ๋ก์ง๋ค์ ์ด๋ป๊ฒ ๊ตฌ์กฐ์ ์ผ๋ก ํ์ด๋ด์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋ง์์ต๋๋ค. ๊ณตํต์ ์ธ ๋ถ๋ถ๋ค์ ๋ชจ์ ์ ์กฐ๋ฆฝํด๋ณด๊ณ ์ถ์๋๋ฐ, ๊ดํ ๊ตฌ์กฐ์ ๋ณต์ก๋๋ง ๋์ด๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ๋ ๋ค์์ต๋๋ค. ์ถ์ ํด๋์ค, ์ถ์ ํด๋์ค์ ์ ๋ต ํจํด์ ์กฐํฉ, ํ์ฌ ๊ตฌ์กฐ ์ ์ง ๋ฑ ์ฌ๋ฌ ๋ฐฉ์์ ์๋ํด๋ดค์ง๋ง, ๊ฒฐ๊ตญ ๋ฐฉํฅ์ ๋ช ํํ ์ก์ง ๋ชปํ ์ฑ ๊ณ์ ๋งด๋๊ธฐ๋ง ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ ๋์ ์กฐํฉ์ ์ ํํ๋ ค๊ณ ํ์ง๋ง, ๊ทธ ์ ํ์ ์ค์ ์ฝ๋ ๊ตฌ์กฐ๋ก ์์ฐ์ค๋ฝ๊ฒ ํ์ด๋ด๋ ๋ฐ์๋ ์์ง ๋ถ์กฑํจ์ด ์์๋ค๊ณ ๋๊ผ์ต๋๋ค. ๋ ๋ฒจ 1์ด ๋๋๊ฐ๋ ์์ ์ธ๋ฐ๋ ์ค์ค๋ก์ ์ค๊ณ ๊ธฐ์ค์ ๋ช ํํ ์ธ์ฐ์ง ๋ชปํ ๊ฒ ๊ฐ์ ์์ฌ์๊ณผ ๋ต๋ตํจ์ด ๋จ์ต๋๋ค. Offset ๋์ ์ ๋ํ ๊ณ ๋ฏผ์ฌ์ดํด 1์์ Offset์ด๋ผ๋ ๊ฐ๋ ์ ๋์ ํ ์ง์ ๋ํด ํ์ด์ ๊น์ด ์๋ ๋ ผ์๋ฅผ ํ์ต๋๋ค. ์ ๋ ์๋์ ๊ฐ์ ์ดใ ๋ก ํ์ฌ ๋จ๊ณ์์๋ Offset์ ๋์ ํ์ง ์๋ ๊ฒ์ด ๋ ์ ํฉํ๋ค๊ณ ํ๋จํ์ต๋๋ค. 1. ๋ถํ์ํ ๋ณํ๊ณผ ์ขํ ํํ์ ์ผ๊ด์ฑ ํนํ ๊ฒฝ๋ก ๊ฒ์ฆ ๊ณผ์ ์์ ๊ฒฐ๊ตญ ๋ณด๋ ์์ ๊ธฐ๋ฌผ์ ํ์ธํ๋ ค๋ฉด ๋ค์ Position์ผ๋ก ๋์์์ผ ํ๋ฏ๋ก, ํ๋์ ์ด๋ ํ๋ฆ ์์์ ์ขํ ํํ์ด ํผ์ฉ๋ฉ๋๋ค. ์ด๋ก ์ธํด ๋ชจ๋ธ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๊ณ , ๋๋ฉ์ธ์ ์ดํดํ๋ ๋ฐ ์คํ๋ ค ๋ถ๋ด์ด ๋๋ค๊ณ ๋๊ผ์ต๋๋ค. 2. ์ฅ๊ธฐ ๊ถ์ฑ ๋ก์ง์ ํน์์ฑ Offset๋ง์ผ๋ก๋ โ์ด ์ด๋์ด ๊ถ์ฑ ๋ด๋ถ์์ ๋ฐ์ํ ๊ฒ์ธ์งโ๋ฅผ ํ๋จํ๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด ๊ณผ์ ์์ ์๋์ ๊ฑฐ๋ฆฌ ๊ฐ๋ ์ ์ถ๊ฐ๋ก ๋์ ํ๋ ๊ฒ์ ์คํ๋ ค ๊ท์น์ ์ค๋ช ํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋ ์ ์๋ค๊ณ ๋๊ผ์ต๋๋ค. 3. ์ค๊ณ์ ๋ณต์ก์ฑ ๋๋น ํจ์ฉ ํฅํ ๋ฒกํฐ ์ฐ์ฐ์ด ๋งค์ฐ ๋ณต์กํด์ง๋ ์ํฉ์ด ์๋๋ผ๋ฉด, Offset์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๋ ์ ๋ฆฌํ๋ค๊ณ ํ๋จํ์ต๋๋ค. Offset์ ์ขํ ๊ฐ ์ฐจ์ด๋ฅผ ํํํ๋ ๋ฐ์๋ ์ ํฉํ์ง๋ง, ์ฅ๊ธฐ ๋๋ฉ์ธ์ ํต์ฌ ๊ฐ๋
์ธ โ๊ฒฝ๋กโ, โ๊ถ์ฑโ, โ์์น ์ ์ฝโ์ ์ง์ ์ ์ผ๋ก ๋๋ฌ๋ด๊ธฐ์๋ ๋ค์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ค๊ณ ๋๊ผ์ต๋๋ค. ๋ค์ํ ์ค๊ณ ์ ํ์ง ์์์ ๊ธฐ์ค์ ์ก๋ ๊ฒ์ ๋ํ ๊ณ ๋ฏผํฌ๋ฃจ๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ค ๋ณด๋ฉด ๋ค์ํ ์ค๊ณ ์์ด๋์ด๊ฐ ๋์ค๊ณ , ๋ฌธ์ ๋ ์ด ๊ณผ์ ์์ ์ฅ๋จ์ ์ ๊ณ์ ๋ฐ์ ธ๋ณด๋ค ๋ณด๋, ์คํ๋ ค ์ค์ค๋ก์ ํ๋จ ๊ธฐ์ค์ด ํ๋ ค์ง๊ณ ๊ฒฐ์ ์ด ๋ฆ์ด์ง๋ ๊ฒฝํ์ ํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๋ฏธ์
์์๋ ์ ๋ํ ์์ผ๋ก ๋์๊ฐ์ง ๋ชปํ๊ณ , ์ ์ฒด๋ ๋๋์ ๋ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ฒ ๋ฃจ์ค๋ ๋ณดํต ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ฌ๊ณ ๋ฅผ ์ ๋ฆฌํ๊ณ ๋ค์ ์ ํ์ ๋ด๋ฆฌ์๋์ง ๊ถ๊ธํฉ๋๋ค..! |
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฐ๋~
ํผ๋๋ฐฑ ๋ฐ์๊ณผ ํจ๊ป ๊ตฌ์กฐ ๋ณ๊ฒฝํ์๋๋ผ ๊ณ ์ํ์
จ์ต๋๋ค. ์กฐ๊ธ ์์ฌ์ด ์ ์ ๊ตฌ์กฐ๋ ๋ง์ด ๊ฐ์ ํ์
จ์ง๋ง ํ
์คํธ ์ฝ๋๋ ์ฌ์ ํ ๋ง์ด ๋ถ์กฑํ์ต๋๋ค ใ
ใ
์ปค๋ฐ ๋ด์ญ์ ๋ณด๋ ๊ตฌ์กฐ ๊ฐ์ ํ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ์
จ๋๋ฐ, ๋ง์ฝ์ ์์ฌ์ด ๊ตฌ์กฐ๋๋ก ํ
์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๋ฆฌํฉํฐ๋ง์ ์งํํ๋ค๋ฉด ์ด๋ ์์ง ์์ํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์.
๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ด ์กฐ๊ธ ๊ธธ์ด์ ์ฌ๋์ ๋ฐ๋ก ๋ด์ผ ๋ต๋ณ๋๋ฆฌ๊ฒ ์ต๋๋ค.
|
|
||
| import java.util.List; | ||
|
|
||
| public class CannonMoveStrategy implements MoveStrategy { |
There was a problem hiding this comment.
๋ฆฌํฉํฐ๋งํ๋ฉด์ ํ ์คํธ ์ฝ๋๊ฐ ์์ด์ง ๊ฒ ๊ฐ๋ค์ ใ ใ
There was a problem hiding this comment.
ํ์ผ์ด ์กด์ฌํด์ ํ์ธํด๋ดค๋๋, CannonMoveStrategy์์ ์๋ชป๋ ๊ธฐ๋ฌผ์ ํ ์คํธ๋ฅผ ํ๊ณ ์์ด์ ๊ทธ๋ฌ๋ ๊ฑฐ์๊ตฐ์...ใ ใ ๋ฏธ๋ฆฌ ๊ผผ๊ผผํ ํ์ธํ์ด์ผ ํ๋๋ฐ ์ ๋ง ์ฃ์กํฉ๋๋ค...๐ญ
|
|
||
| departurePiece.validateBlockingPiece(path, destination); | ||
|
|
||
| if (isExistPieceAt(destination)) { |
There was a problem hiding this comment.
false์ธ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋๊ฑธ๋ณด๋ ๋น ๊ณต๊ฐ์ผ๋ก ๊ธฐ๋ฌผ์ด ์ด๋ํ๋ ๊ฒฝ์ฐ์ ๋ํ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค~
| if ((Math.abs(deltaX) == 3)) { | ||
| return Direction.decideDirection(deltaX, 0); | ||
| } |
There was a problem hiding this comment.
์กฐ๊ฑด๋ฌธ ์์ ๋ค์ด์ค๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
| if (hasBlockingPiece) { | ||
| throw new IllegalArgumentException("์ด๋ ๊ฒฝ๋ก์ ์๋ ๋ค๋ฅธ ๊ธฐ๋ฌผ์ ๋ฐ์ด๋์ ์ ์์ต๋๋ค."); | ||
| } |
There was a problem hiding this comment.
hasBlockingPiece๊ฐ false์ธ ์ผ์ด์ค๊ฐ ์๋ค์. ์ ์์ ์ธ ์ผ์ด์ค์ ๋ํ ํ ์คํธ๊ฐ ์๋ ๊ฒ ๊ฐ์์.
| int absoluteX = Math.abs(deltaX); | ||
| int absoluteY = Math.abs(deltaY); | ||
|
|
||
| return (absoluteX == 2 && absoluteY == 3) || (absoluteX == 3 && absoluteY == 2); |
There was a problem hiding this comment.
๋ค์ํ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ์ผ์ด์ค์ ๋ํด ํ ์คํธํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
|
|
||
| class CannonMoveStrategyTest { | ||
| private final MoveStrategy chariotMoveStrategy = new ChariotMoveStrategy(); |
There was a problem hiding this comment.
์๋ชป๋ MoveStrategy๋ฅผ ํ ์คํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
์ด ๋ถ๋ถ ๊ผผ๊ผผํ ํ์ธํ์ด์ผ ํ๋๋ฐ ์ ๋ง์ ๋ง ์ฃ์กํฉ๋๋ค ใ
ใ
..
ํฌ ํ
์คํธ๊ฐ ํต๊ณผํ์ง ์๋ ๋ถ๋ถ์ด ์์๋๋ฐ, ์ด๋ก ์ธํด ๋ฐ๊ฒฌํ์ง ๋ชปํ๋๋ผ๊ตฌ์๐ฅฒ
์ด๋ฒ์ ๊ณ๊ธฐ๋ก ์์ผ๋ก ํ
์คํธ์ฝ๋๋ ์ ๊ฒฝ์จ์ ๊ผผ๊ผผํ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค..
| @Override | ||
| public void validateBlockingPiece(List<PathInfo> pathInfos, Position destination) { | ||
| if (pathInfos.stream().anyMatch(pathInfo -> pathInfo.isPieceType(PieceType.CANNON))) { | ||
| throw new IllegalArgumentException("ํฌ๋ ํฌ๋ฅผ ๋๊ฑฐ๋ ์ก์ ์ ์์ต๋๋ค."); | ||
| } | ||
| } |
There was a problem hiding this comment.
ํฌ์ ์กฐ๊ฑด ์ค์ ๋์ ์ ์๋ ๊ธฐ๋ฌผ ๊ฐฏ์์ ํ์ด ๋น ์ง ๊ฒ ๊ฐ์ต๋๋ค. ํ์ธ๋ถํ๋๋ ค์~
There was a problem hiding this comment.
ํฌ๊ฐ ํฌ๋ฅผ ๋๊ฑฐ๋ ์ก๋ ์ ์ฝ์๋ง ์ง์คํ์ฌ ํฌ๊ฐ ๋์ ์ ์๋ ๊ธฐ๋ฌผ ๊ฐฏ์ ์ ์ฝ์ ๋์ณค์ต๋๋ค๐ญ
์ด ๋ถ๋ถ๋ ์ ๊ฐ ๊ผผ๊ผผํ ํ์ธํ์ง ๋ชปํ์ต๋๋ค ์ฃ์กํฉ๋๋ค ใ
ใ
|
|
||
| public class ElephantMoveStrategy implements MoveStrategy { | ||
| @Override | ||
| public List<Position> getPath(Position departure, Position destination) { |
There was a problem hiding this comment.
๋ฉ์๋๊ฐ ๋๋ฌด ๊ธด ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ ํ ๋ฉ์๋๋ฅผ ์ถ์ถํด ์ถ์ํ ์์ค์ ๋์ฌ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| } | ||
|
|
||
| @Override | ||
| public List<Position> getPath(Position departure, Position destination) { |
There was a problem hiding this comment.
์ ๋ฐ์ ์ผ๋ก MoveStrategy์ ํ์ ํด๋์ค๋ค์ getPath ๊ตฌํ ๋ก์ง์ด ๊ธฐ๋ค์. ๋ฉ์๋ ์ถ์ถ๋ก ์ถ์ํ ์์ค์ ๋์ฌ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class PathGenerator { |
There was a problem hiding this comment.
PathGenerator๋ก Path๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผํ๋์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ฌ ๊ตฌ์กฐ์์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ฑ ์์ ๋งก๊ธธ ์ ์์ ๊ฒ ๊ฐ์์~
์๋ ํ์ธ์, ๋ฒ ๋ฃจ์ค! ๋ง๋๋ต๊ฒ ๋์ด ๋ฐ๊ฐ์ต๋๋ค.
์ ๋ ์ด๋ฒ ์ฅ๊ธฐ ๋ฏธ์ ๋ฆฌ๋ทฐ๋ฅผ ์์ฒญ๋๋ฆฌ๊ฒ ๋ ๋ฐ๋์ ๋๋ค๐ฐ
์ฌ์ ์ DM์ ํตํด ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ง์์ง ๊ฒ์ผ๋ก ์์ํ๊ณ ์์ต๋๋ค.
๊ทธ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธด ํ, ์ฝ๋ ๋ฐ ์ค๊ณ์ ๋ํ ์ง๋ฌธ๋ ๋ ์ถ๊ฐ๋ ์์ ์ ๋๋คใ ใ
์ถ๊ฐ์ ์ผ๋ก, ํ์ฌ ํ ์คํธ์ฝ๋๊ฐ ๋ฏธํกํฉ๋๋ค. ์์ธ ์ผ์ด์ค๋ ๋๋ถ๋ถ ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ์ง ๋ชปํ์ต๋๋ค๐ฅฒ
์ด ๋ถ๋ถ์ ํผ๋๋ฐฑ ๋ฐ์๊ณผ ํจ๊ป ํ ์คํธ์ฝ๋๋ฅผ ๋ณด๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๊ฐ ๋ด์ด ๋ฆฌ๋ทฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค๐โโ๏ธ
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
1. Board์ Piece์ ์ฑ ์์ ์ด๋ป๊ฒ ๋๋์ด์ผ ํ๋์ง๊ฐ ๊ฐ์ฅ ํฐ ๊ณ ๋ฏผ์ด์์ต๋๋ค.
ํ์ฌ ๊ตฌํ์์๋ ๊ธฐ๋ฌผ ์ด๋์ ๊ฒ์ฆํ ๋ Board์ Piece๊ฐ ํ ๋ฒ ๋ ์๋ณตํ๋ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ฉด์ ์ ๋
์ด๋ ๊ฒ ๋ ๋ฒ ์๋ค ๊ฐ๋ค ํ ์ ๋ฐ์ ์์๊น?๋ผ๋ ์๊ฐ์ ๊ณ์ ํ์ต๋๋ค.๋ ๋จ์ํ๊ฒ ๋ง๋ค๋ ค๋ฉด Piece๊ฐ ๋ณด๋์ ์ํ๋ฅผ ๋ ๋ง์ด ์๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ Piece๊ฐ Board์ ์ ์ฒด ์ํ๋
Map<Position, Piece>๊ฐ์ ์ ๋ณด๋ฅผ ์ง์ ์๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค๊ณ ๋๊ผ์ต๋๋ค.๊ธฐ๋ฌผ์
์ค์ค๋ก ์ด๋ป๊ฒ ์์ง์ด๋๊ฐ์ ์ง์คํ๊ณ , ๋ณด๋๋ํ์ฌ ์ด๋ค ๊ธฐ๋ฌผ์ด ์ด๋์ ๋์ฌ ์๋๊ฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ชฝ์ด ๋ ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํ์ต๋๋ค.๊ทธ๋์ ๋ค์ ์๋ณต์ด ์๊ธฐ๋๋ผ๋, ๊ฐ ๊ฐ์ฒด๊ฐ ์์์ผ ํ ์ ๋ณด์ ๋ฒ์๋ฅผ ๋ฌด๋ฆฌํ๊ฒ ๋ํ์ง ์๋ ๋ฐฉํฅ์ ์ฐ์ ํ์ต๋๋ค.
์์ ํ ํ์ ์ด ์์ด์ ์ ํํ ๊ตฌ์กฐ๋ผ๊ธฐ๋ณด๋ค๋, ์ ๊ฐ ํ์ฌ ๊ธฐ์ค์์ ๊ฐ์ฅ ๋ ์ด์ํ๋ค๊ณ ๋๋ ์ ํ์ ๊ฐ๊น์ต๋๋ค.
์ด ๋ถ๋ถ์์๋ ์ ๊ฐ ๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ์ ์ค์ด๊ธฐ ์ํด ๋ด๋ฆฐ ํ๋จ์ด ์ค์ ๋ก๋ ํ๋นํ์ง, ํน์ ์คํ๋ ค ์ฑ ์์ด ์ ๋งคํ๊ฒ ์์ธ ๊ตฌ์กฐ๊ฐ ๋์๋์ง๋ฅผ ์ค์ฌ์ผ๋ก ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
2. ์ด๋ ๊ฒ์ฆ ํ๋ฆ์ Board๊ฐ ์กฐ์ ํ๋ ํ์ฌ ๊ตฌ์กฐ๊ฐ ์์ฐ์ค๋ฌ์ด์ง ๊ถ๊ธํฉ๋๋ค.
์ง๊ธ Board๋ ๋จ์ํ ๊ธฐ๋ฌผ ๋ฐฐ์น๋ง ๊ด๋ฆฌํ๋ ์ญํ ์ ๋์ด์,
์ค์ ๋ก ์ด๋ ๊ณผ์ ์ ์ฒด๋ฅผ ์กฐ์ ํ๋ ์ญํ ๋ ํจ๊ป ๊ฐ์ง๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด move() ์์์
์ ๋ ์ด ๊ณผ์ ์ด ์ฅ๊ธฐํ์ด
ํ์ฌ ํ์ ์ํ๋ฅผ ๋ฐํ์ผ๋ก ์ด๋์ ์ค์ฌํ๋ค๋ ์ ์์ ์ด๋ ์ ๋ ์์ฐ์ค๋ฝ๋ค๊ณ ๋๊ผ์ต๋๋ค.๋ค๋ง ํํธ์ผ๋ก๋ Board๊ฐ ์ ์ ๋ง์ ํ๋ฆ์ ์ฅ๊ฒ ๋๋ฉด์ ๋น๋ํด์ง ์๋ ์๊ฒ ๋ค๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
๊ทธ๋์ ํ์ฌ์ฒ๋ผ Board๊ฐ ์ด๋ ๊ฒ์ฆ์ ํ๋ฆ์ ์กฐ์ ํ๋ ๊ตฌ์กฐ๊ฐ ๊ด์ฐฎ์์ง,
์๋๋ฉด ์ง๊ธ๋ณด๋ค ๋ ์ญํ ์ ๋ถ๋ฆฌํ๋ ๋ฐฉํฅ์ด ๋์์ง ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
3. ์ค๊ณ ๊ณผ์ ์์ ๋์์ธ ํจํด์ ์ด๋ป๊ฒ ๋ฐ๋ผ๋ด์ผ ํ๋์ง๊ฐ ์ฌ์ ํ ์ด๋ ต์ต๋๋ค.
์ด๋ฒ ๋ฏธ์ ์ ํ๋ฉด์ ๊ตฌํ ์์ฒด๋ณด๋ค๋,
์ด ์ํฉ์์ ์ด๋ค ํจํด์ ๋ ์ฌ๋ ค์ผ ํ๋๊ฐ๊ฐ ๋ ์ด๋ ต๊ฒ ๋๊ปด์ก์ต๋๋ค.์ฌ์ค ๋ธ๋์ญ ๋ฏธ์ ์์๋ ์ํ ํจํด์ ์ค์ค๋ก ๋ ์ฌ๋ฆฌ์ง ๋ชปํ๋๋ฐ, ์ด๋ฒ์๋ ๋น์ทํ ๊ณ ๋ฏผ์ ๋ง์ด ํ์ต๋๋ค.
๊ตฌํํ๋ฉด์ Board๊ฐ ์ด๋ ํ๋ฆ์ ์กฐ์ ํ๊ณ , ๊ธฐ๋ฌผ๋ณ ์ด๋ ๊ท์น์ ๊ฐ ์ ๋ต ๋๋ ๊ธฐ๋ฌผ ์ชฝ์ ๋๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ค ๋ณด๋
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํน์ ํจํด์ ํํ์ ๋ฎ์ ๋ณด์ธ๋ค๋ ์๊ฐ์ ๋ค์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฒ ๋ฏธ์ ์์ ์ ๊ฐ ๊ฐ์ฅ ํท๊ฐ๋ ธ๋ ์ง์ ์
ํจํด์ ๋จผ์ ๋ ์ฌ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ ์ค๊ณํด์ผ ํ๋๊ฐ์๋๋ฉด์ฑ ์๊ณผ ํ๋ ฅ์ ๋จผ์ ์ ๋ฆฌํ๊ณ , ๋์ค์ ๋ณด๋ ํจํด์ฒ๋ผ ์ค๋ช ๋๋๊ฐ์์ต๋๋ค.์ฒ์ ์ฅ๊ธฐ ๋ฏธ์ ์ ๋ดค์ ๋๋ Board๋ฅผ ์ค์ฌ์๋ก ๋๊ณ , ๊ธฐ๋ฌผ๋ณ ์ด๋ ๊ท์น์ ์ ๋ต์ผ๋ก ๋๋ ์์ผ๋ก ์๊ฐํด๋ณผ ์ ์์ง ์์๊น ๊ณ ๋ฏผํ์ต๋๋ค.
๊ธฐ๋ฌผ๋ง๋ค ์ด๋ ์ ๋ต์ด ๋ค๋ฅด๋, ์ ๋ต ํจํด์ ํ์ฉํ ์ ์๊ฒ ๋ค๋ผ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
์ ๋ ์์ง ์ด๋ค ์ํฉ์์ ์ด๋ค ํจํด์ ์ ์ฉํด์ผ ํ๋์ง ๊ฐ์ด ์ ์กํ์ง ์์ต๋๋ค.
๊ทธ๋์ ์ ๊ฐ ํจํด์ ์ถ๋ฐ์ ์ผ๋ก ์ผ์์ผ ํ๋์ง, ์๋๋ฉด ์ฑ ์ ๋ถ๋ฆฌ์ ํ๋ ฅ์ ๋จผ์ ๊ณ ๋ฏผํ ๋ค ๊ฒฐ๊ณผ์ ์ผ๋ก ํจํด์ฒ๋ผ ๋ณด์ด๋ฉด ๋๋์ง๋ฅผ ์๊ณ ์ถ์ต๋๋ค.
4. ํ์ฅ์ ์ด๋ ๋ฒ์๊น์ง ์์ํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ตฌํ์ ํ๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ฌ ํ์ฅ ์๋๋ฆฌ์ค๋ฅผ ์์ํ๊ฒ ๋์ด ํผ๋์ค๋ฝ์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ณด๋์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง ์๋ ์๊ณ , ์๋ก์ด ๊ธฐ๋ฌผ์ด ์ถ๊ฐ๋ ์๋ ์๊ณ , ๊ธฐ์กด ๋ง์ ์ด๋ ๊ท์น์ด ๋ณํ๋ ์๋ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด๋ฐ ๊ฐ๋ฅ์ฑ์ ๋ ์ฌ๋ฆฌ๊ธฐ ์์ํ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋ ์ผ๋ฐํํ๊ณ ์ถ์ด์ง๋๋ฐ,
๋์์ ์ง๊ธ ์์ ์์ ๊ทธ ์์์ ๋๋ฌด ๋ง์ด ๋์ํ๋ ค๊ณ ํ๋ฉด ์คํ๋ ค ์ฝ๋๊ฐ ๊ณผํ๊ฒ ์ถ์ํ๋๊ณ ๋ณต์กํด์ง ์ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ ๋ ์์ง
์ง๊ธ ํ์ํ ๋ณํ์์ธ์ ๊ฐ ์์์ง๋ ๋ชจ๋ฅด๋ ๋ณํ๋ฅผ ์ด๋์์ ๊ตฌ๋ถํด์ผ ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.ํ์ฅ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ๋ ํ๋๋ ํ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๊ทธ ๋ฒ์๋ฅผ ๋๊ฒ ์ก์์๋ก ํ์ฌ ์ฝ๋์ ์ดํด ๋น์ฉ์ด ์ปค์ง ์ ์๋ค๋ ์ ๋ ํจ๊ป ๋๊ผ์ต๋๋ค.
๊ทธ๋์ ์ด ๋ถ๋ถ์์๋ ์ ๊ฐ ํ์ฅ์ ๋๋ฌด ์ ๊ฒ ๋ณธ ๊ฒ์ธ์ง, ์๋๋ฉด ๋ฐ๋๋ก ์์ง ์ค์ง ์์ ์๊ตฌ์ฌํญ๊น์ง ์์ํ๋ฉฐ ํ๋ค๋ฆฌ๊ณ ์๋ ๊ฒ์ธ์ง๋ ํจ๊ป ๋ด์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค.