pacman/exercises/25/pacman_ai
2021-10-19 11:38:09 +02:00
..
solution Update optimal_direction_simple 2021-10-19 10:12:44 +02:00
README.md Update README.md 2021-10-19 11:38:09 +02:00

< Back

Exercise: PacMan AI

Let's implement a naive AI for PacMan.

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 allowed to turn there. And if PacMan is moving in a direction, and a ghost enters his path, then PacMan will reverse.

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.

Exercise

isValidMove

Implement PacManAI::isValidMove and test your implementation with the test in testPacmanAI.cpp called "Is valid move"

To run the tests through CMake change the last line in test/CMakeLists.txt to:

add_test(NAME pacman_tests COMMAND pacman_tests)
bool PacManAI::isValidMove(const Move & move) {
  return false;
}
Hint 1

Use isWalkableForPacMan to make sure PacMan is not walking in ways that are not legal

Hint 2

Use oppositeDirection to make sure PacMan doesn't get stuck toggeling back and forth

optimalDirection

Implement PacManAI::optimalDirection and test your implementation with the test in testPacmanAI.cpp called "Is optimal direction"

Direction PacManAI::optimalDirection(const std::array<Move, 4> & moves) {
  return Direction::NONE;
}
Hint

You can use std::min_element to find the closest pellet

pelletClosestToPacman

Implement PacManAI::pelletClosestToPacman and test your implementation with the test in testPacmanAI.cpp called "Find pellet closest to PacMan"

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.

GridPosition PacManAI::pelletClosestToPacman(GridPosition pacmanGridPosition,
                                             std::vector<GridPosition> & pellets) {
  return {0, 0};
}
Hint 1

Use the positionDistance function to find the distance to PacMan.

Hint 2

Use the std::sort function to sort the vector.

Hint 3

std::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.

Advanced

For people who want to create a fancier AI, if you want to introduce some randomness, you can look at this SFML function https://www.sfml-dev.org/tutorials/1.6/system-random.php - you will need to include #include <SFML/Randomizer.hpp>