2020-11-28 13:10:25 +00:00
|
|
|
#include "Board.hpp"
|
2020-11-27 13:10:09 +00:00
|
|
|
|
|
|
|
// Legend
|
|
|
|
// 0 - wall
|
|
|
|
// 1 - pellet
|
|
|
|
// 2 - nothing
|
|
|
|
// 3 - door
|
|
|
|
// 4 - superpower
|
2021-06-24 09:40:49 +00:00
|
|
|
// 5 - pen doors
|
2020-11-27 13:10:09 +00:00
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
std::array<std::array<int, COLUMNS>, ROWS> Board::board = {{
|
2021-06-24 11:32:52 +00:00
|
|
|
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
|
2021-06-16 11:14:47 +00:00
|
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, // 1
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 2
|
|
|
|
{ 0, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0 }, // 3
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 4
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, // 5
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 6
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 7
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, // 8
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 9
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 10
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 11
|
2021-06-24 09:40:49 +00:00
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 5, 5, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 12
|
2021-06-25 09:06:50 +00:00
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 5, 5, 5, 5, 5, 5, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 13
|
|
|
|
{ 3, 2, 2, 2, 2, 2, 1, 2, 2, 2, 0, 5, 5, 5, 5, 5, 5, 0, 2, 2, 2, 1, 2, 2, 2, 2, 2, 3 }, // 14
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 5, 5, 5, 5, 5, 5, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 15
|
2021-06-16 11:14:47 +00:00
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 16
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 17
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 18
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 19
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, // 20
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 21
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 }, // 22
|
|
|
|
{ 0, 4, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 4, 0 }, // 23
|
|
|
|
{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0 }, // 24
|
|
|
|
{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0 }, // 25
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, // 26
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, // 27
|
|
|
|
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, // 28
|
|
|
|
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, // 29
|
|
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 30
|
2021-07-01 12:33:59 +00:00
|
|
|
}};
|
2020-11-27 13:10:09 +00:00
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isWalkableForPacMan(Position point, float d, Direction direction) {
|
2021-06-24 11:32:52 +00:00
|
|
|
return isWalkable(point, d, direction, true);
|
2021-06-24 09:40:49 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isWalkableForGhost(Position point, float d, Direction direction) {
|
2021-06-24 11:32:52 +00:00
|
|
|
return isWalkable(point, d, direction, false);
|
2021-06-24 09:40:49 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isWalkable(Position point) {
|
|
|
|
return board[int(point.y)][int(point.x)] != int(Cell::wall);
|
2021-06-25 09:06:50 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isWalkableForGost(Position point, Position origin, bool isEyes) {
|
2021-06-28 10:42:21 +00:00
|
|
|
return isWalkable(point) && (isEyes || (isInPen(origin) || !isInPen(point)));
|
2021-06-25 09:06:50 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isInPen(Position point) {
|
|
|
|
return board[int(point.y)][int(point.x)] == int(Cell::pen);
|
2021-06-25 09:06:50 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
bool Board::isWalkable(Position point, float position_delta, Direction direction, bool pacman) {
|
2021-06-16 10:52:04 +00:00
|
|
|
if (point.x <= 0 || point.x >= COLUMNS - 1)
|
|
|
|
return true;
|
2021-06-15 23:35:36 +00:00
|
|
|
|
2021-06-24 09:40:49 +00:00
|
|
|
auto cellAtPosition = [&](Position point, float position_delta, Direction direction) {
|
2021-06-24 11:32:52 +00:00
|
|
|
switch (direction) {
|
|
|
|
case Direction::LEFT:
|
2021-07-01 12:33:59 +00:00
|
|
|
return board[int(point.y)][int(point.x - position_delta)];
|
2021-06-24 11:32:52 +00:00
|
|
|
case Direction::RIGHT:
|
2021-07-01 12:33:59 +00:00
|
|
|
return board[int(point.y)][int(point.x) + 1];
|
2021-06-24 11:32:52 +00:00
|
|
|
case Direction::UP:
|
2021-07-01 12:33:59 +00:00
|
|
|
return board[int(point.y - position_delta)][int(point.x)];
|
2021-06-24 11:32:52 +00:00
|
|
|
case Direction::DOWN:
|
2021-07-01 12:33:59 +00:00
|
|
|
return board[int(point.y) + 1][int(point.x)];
|
2021-06-24 11:32:52 +00:00
|
|
|
case Direction::NONE:
|
|
|
|
default:
|
2021-07-01 12:33:59 +00:00
|
|
|
return int(Cell::wall);
|
2021-06-24 11:32:52 +00:00
|
|
|
}
|
2021-06-24 09:40:49 +00:00
|
|
|
};
|
2021-06-24 11:32:52 +00:00
|
|
|
Cell cell = Cell(cellAtPosition(point, position_delta, direction));
|
2021-06-25 09:06:50 +00:00
|
|
|
return pacman ? cell != Cell::wall : cell != Cell::wall && cell != Cell::pen;
|
2020-11-27 13:10:09 +00:00
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
std::vector<PositionInt> Board::initialPelletPositions() {
|
2021-06-20 16:52:34 +00:00
|
|
|
std::vector<PositionInt> positions;
|
2021-07-01 12:33:59 +00:00
|
|
|
for (int row = 0; row < ROWS; row++) {
|
|
|
|
for (int column = 0; column < COLUMNS; column++) {
|
|
|
|
if (board[row][column] == int(Cell::pellet))
|
2021-06-16 10:52:04 +00:00
|
|
|
positions.push_back({ column, row });
|
2020-11-27 13:10:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return positions;
|
|
|
|
}
|
|
|
|
|
2021-07-01 12:33:59 +00:00
|
|
|
std::vector<PositionInt> Board::initialSuperPelletPositions() {
|
2021-06-20 16:52:34 +00:00
|
|
|
std::vector<PositionInt> positions;
|
2021-07-01 12:33:59 +00:00
|
|
|
for (int row = 0; row < ROWS; row++) {
|
|
|
|
for (int column = 0; column < COLUMNS; column++) {
|
|
|
|
if (board[row][column] == int(Cell::power_pellet))
|
2021-06-16 10:52:04 +00:00
|
|
|
positions.push_back({ column, row });
|
2020-11-27 13:10:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return positions;
|
|
|
|
}
|