-
Notifications
You must be signed in to change notification settings - Fork 166
Expand file tree
/
Copy pathBoard.java
More file actions
102 lines (81 loc) · 3.2 KB
/
Board.java
File metadata and controls
102 lines (81 loc) · 3.2 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package domain;
import domain.pieces.Piece;
import dto.BoardStatusDto;
import dto.PositionStatusDto;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Board implements ExistBoard {
private final Map<Position, Piece> board = new HashMap<>();
public void generatePiecesBy(Camp camp, ElephantFormation elephantFormation) {
PieceGenerator pieceGenerator = new PieceGenerator();
Map<Position, Piece> pieces = pieceGenerator.generatePieces(camp, elephantFormation);
board.putAll(pieces);
}
public void locatePiece(Position position, Piece piece) {
if (!isExist(position)) {
board.put(position, piece);
return;
}
if (getPieceFrom(position).isSameCamp(piece)) {
throw new IllegalArgumentException("[ERROR] 같은 팀은 잡을 수 없습니다!");
}
board.put(position, piece);
}
public Piece getPieceFrom(Position position) {
return board.get(position);
}
@Override
public boolean isExist(Position position) {
return board.containsKey(position);
}
public void move(Position fromPosition, Position toPosition) {
if (fromPosition.equals(toPosition)) {
throw new IllegalArgumentException("[ERROR] 제자리 이동은 불가능합니다.");
}
Piece piece = board.get(fromPosition);
boolean canMove = piece.canMove(fromPosition, toPosition, this);
if (canMove) {
locatePiece(toPosition, piece);
board.remove(fromPosition);
return;
}
throw new IllegalArgumentException("[ERROR] 이동할 수 없습니다");
}
@Override
public boolean isDifferentPieceType(Position position, Piece piece) {
if (!board.containsKey(position)) {
return true;
}
return board.get(position).isDifferentPieceType(piece);
}
public BoardStatusDto getBoardStatus() {
List<List<PositionStatusDto>> boardStatusDto = new ArrayList<>();
for (int y = Position.MIN_Y_VALUE; y <= Position.MAX_Y_VALUE; y++) {
List<PositionStatusDto> xPositionStatus = new ArrayList<>();
for (int x = Position.MIN_X_VALUE; x <= Position.MAX_X_VALUE; x++) {
Position position = new Position(x, y);
PositionStatusDto positionStatusDto = getPositionStatusDto(position);
xPositionStatus.add(positionStatusDto);
}
boardStatusDto.add(xPositionStatus);
}
return new BoardStatusDto(boardStatusDto);
}
private PositionStatusDto getPositionStatusDto(Position position) {
if (!board.containsKey(position)) {
return new PositionStatusDto(position, PieceType.NONE, Camp.CHO);
}
Piece piece = board.get(position);
PieceType pieceType = piece.getPieceType();
Camp camp = piece.getCamp();
return new PositionStatusDto(position, pieceType, camp);
}
public boolean isPieceOfCamp(Position position, Camp camp) {
if (!board.containsKey(position)) {
return false;
}
return board.get(position).isSameCamp(camp);
}
}