-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMovesMap.cpp
81 lines (66 loc) · 2.52 KB
/
MovesMap.cpp
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
#include "MovesMap.hpp"
MovesMap::MovesMap(Board const &board) : board_{board} {
auto rowCount{board_.size()};
for (auto row{0}; row < rowCount; row++) {
auto columnCount{board_.at(row).size()};
for (auto column{0}; column < columnCount; column++) {
auto validShortMoves = shortMove(row, column);
auto validLongMoves = longMove(row, column);
movesMap_.insert({Position(row, column), {validShortMoves, validLongMoves}});
}
}
}
std::vector<Position> MovesMap::shortMove(int row, int column) {
std::vector<Position> validMoves;
pushBackValidMove(row + 1, column + 1, validMoves);
pushBackValidMove(row - 1, column + 1, validMoves);
pushBackValidMove(row + 1, column - 1, validMoves);
pushBackValidMove(row - 1, column - 1, validMoves);
return validMoves;
}
std::vector<Position> MovesMap::longMove(int row, int column) {
std::vector<Position> validMoves;
pushBackValidMove(row - 2, column - 1, validMoves);
pushBackValidMove(row - 2, column + 1, validMoves);
pushBackValidMove(row - 1, column + 2, validMoves);
pushBackValidMove(row + 1, column + 2, validMoves);
pushBackValidMove(row + 2, column + 1, validMoves);
pushBackValidMove(row + 2, column - 1, validMoves);
pushBackValidMove(row + 1, column - 2, validMoves);
pushBackValidMove(row - 1, column - 2, validMoves);
return validMoves;
}
char MovesMap::getValue(int row, int column) {
if (row >= 0 && row < board_.size()) {
auto rowVector{board_.at(row)};
if (column >= 0 && column < rowVector.size()) {
auto value{rowVector.at(column)};
return value;
}
}
return EMPTY_CELL;
}
void MovesMap::pushBackValidMove(int row, int column, std::vector<Position>& validMoves) {
auto value{getValue(row, column)};
if (value != EMPTY_CELL) {
validMoves.emplace_back(Position(row, column));
}
}
std::optional<Position> MovesMap::getPosition(char c) const {
auto rowCount{board_.size()};
for (auto row = 0; row < rowCount; row++) {
auto columnCount{board_.at(row).size()};
for (auto column = 0; column < columnCount; column++) {
if (board_.at(row).at(column) == c) {
return Position(row, column);
}
}
}
return {};
}
std::vector <Position> MovesMap::getShortMoves(Position pos) const {
return movesMap_.at(pos).at(0);
}
std::vector <Position> MovesMap::getLongMoves(Position pos) const {
return movesMap_.at(pos).at(1);
}