-
Notifications
You must be signed in to change notification settings - Fork 461
Expand file tree
/
Copy pathChessBoard.java
More file actions
54 lines (44 loc) · 1.83 KB
/
ChessBoard.java
File metadata and controls
54 lines (44 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package chess;
import chess.piece.King;
import chess.piece.Piece;
import chess.piece.PieceType;
import java.util.List;
import java.util.Optional;
public class ChessBoard {
private final List<Piece> pieces;
public ChessBoard(List<Piece> pieces) {
this.pieces = pieces;
}
public void movePiece(Position startPosition, Position endPosition, Color turn){
Piece startPiece = pieces.stream().filter(piece -> piece.isSamePosition(startPosition) && piece.isSameColor(turn))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("해당 자리에는 말이 없거나 상대 말입니다."));
boolean canMove = startPiece.canMove(endPosition, findAlivePiece());
if(!canMove){
throw new IllegalArgumentException("해당 자리에 이동할 수 없습니다.");
}
Optional<Piece> endPiece = pieces.stream()
.filter(piece -> piece.isSamePosition(endPosition) && piece.isAnotherTeam(startPiece))
.findAny();
startPiece.moveTo(endPosition,findAlivePiece());
endPiece.ifPresent(Piece::changePieceToDead);
}
public boolean isKingDead(){
return pieces.stream()
.anyMatch(piece -> piece.isSamePieceType(PieceType.KING) && !piece.isAlive());
}
public Color findWinColor(){
Optional<Piece> deadKing = pieces.stream()
.filter(piece -> piece.isSamePieceType(PieceType.KING) && !piece.isAlive())
.findAny();
if(deadKing.isEmpty()){
throw new IllegalArgumentException("게임이 아직 안끝났습니다.");
}
return deadKing.get().getColor().opposite();
}
public List<Piece> findAlivePiece(){
return pieces.stream()
.filter(Piece::isAlive)
.toList();
}
}