2021-10-05 11:48:15 +00:00
|
|
|
[< Back](../README.md)
|
2021-10-05 11:44:51 +00:00
|
|
|
|
2021-09-13 13:07:04 +00:00
|
|
|
# Exercise: PacMan AI
|
|
|
|
|
2021-10-05 13:30:50 +00:00
|
|
|
Let's implement a naive AI for PacMan.
|
2021-09-13 13:07:04 +00:00
|
|
|
|
2021-10-05 13:30:50 +00:00
|
|
|
## Background: PacMan Moves
|
|
|
|
|
2021-10-05 13:46:44 +00:00
|
|
|
At each intersection, check if there is a ghost directly inline with that path. If the path is free of ghosts, you are
|
2021-10-05 14:15:41 +00:00
|
|
|
allowed to turn there. And if PacMan is moving in a direction, and a ghost enters his path, then PacMan will reverse.
|
2021-09-13 13:07:04 +00:00
|
|
|
|
2021-10-05 14:15:41 +00:00
|
|
|
For example if PacMan is at an intersection and can go either right or up, and there is a ghost in the path going right,
|
|
|
|
then PacMan will go up. Then while PacMan is going up, a ghost enters that path, PacMan will go back.
|
2021-09-13 13:07:04 +00:00
|
|
|
|
|
|
|
You only need to worry about the grid itself and any ghosts on the North/South/East/West axis of PacMan.
|
2021-10-05 13:30:50 +00:00
|
|
|
|
|
|
|
## Exercise
|
|
|
|
|
2021-10-05 14:12:37 +00:00
|
|
|
### Part 1
|
2021-10-05 13:46:44 +00:00
|
|
|
|
2021-10-05 14:12:37 +00:00
|
|
|
Implement [PacManAI::pelletClosestToPacman](../../../lib/PacManAI.cpp) and test your implementation with the test
|
2021-10-05 14:15:41 +00:00
|
|
|
in [testPacmanAI.cpp](../../../test/testPacmanAI.cpp) called _"Find pellet closest to PacMan"_
|
2021-10-05 14:12:37 +00:00
|
|
|
|
|
|
|
The function should return the position of the pellet that is "closest" to PacMan. One implementation could be to sort
|
|
|
|
the vector of pellets by the distance they have to PacMan, and then return the first one.
|
2021-10-05 14:00:40 +00:00
|
|
|
|
2021-10-05 13:46:44 +00:00
|
|
|
```cpp
|
|
|
|
GridPosition PacManAI::pelletClosestToPacman(GridPosition pacmanGridPosition,
|
|
|
|
std::vector<GridPosition> & pellets) {
|
|
|
|
return {0, 0};
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
<details>
|
|
|
|
<summary>Hint 1</summary>
|
2021-10-05 14:12:37 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
Use the `positionDistance` function to find the distance to PacMan.
|
2021-10-05 13:46:44 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
</details>
|
|
|
|
<details>
|
|
|
|
<summary>Hint 2</summary>
|
2021-10-05 14:12:37 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
Use the [std::sort](https://en.cppreference.com/w/cpp/algorithm/sort) function to sort the vector.
|
2021-10-05 14:12:37 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
</details>
|
2021-10-05 13:46:44 +00:00
|
|
|
|
2021-10-05 14:25:35 +00:00
|
|
|
</details>
|
|
|
|
<details>
|
|
|
|
<summary>Hint 3</summary>
|
|
|
|
|
|
|
|
[std::sort](https://en.cppreference.com/w/cpp/algorithm/sort) third parameter should be a lambda taking 2 `GridPosition` as parameter,
|
|
|
|
and return true if the first parameter is closer from PacMan than the second.
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
2021-10-05 14:12:37 +00:00
|
|
|
### Part 2
|
|
|
|
|
|
|
|
Implement [PacManAI::isValidMove](../../../lib/PacManAI.cpp) and test your implementation with the test
|
|
|
|
in [testPacmanAI.cpp](../../../test/testPacmanAI.cpp) called _"Is valid move"_
|
|
|
|
|
2021-10-05 13:46:44 +00:00
|
|
|
```cpp
|
|
|
|
bool PacManAI::isValidMove(const Move & move) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
<details>
|
|
|
|
<summary>Hint</summary>
|
2021-10-19 07:36:55 +00:00
|
|
|
Use isWalkableForPacMan in Board.cpp to make sure PacMan is not walking in ways that are not legal
|
2021-10-19 07:31:42 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
</details>
|
|
|
|
|
2021-10-05 14:12:37 +00:00
|
|
|
### Part 3
|
|
|
|
|
|
|
|
Implement [PacManAI::optimalDirection](../../../lib/PacManAI.cpp) and test your implementation with the test
|
|
|
|
in [testPacmanAI.cpp](../../../test/testPacmanAI.cpp) called _"Is optimal direction"_
|
|
|
|
|
2021-10-05 13:46:44 +00:00
|
|
|
```cpp
|
|
|
|
Direction PacManAI::optimalDirection(const std::array<Move, 4> & moves) {
|
|
|
|
return Direction::NONE;
|
2021-10-05 14:25:35 +00:00
|
|
|
}
|
2021-10-05 13:46:44 +00:00
|
|
|
```
|
2021-10-05 14:10:24 +00:00
|
|
|
|
|
|
|
<details>
|
|
|
|
<summary>Hint</summary>
|
2021-10-19 07:38:59 +00:00
|
|
|
|
2021-10-19 07:38:08 +00:00
|
|
|
You can use [std::min_element](https://en.cppreference.com/w/cpp/algorithm/min_element) to find the closest pellet
|
2021-10-19 07:33:20 +00:00
|
|
|
|
2021-10-05 14:10:24 +00:00
|
|
|
</details>
|
|
|
|
|
2021-10-05 14:25:35 +00:00
|
|
|
|