[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฌด๋น ๋ฏธ์ ์ ์ถํฉ๋๋ค.#200
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฌด๋น ๋ฏธ์
์ ์ถํฉ๋๋ค.#200mvg01 wants to merge 118 commits intowoowacourse:mvg01from
Conversation
- ํ์ฌ movement์ ์์ง์์์ maxDistance๋ 1๋ก ๊ณ ์ ํด์ผํด์ ์์
- ํ์ฌ movement์ ์์ง์์์ maxDistance๋ 1๋ก ๊ณ ์ ํด์ผํด์ ์์
- GamaManager ํด๋์ค ์์ฑ
Gomding
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฌด๋น!
ํผ๋๋ฐฑ ์ ๋ฐ์ํด์ฃผ์
จ๋ค์ ๐
๋ช๊ฐ์ง ์ฝ๋ฉํธ ๋จ๊ฒผ์ผ๋ ํ์ธ๋ถํ๋๋ ค์~
๊ถ๊ธํ ์ ์์ผ๋ฉด ์ธ์ ๋ DM ์ด๋ ์ฝ๋ฉํธ ๋จ๊ฒจ์ฃผ์ธ์ :)
| public void run() { | ||
| Team redTeam = setupRedTeam(); | ||
| Team blueTeam = setupBlueTeam(); | ||
| Board board = BoardGenerator.generate(redTeam, blueTeam); | ||
| TurnManager turnManager = new TurnManager(); | ||
| while (board.hasTwoGeneral()) { | ||
| OutputView.printBoard(BoardDto.from(board), turnManager.currentTeamType()); | ||
| Position from = findFromPosition(board, turnManager); | ||
| Piece piece = board.getPieceInPosition(from); | ||
| List<Position> movable = piece.calculateMovablePositions(from, board); | ||
| OutputView.printBoardWithMovable(BoardDto.from(board, movable)); | ||
| Position to = RetryExecutor.retry(() -> inputToPosition(movable)); | ||
| board.changeBoard(from, to); | ||
| turnManager.changeTurn(); | ||
| } | ||
| OutputView.printGameOverMessage(turnManager.currentTeamType()); | ||
| } |
| Piece piece = board.getPieceInPosition(from); | ||
| List<Position> movable = piece.calculateMovablePositions(from, board); |
There was a problem hiding this comment.
์๋ฐ ๋ถ๋ถ์ Controller ์ ์์ ํ๋ฆ์ด ์๋๊ฒ ๊ฐ๋ค์ ๐ค
๋๋ฉ์ธ ์ชฝ์ ํ๋ฆ์ ๋ง๋ค์ด๋ณด๋๊ฒ์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
| // ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์์ทจ ์์น ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค. | ||
| // ๊ฒฝ๋ก์ ์ฅ์ ๋ฌผ์ ๋ง๋๋ฉด ๊ทธ๋๊น์ง์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๊ณ , ์ ์ ๋ง๋๋ค๋ฉด ์ ์ ์ขํ๋ฅผ ํฌํจํ์ฌ ๋ฐํํ๋ค. | ||
| public List<Position> calculateTracesForCannon(final Position from, final TeamType teamType, |
There was a problem hiding this comment.
ํด๋น ์ฑ
์์ด Movement ์ ์์ด๋ ๊ด์ฐฎ์์ง ์กฐ๊ธ ์๋ฌธ์ด ๋ค์์ด์ ๐ค
๋ฌด๋น์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
There was a problem hiding this comment.
Movement ํด๋์ค ์ ์ฒด์ ์ผ๋ก ๋ฉ์๋ ๊ธธ์ด๋ depth1 ๊ท์น์ ์ฒดํฌํด๋ณด์๋ฉด ์ข๊ฒ ์ด์!
| @Override | ||
| public List<Position> execute(Position from, final BoardMediator boardMediator) { | ||
| final Piece piece = boardMediator.getPieceInPosition(from); | ||
| final Movement movement = movementOrder.getFirst(); |
There was a problem hiding this comment.
๋ฏธ๋ฆฌ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํด์~ ๐
| if (!hasPieceIn(position)) { | ||
| throw new IllegalArgumentException("์์ฒญ๋ ์์น์๋ ๊ธฐ๋ฌผ์ด ์กด์ฌํ์ง ์์ต๋๋ค."); | ||
| } | ||
| return positionPieceMap.get(position); |
There was a problem hiding this comment.
์ทจํฅ ์ฐจ์ด์ด์ง๋ง ๋ถ์ ๋ฌธ์ธ ์กฐ๊ฑด๋ณด๋ค ๊ธ์ ๋ฌธ์ผ๋ก ์ฝ์ ์ ์๊ฒ ๋ฐฐ์นํ๋๊ฒ๋ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ด๋ผ ์๊ฐํด์~
| if (!hasPieceIn(position)) { | |
| throw new IllegalArgumentException("์์ฒญ๋ ์์น์๋ ๊ธฐ๋ฌผ์ด ์กด์ฌํ์ง ์์ต๋๋ค."); | |
| } | |
| return positionPieceMap.get(position); | |
| if (hasPieceIn(position)) { | |
| return positionPieceMap.get(position); | |
| } | |
| throw new IllegalArgumentException("์์ฒญ๋ ์์น์๋ ๊ธฐ๋ฌผ์ด ์กด์ฌํ์ง ์์ต๋๋ค."); |
| CHINESE_MAP = Map.of( | ||
| TeamType.RED, Map.of( | ||
| PieceType.GENERAL, ConsoleColor.red("ๆผข"), | ||
| PieceType.GUARD, ConsoleColor.red("ๅฃซ"), | ||
| PieceType.CHARIOT, ConsoleColor.red("่ป"), | ||
| PieceType.CANNON, ConsoleColor.red("ๅ "), | ||
| PieceType.HORSE, ConsoleColor.red("้ฆฌ"), | ||
| PieceType.ELEPHANT, ConsoleColor.red("่ฑก"), | ||
| PieceType.SOLDIER, ConsoleColor.red("ๅ ต") | ||
| ), | ||
| TeamType.BLUE, Map.of( | ||
| PieceType.GENERAL, ConsoleColor.blue("ๆฅ"), | ||
| PieceType.GUARD, ConsoleColor.blue("ๅฃซ"), | ||
| PieceType.CHARIOT, ConsoleColor.blue("่ป"), | ||
| PieceType.CANNON, ConsoleColor.blue("ๅ "), | ||
| PieceType.HORSE, ConsoleColor.blue("้ฆฌ"), | ||
| PieceType.ELEPHANT, ConsoleColor.blue("่ฑก"), | ||
| PieceType.SOLDIER, ConsoleColor.blue("ๅ") | ||
| )); | ||
| } |
There was a problem hiding this comment.
์ด๊ฑด view ์ ๋งค์ฐ ๊น์๊ด๊ณ๋ผ view ์์ ๋ณํํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ฐ ๋ฌด๋น์ ์ด๋ป๊ฒ ์๊ฐํ์๋์!
DTO ๊ฐ view ์ ์์ญ๊น์ง ๋๋ฌด ๊น๊ฒ ์๊ณ ์๋ค๊ณ ๋๊ปด์ ธ์์ :)
There was a problem hiding this comment.
BoardDto ์ ์ฒด์ ์ผ๋ก DTO ์ ์ฑ
์๋ฒ์๋ฅผ ๋์ด์๋ ๋ถ๋ถ์ด ์๋๊ฒ ๊ฐ์์ ๐ค
๋ฌด๋น์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
| public class General implements Piece { | ||
|
|
||
| private static final PieceType PIECE_TYPE = PieceType.GENERAL; | ||
| private static final PieceAction PIECE_ACTION; |
There was a problem hiding this comment.
๋ชจ๋ piece ๋ค์ด PieceAction๊ณผ PieceType์ด ํ์ํ๋ฐ Piece ๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ง๋ค๊ฑฐ๋ Piece ํ์์ ์ถ์ํด๋์ค๋ก ๊ณ์ธต ํ๋๋ฅผ ๋๋๊ฒ๋ ๋ฐฉ๋ฒ์ด๊ฒ ์ด์ :)
|
|
||
| private static void validateRowRange(final int row) { | ||
| if (row < MINIMUM_ROW || row > MAXIMUM_ROW) { | ||
| throw new IllegalArgumentException("ํ ์ ๋ ฅ์ 1~10์ ์ ๋ ฅํด์ผ ํฉ๋๋ค."); |
There was a problem hiding this comment.
์๋์ ๊ฐ์ด ํํํ๋ฉด ์์์ ๊ฐ ์์ ์ ์์ ํ ์์น๊ฐ ์ค์ด๋๋ ํธํ ๊ฒ ๊ฐ๋ค์ :)
| throw new IllegalArgumentException("ํ ์ ๋ ฅ์ 1~10์ ์ ๋ ฅํด์ผ ํฉ๋๋ค."); | |
| throw new IllegalArgumentException("ํ ์ ๋ ฅ์ %s~%s์ ์ ๋ ฅํด์ผ ํฉ๋๋ค.", MINIMUM_ROW, MAXIMUM_ROW); |
๊ฐ์
์๋ ํ์ธ์ ์ฐฐ๋ฆฌ, ๋ฌด๋น์ ๋๋ค.
์ด๋ฒ ์ฌ์ดํด 1์ ์ ์๊ฒ ๊ฝค ์ด๋ ต๊ฒ ๋ค๊ฐ์จ ๋ฏธ์ ์ด์์ต๋๋ค. ๊ตฌํ์ ์งํํ๋ ๋ด๋ด ์ค๊ณ์ ๋ํด ์ค๋ ๊ณ ๋ฏผํ๊ณ , ํ์ด์ ๋ง์ ๋ํ๋ฅผ ๋๋๋ฉฐ ์ต๋ํ ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐฉํฅ์ ์งํค๊ณ ์ ๋ ธ๋ ฅํ์ต๋๋ค.
๋ค๋ง ์์ง ์๋ฐ์ ๊ฐ์ฒด์งํฅ์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ๋ค ๋ณด๋, ๊ธฐ๋ฌผ ์ด๋ ๊ด๋ จ ํด๋์ค์ ๋ฉ์๋์๋ ์ค๋ณต์ด ๋จ์ ์๊ณ , ๊ฐ ๊ธฐ๋ฌผ์ ์์ง์ ์ ๋ต์ ์ด๊ธฐํํ๋ ๋ถ๋ถ๋ ๋ค์ ๊ธธ๊ณ ๋ณต์กํด์ก์ต๋๋ค. ์ด๋ฒ ๋จ๊ณ์์๋ ์ฐ์ ์์ ํ ๋์ํ๋ ์ฝ๋๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ๋๊ณ , ์ต์ํ์ ๋ฆฌํฉํ ๋ง๋ง ์งํํ ์ํ๋ก PR์ ๋๋ฆฝ๋๋ค. ๋ถ์กฑํ ๋ถ๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐ์ ํด๋ณด๊ณ ์ถ์ต๋๋ค.
ํ์ฌ๋ ๊ฒ์์ ํด ์งํ, ๊ถ์ฑ, ์นํจ ๋ก์ง๊น์ง๋ ๊ตฌํํ์ง ๋ชปํ์ต๋๋ค. ์ฐจ๋ฆผ๋ฒ์ ์ ๋ ฅ๋ฐ์ ์ ํ์ ๊ธฐ๋ฌผ์ ์ด๊ธฐํํ๊ณ , ๋ณด๋๋ฅผ ๊ตฌ์ฑํด ์ถ๋ ฅํ๋ ํ๋ฆ๊น์ง ์ปจํธ๋กค๋ฌ์์ ๋ด๋นํ๊ณ ์์ต๋๋ค.
์ ๊ฐ ๊ฐ์ฒด์งํฅ ๊ฐ๋ ๊ณผ ์๋ฐ์คํฌ์ด ๋ง์ด ๋ถ์กฑํฉ๋๋ค. ๊ทธ๋งํผ ์ด๋ฒ ๋ฆฌ๋ทฐ์์ ๋ง์ด ๋ฐฐ์ฐ๊ณ ์ถ์ต๋๋ค. ํธํ๊ฒ ์ฌ๋ฌ ๊ด์ ์์ ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ํ์ ๊ธฐ ๊ฑด๊ฐ ์ ์ํ์ธ์!
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
1. ๋ณด๋ ์ํ๋ฅผ ์ด๋์์ ๊ด๋ฆฌํด์ผ ํ๋์ง์ ๋ํ ์ค๊ณ
๊ฐ์ฅ ํฌ๊ฒ ๊ณ ๋ฏผํ ๋ถ๋ถ์ ๋๋ค. ์ฌ์ ํ์ต๊ณผ ํ ๋ก ๊ณผ์ ์์๋ ๊ธฐ๋ฌผ์ด ๋ณด๋์ ์ํ๋ฅผ ์ง์ ์ ์ฑ ์์ด ์๋ค๊ณ ์๊ฐํ๊ณ , ๊ธฐ๋ฌผ์ ์์ ์ ์ด๋ ๊ท์น๋ง ์๊ณ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก ์ด๋ ๊ฐ๋ฅํ ์์น๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์์๋ ๋ณด๋ ์ํ๊ฐ ๊ณ์ ํ์ํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฌผ์ ์ง์ ์ ๋ฌํ๋ค ๋ณด๋ฉด ๊ธฐ๋ฌผ์ด ๋ณด๋๋ฅผ ์๊ฒ ๋๋ ๊ตฌ์กฐ๊ฐ ๋์ด ๋ถํธํ์ต๋๋ค.
๊ทธ๋์ ๋ณด๋์ ๊ธฐ๋ฌผ ์ฌ์ด์ BoardMediator๋ฅผ ๋๊ณ , ๊ธฐ๋ฌผ์ ๋ณด๋์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ชจ๋ฅด๋๋ผ๋ ํ์ํ ์ ๋ณด๋ง ๋ฐ์์ฌ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค. ์ด ๋ฐฉ์์ด ์บก์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉํฅ์ธ์ง, ํน์ ์คํ๋ ค ์ค์ฌ์์ธ BoardMediator์๊ฒ ์ฑ ์์ด ๊ณผํ๊ฒ ๋ชฐ๋ฆฌ๋ ๊ตฌ์กฐ์ธ์ง ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ์ต๋๋ค. ์ฐฐ๋ฆฌ๋ผ๋ฉด ์ด๋ป๊ฒ ๊ธฐ๋ฌผ๊ณผ ๋ณด๋์ ์ํ๋ฅผ ๊ด๋ฆฌํ์์ง๋ ๋ฃ๊ณ ์ถ์ต๋๋ค.
2. movement๋ฅผ 1์นธ ๋จ์๋ก ๋ค๋ฃจ๋ ํ์ฌ ๋ฐฉ์์ด ์ ์ ํ์ง
์ฒ์์๋ movement๊ฐ ํ ๋ฒ์ ์ฌ๋ฌ ์นธ์ ํํํ ์ ์๋๋ก maxDistance ๊ฐ๋ ์ ๋๊ณ ์ถ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ ๊ฒฝ์ฐ๋ โ๋๊ฐ์ 1์นธ์ ๋ ๋ฒโ์ด ์๋๋ผ โ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ต๋ 2์นธโ์ฒ๋ผ ํํํ๊ณ ์ถ์์ต๋๋ค. ํ์ง๋ง ๊ตฌํ ๊ณผ์ ์์ ๋ณต์ก๋๊ฐ ๋ง์ด ์ฌ๋ผ๊ฐ์, ํ์ฌ๋ ๋ชจ๋ movement๋ฅผ ์ฌ์ค์ 1์นธ ๋จ์๋ก๋ง ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค(์ ๋ถ๋ถ์ ์ฝ๋๋ก ์ฝ๋ฉํธ ๋จ๊ธฐ๊ฒ ์ต๋๋ค.)
์ด ๋ฐฉ์์ด ์คํ๋ ค ๋ ๋จ์ํ๊ณ ์ ์ง๋ณด์์ ์ ๋ฆฌํ์ง, ์๋๋ฉด ์ฒ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ movement ์์ฒด๊ฐ ๊ฑฐ๋ฆฌ ๊ฐ๋ ์ ๊ฐ๋ ํธ์ด ๋ ๋์์ง ์กฐ์ธ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
3. ๊ธฐ๋ฌผ ์ด๊ธฐํ์ ์ ๋ต ์ด๊ธฐํ์์ new๊ฐ ๋ง์ด ๋ฑ์ฅํ๋ ๊ตฌ์กฐ
๊ฐ ๊ธฐ๋ฌผ์ pieceAction ์ด๊ธฐํ, ๊ทธ๋ฆฌ๊ณ ๋ณด๋์ ์ด๊ธฐ ๋ฐฐ์น ๊ณผ์ ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ์ฝ๋๊ฐ ๋ง์ด ๋ค์ด๊ฐ์ต๋๋ค.
์ง๊ธ์ ๋์์ ์ฐ์ ์ํด์ ์์ฑํ์ง๋ง, ์์ฑํ๋ฉด์๋ ๋ค์ ํ๋์ฝ๋ฉ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค.
ํ์ฌ ์ค๊ณ ์์์ ์ด ๋ถ๋ถ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์์ง, ํน์ ํฉํ ๋ฆฌ๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ด์ง ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ์ต๋๋ค.
4. ํ ์คํธ ๋ฒ์์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ด๋๊น์ง ๊ฐ์ ธ๊ฐ์ผ ํ๋์ง
์ด๋ฒ ๊ตฌํ์์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ๋ ๋ง์ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํนํ ์ด๋ ๊ท์น์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์, ์ด๋๊น์ง ํ ์คํธํด์ผ ์ถฉ๋ถํ์ง ๊ณ์ ๊ณ ๋ฏผํ๊ฒ ๋์์ต๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋๊น์ง ์ง์ํ๊ฒ ์ถ์ ํด ์์ ๋ฌด๊ฒฐํ๊ฒ ํ ์คํธํ๋ ๊ฒ์ด ๋ง๋์ง, ์๋๋ฉด ํต์ฌ ๊ท์น๊ณผ ๋ํ ์ผ์ด์ค ์ค์ฌ์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ๋ ํ์ค์ ์ธ์ง ๊ธฐ์ค์ด ๊ถ๊ธํฉ๋๋ค.
๋ํ ํ ์คํธ๋ฅผ ์์ฑํ๋ค ๋ณด๋ fixture ์ค๋ณต์ด๋ ์ผ์ด์ค ์ค๊ณ์๋ ์๊ฐ์ด ๋ง์ด ๋ค์๋๋ฐ, ์ด๋ฐ ๋ถ๋ถ์ ๋ํ ํ๋ ํจ๊ป ๋ฃ๊ณ ์ถ์ต๋๋ค. ํ์์๋ ํ ์คํธ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ public ๋ฉ์๋ ์ค์ฌ์ผ๋ก ์์ฑํ๊ณ , fixture ๋ก์ง์ด ๋ฐ๋ณต๋๋ฉด ๋ณ๋ ์ ํธ๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ์ค์ ์ ๋ฆฌํด๋์๋๋ฐ, ์ ๊ฐ ์ค์ ์ฝ๋์ ๊ทธ ๊ธฐ์ค์ ์ ๋ฐ์ํ๊ณ ์๋์ง๋ ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.