-
Notifications
You must be signed in to change notification settings - Fork 415
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[1, 2단계 - 체스] 페드로(류형욱) 미션 제출합니다. #642
Merged
Merged
Changes from all commits
Commits
Show all changes
74 commits
Select commit
Hold shift + click to select a range
a05391b
docs: 기능 명세서 초안 작성
kelly6bf 672926e
feat(position): Position 인스턴스 생성 로직 구현
kelly6bf 3bffae7
feat(inputView): 사용자로부터 명령을 입력받는 기능 구현
kelly6bf 65a1a43
fix(position): 위치 객체에서 체스 도메인 용어를 사용하도록 변경
kelly6bf ea61d0e
feat(board): 체스판의 말을 시작 위치로 배치하는 기능 구현
kelly6bf 00cde4d
feat(outputView): 체스판 출력 기능 구현
kelly6bf 989bcde
docs(readme): 2단계 기능 요구사항 추가
kelly6bf 71873d6
refactor(/position): 위치정보와 관련된 클래스들을 한 패키지로 모음
kelly6bf f568096
refactor(position): Position 생성자 파라미터 순서 변경
kelly6bf c08c946
feat(unitVector): 8방위를 나타내는 단위 벡터 객체 구현
kelly6bf 024c0ec
feat(position): 현재 위치에서 백터를 누적한 새로운 위치를 생성하는 로직 구현
kelly6bf 2c97912
feat(orthogonalMoveStrategy): 직선 방향으로 이동 가능 여부를 확인하는 전략 구현
kelly6bf 2474fb9
feat(continuousMoveStrategy): 이동 가능한 방향벡터와 이동 횟수 제한을 가지는 연속 이동 전략 구현
kelly6bf 244b111
refactor(boardInitializer):체스판 초기화 책임 분리
kelly6bf 76b901f
refactor(continuousMoveStrategy): 스트림 내의 Predicate 메서드 분리
kelly6bf d5a7cc6
feat(board): 체스 말을 이동시키는 기능 구현
kelly6bf eab0b5c
feat(knightMoveStrategy): 나이트 이동 전략 구현
kelly6bf b08219b
feat(pawnMoveStrategy): 폰의 이동 전략 구현
kelly6bf 685eac4
test(boardTest): 기물을 이동시키는 로직의 테스트 추가
kelly6bf 832de3e
refactor(board): 이동 불가능한 경우별 예외에 메시지 구분
kelly6bf 161743d
feat(inputView): 사용자의 명령을 입력받는 기능 구현
kelly6bf ba7a380
feat(chessController): 팀을 번갈아 가며 게임을 진행하는 기능 구현
kelly6bf a87e56b
test(knightMoveStrategyTest): 나이트 움직임에 대한 테스트 코드 추가
kelly6bf 80b5cc2
test(pawnMoveStrategyTest): 폰 움직임에 대한 테스트 코드 추가
kelly6bf b9c04c9
style(positionTest): 테스트 설명 수정
kelly6bf e4dbb49
feat(pieceFactory): PieceType을 전달받아 올바른 Piece를 생성하는 객체 추가
kelly6bf e4f2c11
test(boardTest): Board 출발지 -> 목적지 기물 배치 성공 & 실패 테스트 추가
kelly6bf 5df2629
refactor(continuousMoveStrategy): 메서드 이름 변경
kelly6bf 78937a5
style(position): 미사용 TODO 삭제
kelly6bf 2c67d48
refactor(chessController): 사용자 입력에 따라 게임을 진행하는 기능 구현
kelly6bf 42f87da
refactor(requestDto): 명령 인자에서 Optional 제거
kelly6bf a99a608
fix(pawnMoveStrategy): 폰이 직선 이동에서 상대 기물을 공격하는 버그 수정
kelly6bf d215f9c
Update .gitignore
hw0603 388bf9b
refactor(chessController): 미 사용 메서드 제거
hw0603 ac78f0b
refactor(knightDirection): 미사용 메서드 삭제
hw0603 8c8b76f
refactor(/game): 체스 게임에서 사용되는 객체들을 game 패키지로 모음
hw0603 3fdcf0b
refactor(boardInitializer): 인스턴스화 방지를 위한 private 생성자 추가
hw0603 1bca5e6
refactor(pieceFactory): 인스턴스화 방지를 위한 private 생성자 추가
hw0603 fa2e1d1
style: 미사용 import문 제거
hw0603 c174adc
docs(readme): 구현된 기능 요구사항 업데이트
hw0603 2a97a1d
test(turn): 게임의 턴을 관리하는 객체의 테스트 코드 추가
hw0603 ac8679e
refactor(chessController): import문 오류 수정
hw0603 bbc345c
fix(positionTest): 패키지 경로 수정
hw0603 01ecc71
refactor(board): 이동 로직의 메서드 추출
hw0603 c4a4d43
refactor(inputView): GameCommand 변수 추출
hw0603 c6874e8
refactor(outputView): 체스판 출력 시 File과 Rank도 함께 출력하도록 변경
hw0603 08c9ba9
style(boardInitializer): 잘못 추가된 공백 제거
hw0603 d134dd4
refactor(board): 이동 위치 검증 로직 메서드 분리
hw0603 dfe1331
refactor(board): 출발지의 위치를 제외한 위치 집합을 생성하는 로직에서 스트림을 사용하도록 변경
hw0603 ce0a5e1
refactor(board): 출발지와 도착지가 동일한 경우 예외 케이스 추가
hw0603 80d8da4
test(fixture): 위치 객체 테스트 픽스처 적용
hw0603 5e4c719
test(continuousMoveStrategy): 룩/비숍/퀸의 이동 전략에 대해 각각 테스트 케이스 적용
hw0603 b6d7c47
refactor(outputConverter): 변환값이 존재하지 않을 경우 예외 추가
hw0603 a80d46a
test(positionConverterTest): 위치 변환 로직 테스트 케이스 추가
hw0603 612da07
refactor(positionConverter): 인스턴스화 방지
hw0603 f6fbca4
refactor(inputView): move 명령을 파싱하는 로직 메서드 분리
hw0603 eacd7f0
refactor(continuousMoveStrategy): isMovable() 에서 takeWhile() 을 사용하지 않…
hw0603 fb17a6a
refactor(teamColor, pieceType): 팀별 기물 타입 정보를 저장하는 위치 변경
hw0603 6eb07de
refactor(unitVector): 인자의 람다식과 겹치지 않도록 필드명 변경
hw0603 329c197
refactor(pawnMoveStrategy): 폰의 색상 별 공통 로직 추상화
hw0603 3462bf5
test(pawnMoveStrategyTest): 폰이 2칸 이동할 때, 기물에 의해 막히는 테스트 케이스 추가
hw0603 514589d
fix(pawnMoveStrategy): 폰이 2칸 이동할 때 다른 기물을 뛰어넘는 문제 수정
hw0603 4a0ccb9
refactor(pawnMoveStrategy): 한 칸 이동 사이즈 상수 추출
hw0603 ed88c9e
refactor(KnightDirection): 패키지 위치 변경
hw0603 2247d3d
test(knightMoveStrategy): ParameterizedTest 로 변경
hw0603 6b071b0
refactor(pawnMoveStrategyTest): 폰의 움직임 별 테스트 코드 분리
hw0603 c810f08
refactor(file): File enum 캐싱 적용
hw0603 5a50def
refactor(rank): Rank enum 캐싱 적용
hw0603 76c1715
refactor(position): Position 객체 캐싱 적용
hw0603 a213f54
refactor(boardInitializer): Position 별 Piece Map 구축 로직 개선
hw0603 496a1be
refactor(boardTest): assertThat 구문 체이닝
hw0603 02c3d0a
style(/dto): 클래스 선언부와 본문 사이 개행 제거
hw0603 abc07f5
refactor(chessController): 잘못된 입력 시 재 입력을 받도록 변경
hw0603 a50c648
refactor(inputView): 불필요한 static 메서드 삭제
hw0603 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,3 +30,6 @@ out/ | |
|
||
### VS Code ### | ||
.vscode/ | ||
|
||
### Docker ### | ||
/docker/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
|
||
|
||
Co-authored-by: Hyunguk Ryu <hw0603@naver.com> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
## 기능 흐름 | ||
|
||
- [x] 사용자로부터 게임 시작 여부 입력 | ||
- [x] `start`를 입력받으면 체스판을 초기화한다. | ||
- [x] `end`를 입력받으면 프로그램을 종료한다. | ||
- [x] `move`와 출발지/목적지 정보를 입력받으면 기물 이동을 시도한다. | ||
- [x] 체스판을 초기화한다. | ||
- [x] 체스판을 출력한다. | ||
- [x] 체스 기물을 이동시킨다. | ||
- [x] 이동이 가능 여부를 확인한다. | ||
- [x] 기물 위치를 업데이트한다. | ||
|
||
## 도메인별 기능 | ||
|
||
### Vector | ||
- [x] 행, 열의 두 정수 성분을 가지고, 단위벡터로서 이동의 방향성을 나타낸다. | ||
- [x] 출발지, 도착지의 위치 정보를 받아서 해당 방향으로 이동하기 위한 최적의 벡터 객체를 생성한다. | ||
|
||
### Position | ||
- [x] `Rank`, `File`의 쌍을 가지고 한 칸의 위치를 표현한다. | ||
|
||
### Piece | ||
- [x] 타입이 다른 기물들과 자신을 구별할 수 있는`PieceType`을 가진다. | ||
- [x] 이동 가능한 위치인지 여부를 확인한다. | ||
- [x] 모든 말은 체스보드 안에서만 움직일 수 있다. | ||
- [x] 목적지까지 가는 경로에 다른 기물이 존재하면 이동할 수 없다. | ||
- 록 | ||
- [x] 동서남북 방향으로 직진할 수 있다. | ||
- 비숍 | ||
- [x] 대각선 방향으로 직진할 수 있다. | ||
- 퀸 | ||
- [x] 동서남북, 혹은 대각선 방향으로 직진할 수 있다. | ||
- 킹 | ||
- [x] 동서남북, 혹은 대각선 방향으로 1칸만 이동할 수 있다. | ||
- 나이트 | ||
- [x] 동서남북 방향으로 한 칸 전진 후, 전진한 방향에서 대각선으로 한 칸 이동할 수 있다. | ||
- [x] 다른 말을 뛰어넘을 수 있다. | ||
- 폰 | ||
- [x] 한 칸만 앞으로 전진만 할 수 있다. | ||
- [x] 다른 말을 공격하는 경우 대각선 방향으로 한 칸만 이동할 수 있다. | ||
- [x] 최초로 이동할 경우 한 칸 또는 두 칸 이동할 수 있다. | ||
|
||
### Board | ||
- [x] 체스의 규칙에 맞게 각 기물들을 시작 위치로 배치한다. | ||
- [x] 기물의 도착지에 현재 이동하는 기물과 같은 색의 기물이 존재하면 이동할 수 없다. | ||
- [x] 도착지에 다른 색의 기물이 존재하는 경우, 해당 기물을 제거하고 배치한다. | ||
|
||
### InputView | ||
- [x] `start` 명령과 `end`, `move` 명령을 입력받는다. | ||
|
||
### OutputView | ||
- [x] 현재 체스판의 상태를 출력한다. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import controller.ChessController; | ||
import view.InputView; | ||
import view.OutputView; | ||
|
||
public class Application { | ||
public static void main(String[] args) { | ||
InputView inputView = new InputView(); | ||
OutputView outputView = new OutputView(); | ||
ChessController chessController = new ChessController(inputView, outputView); | ||
|
||
chessController.run(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package controller; | ||
|
||
import domain.GameCommand; | ||
import domain.game.Board; | ||
import domain.game.BoardInitializer; | ||
import domain.game.Turn; | ||
import dto.BoardDto; | ||
import dto.RequestDto; | ||
import java.util.function.Supplier; | ||
import view.InputView; | ||
import view.OutputView; | ||
|
||
public class ChessController { | ||
private final InputView inputView; | ||
private final OutputView outputView; | ||
|
||
public ChessController(final InputView inputView, final OutputView outputView) { | ||
this.inputView = inputView; | ||
this.outputView = outputView; | ||
} | ||
|
||
public void run() { | ||
outputView.printWelcomeMessage(); | ||
GameCommand command = readUserInput(inputView::inputGameStart); | ||
if (command.isStart()) { | ||
startGame(); | ||
} | ||
} | ||
|
||
private <T> T readUserInput(Supplier<T> inputSupplier) { | ||
while (true) { | ||
try { | ||
return inputSupplier.get(); | ||
} catch (IllegalArgumentException e) { | ||
System.out.println(e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
private void startGame() { | ||
Board board = BoardInitializer.init(); | ||
printStatus(board); | ||
|
||
Turn turn = new Turn(); | ||
RequestDto requestDto = readUserInput(inputView::inputGameCommand); | ||
while (requestDto.command().isContinuable()) { | ||
doTurn(board, turn, requestDto); | ||
printStatus(board); | ||
requestDto = readUserInput(inputView::inputGameCommand); | ||
} | ||
} | ||
|
||
private void doTurn(Board board, Turn turn, RequestDto requestDto) { | ||
try { | ||
board.movePiece(turn.current(), requestDto.source(), requestDto.destination()); | ||
turn.next(); | ||
} catch (IllegalArgumentException e) { | ||
System.out.println("[오류] " + e.getMessage()); | ||
} | ||
} | ||
|
||
private void printStatus(Board board) { | ||
BoardDto boardDto = BoardDto.from(board); | ||
outputView.printBoard(boardDto); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package domain; | ||
|
||
public enum GameCommand { | ||
START, MOVE, END; | ||
|
||
public boolean isContinuable() { | ||
return this != END; | ||
} | ||
|
||
public boolean isStart() { | ||
return this == START; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package domain.game; | ||
|
||
import domain.position.Position; | ||
|
||
import java.util.Collections; | ||
import java.util.Map; | ||
import java.util.Set; | ||
import java.util.stream.Collectors; | ||
|
||
public class Board { | ||
private final Map<Position, Piece> chessBoard; | ||
|
||
public Board(final Map<Position, Piece> chessBoard) { | ||
this.chessBoard = chessBoard; | ||
} | ||
|
||
public Map<Position, Piece> getChessBoard() { | ||
return Collections.unmodifiableMap(chessBoard); | ||
} | ||
|
||
public void movePiece(final TeamColor teamColor, final Position source, final Position destination) { | ||
validateMoveRequest(teamColor, source, destination); | ||
|
||
boolean caughtEnemy = isPieceExist(destination); | ||
Piece piece = chessBoard.get(source); | ||
chessBoard.put(destination, piece); | ||
chessBoard.remove(source); | ||
} | ||
|
||
private void validateMoveRequest(TeamColor teamColor, Position source, Position destination) { | ||
validateEmpty(source); | ||
validateColor(teamColor, source); | ||
Piece piece = chessBoard.get(source); | ||
validateReachability(source, destination, piece); | ||
validateDestinationPiece(teamColor, destination); | ||
} | ||
|
||
private void validateEmpty(final Position source) { | ||
if (!chessBoard.containsKey(source)) { | ||
throw new IllegalArgumentException("해당 위치에 기물이 없습니다."); | ||
} | ||
} | ||
|
||
private void validateColor(final TeamColor teamColor, final Position source) { | ||
if (!chessBoard.get(source).hasColor(teamColor)) { | ||
throw new IllegalArgumentException("차례가 맞지 않습니다."); | ||
} | ||
} | ||
|
||
private void validateReachability(Position source, Position destination, Piece piece) { | ||
if (source.equals(destination)) { | ||
throw new IllegalArgumentException("출발지와 도착지가 동일합니다."); | ||
} | ||
if (!piece.isMovable(source, destination, generatePiecePositions(source))) { | ||
throw new IllegalArgumentException("이동 위치까지 이동할 수 없습니다."); | ||
} | ||
} | ||
|
||
private Set<Position> generatePiecePositions(final Position excluded) { | ||
return chessBoard.keySet().stream() | ||
.filter(key -> !key.equals(excluded)) | ||
.collect(Collectors.toSet()); | ||
} | ||
|
||
private void validateDestinationPiece(TeamColor teamColor, Position destination) { | ||
if (isAllyPieceExistOnDestination(teamColor, destination)) { | ||
throw new IllegalArgumentException("이동 위치에 아군 기물이 존재합니다."); | ||
} | ||
} | ||
|
||
private boolean isAllyPieceExistOnDestination(TeamColor teamColor, Position destination) { | ||
return isPieceExist(destination) && (chessBoard.get(destination).hasColor(teamColor)); | ||
} | ||
|
||
private boolean isPieceExist(Position position) { | ||
return chessBoard.containsKey(position); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package domain.game; | ||
|
||
import domain.position.File; | ||
import domain.position.Position; | ||
|
||
import java.util.Arrays; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.stream.Collectors; | ||
|
||
import static domain.game.PieceType.*; | ||
import static domain.position.File.*; | ||
import static domain.position.Rank.*; | ||
|
||
public class BoardInitializer { | ||
private BoardInitializer() { | ||
} | ||
|
||
private static final Map<PieceType, List<Position>> pieceInitialPositions = Map.ofEntries( | ||
Map.entry(BLACK_PAWN, Arrays.stream(File.values()).map(file -> Position.of(file, SEVEN)).toList()), | ||
Map.entry(BLACK_ROOK, List.of(Position.of(A, EIGHT), Position.of(H, EIGHT))), | ||
Map.entry(BLACK_KNIGHT, List.of(Position.of(B, EIGHT), Position.of(G, EIGHT))), | ||
Map.entry(BLACK_BISHOP, List.of(Position.of(C, EIGHT), Position.of(F, EIGHT))), | ||
Map.entry(BLACK_QUEEN, List.of(Position.of(D, EIGHT))), | ||
Map.entry(BLACK_KING, List.of(Position.of(E, EIGHT))), | ||
Map.entry(WHITE_PAWN, Arrays.stream(File.values()).map(file -> Position.of(file, TWO)).toList()), | ||
Map.entry(WHITE_ROOK, List.of(Position.of(A, ONE), Position.of(H, ONE))), | ||
Map.entry(WHITE_KNIGHT, List.of(Position.of(B, ONE), Position.of(G, ONE))), | ||
Map.entry(WHITE_BISHOP, List.of(Position.of(C, ONE), Position.of(F, ONE))), | ||
Map.entry(WHITE_QUEEN, List.of(Position.of(D, ONE))), | ||
Map.entry(WHITE_KING, List.of(Position.of(E, ONE))) | ||
); | ||
|
||
public static Board init() { | ||
Map<Position, Piece> positions = pieceInitialPositions.entrySet().stream() | ||
.flatMap(entry -> entry.getValue().stream() | ||
.map(position -> Map.entry(position, PieceFactory.create(entry.getKey())))) | ||
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); | ||
|
||
return new Board(positions); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package domain.game; | ||
|
||
import domain.position.Position; | ||
import domain.strategy.MoveStrategy; | ||
|
||
import java.util.Set; | ||
|
||
public class Piece { | ||
private final PieceType pieceType; | ||
private final MoveStrategy moveStrategy; | ||
|
||
public Piece(final PieceType pieceType, final MoveStrategy moveStrategy) { | ||
this.pieceType = pieceType; | ||
this.moveStrategy = moveStrategy; | ||
} | ||
|
||
public PieceType getPieceType() { | ||
return pieceType; | ||
} | ||
|
||
public boolean hasColor(final TeamColor teamColor) { | ||
return teamColor.contains(pieceType); | ||
} | ||
|
||
public boolean isMovable(final Position source, final Position destination, final Set<Position> piecePositions) { | ||
return moveStrategy.isMovable(source, destination, piecePositions); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package domain.game; | ||
|
||
import domain.position.UnitVector; | ||
import domain.strategy.BlackPawnMoveStrategy; | ||
import domain.strategy.ContinuousMoveStrategy; | ||
import domain.strategy.KnightMoveStrategy; | ||
import domain.strategy.MoveStrategy; | ||
import domain.strategy.WhitePawnMoveStrategy; | ||
import java.util.Map; | ||
|
||
import static domain.game.PieceType.*; | ||
|
||
public class PieceFactory { | ||
private PieceFactory() { | ||
} | ||
|
||
private static final int MAXIMUM_MOVE_BOUND = 8; | ||
private static final int KING_MAXIMUM_MOVE_BOUND = 1; | ||
private static final MoveStrategy whitePawnStrategy = new WhitePawnMoveStrategy(); | ||
private static final MoveStrategy blackPawnStrategy = new BlackPawnMoveStrategy(); | ||
private static final MoveStrategy knightStrategy = new KnightMoveStrategy(); | ||
private static final MoveStrategy rookStrategy = new ContinuousMoveStrategy(UnitVector.orthogonalVectors(), MAXIMUM_MOVE_BOUND); | ||
private static final MoveStrategy bishopStrategy = new ContinuousMoveStrategy(UnitVector.diagonalVectors(), MAXIMUM_MOVE_BOUND); | ||
private static final MoveStrategy queenStrategy = new ContinuousMoveStrategy(UnitVector.omnidirectionalVectors(), MAXIMUM_MOVE_BOUND); | ||
private static final MoveStrategy kingStrategy = new ContinuousMoveStrategy(UnitVector.omnidirectionalVectors(), KING_MAXIMUM_MOVE_BOUND); | ||
|
||
private static final Map<PieceType, MoveStrategy> moveStrategies = Map.ofEntries( | ||
Map.entry(BLACK_PAWN, blackPawnStrategy), | ||
Map.entry(BLACK_ROOK, rookStrategy), | ||
Map.entry(BLACK_KNIGHT, knightStrategy), | ||
Map.entry(BLACK_BISHOP, bishopStrategy), | ||
Map.entry(BLACK_QUEEN, queenStrategy), | ||
Map.entry(BLACK_KING, kingStrategy), | ||
Map.entry(WHITE_PAWN, whitePawnStrategy), | ||
Map.entry(WHITE_ROOK, rookStrategy), | ||
Map.entry(WHITE_KNIGHT, knightStrategy), | ||
Map.entry(WHITE_BISHOP, bishopStrategy), | ||
Map.entry(WHITE_QUEEN, queenStrategy), | ||
Map.entry(WHITE_KING, kingStrategy) | ||
); | ||
|
||
public static Piece create(PieceType pieceType) { | ||
return new Piece(pieceType, moveStrategies.get(pieceType)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package domain.game; | ||
|
||
public enum PieceType { | ||
BLACK_PAWN, BLACK_ROOK, BLACK_KNIGHT, BLACK_BISHOP, BLACK_QUEEN, BLACK_KING, | ||
WHITE_PAWN, WHITE_ROOK, WHITE_KNIGHT, WHITE_BISHOP, WHITE_QUEEN, WHITE_KING | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package domain.game; | ||
|
||
import java.util.Set; | ||
|
||
import static domain.game.PieceType.*; | ||
|
||
public enum TeamColor { | ||
BLACK(Set.of(BLACK_KING, BLACK_QUEEN, BLACK_ROOK, BLACK_KNIGHT, BLACK_BISHOP, BLACK_PAWN)), | ||
WHITE(Set.of(WHITE_KING, WHITE_QUEEN, WHITE_ROOK, WHITE_KNIGHT, WHITE_BISHOP, WHITE_PAWN)); | ||
|
||
private final Set<PieceType> includedPieces; | ||
|
||
TeamColor(Set<PieceType> includedPieces) { | ||
this.includedPieces = includedPieces; | ||
} | ||
|
||
public boolean contains(PieceType pieceType) { | ||
return includedPieces.contains(pieceType); | ||
} | ||
|
||
public TeamColor toggle() { | ||
if (this == BLACK) { | ||
return WHITE; | ||
} | ||
return BLACK; | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
factory안에 strategy가 숨겨져있고 Piece만 생성하는 구조가 좋아보이네요~