pacman/exercises/25/pacman_ai/README.md

91 lines
2.7 KiB
Markdown
Raw Normal View History

2021-10-05 11:48:15 +00:00
[< Back](../README.md)
2021-10-05 11:44:51 +00:00
# Exercise: PacMan AI
2021-10-05 13:30:50 +00:00
Let's implement a naive AI for PacMan.
2021-10-05 13:30:50 +00:00
## Background: PacMan Moves
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-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.
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 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
```cpp
GridPosition PacManAI::pelletClosestToPacman(GridPosition pacmanGridPosition,
std::vector<GridPosition> & pellets) {
return {0, 0};
}
```
<details>
<summary>Hint 1</summary>
2021-10-05 14:12:37 +00:00
Use the `positionDistance` function to find the distance to PacMan.
</details>
<details>
<summary>Hint 2</summary>
2021-10-05 14:12:37 +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
</details>
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"_
```cpp
bool PacManAI::isValidMove(const Move & move) {
return false;
}
```
<details>
<summary>Hint</summary>
2021-10-19 07:35:33 +00:00
Use [isWalkableForPacMan](../../../lib/Board.cpp) to make sure PacMan is not walking in ways that are not legal
2021-10-19 07:31:42 +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"_
```cpp
Direction PacManAI::optimalDirection(const std::array<Move, 4> & moves) {
return Direction::NONE;
2021-10-05 14:25:35 +00:00
}
```
<details>
<summary>Hint</summary>
2021-10-19 07:33:20 +00:00
You can use std::min_element to find the closest pellet
</details>
2021-10-05 14:25:35 +00:00