From c6d13a046a989b35e1cc9621701d3e1d4d8b3772 Mon Sep 17 00:00:00 2001 From: Corentin Jabot Date: Tue, 5 Oct 2021 13:42:56 +0200 Subject: [PATCH] Add some AI tests --- lib/PacManAI.cpp | 12 ++++++------ lib/include/PacManAI.hpp | 2 +- test/testPacmanAI.cpp | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 test/testPacmanAI.cpp diff --git a/lib/PacManAI.cpp b/lib/PacManAI.cpp index 4844c08..1e4d3ad 100644 --- a/lib/PacManAI.cpp +++ b/lib/PacManAI.cpp @@ -15,15 +15,15 @@ Direction PacManAI::suggestedDirection() const { } GridPosition PacManAI::pelletClosestToPacman(GridPosition pacmanGridPosition, - const Pellets & pellets) { - auto pelletPositions = pellets.allPellets(); + std::vector & pellets) { + auto pelletSort = [&pacmanGridPosition](GridPosition pelletA, GridPosition pelletB) { double distanceA = positionDistance(pacmanGridPosition, pelletA); double distanceB = positionDistance(pacmanGridPosition, pelletB); return distanceA < distanceB; }; - std::sort(pelletPositions.begin(), pelletPositions.end(), pelletSort); - return pelletPositions[0]; + std::sort(pellets.begin(), pellets.end(), pelletSort); + return pellets[0]; } bool PacManAI::isValidMove(const Move & move) { @@ -56,12 +56,12 @@ void PacManAI::update(const PacMan & pacMan, const Pellets & pellets) { return; } - const auto & pelletPositions = pellets.allPellets(); + auto pelletPositions = pellets.allPellets(); if (pelletPositions.empty()) { return; } - const GridPosition targetPos = pelletClosestToPacman(pacManGridPos, pellets); + const GridPosition targetPos = pelletClosestToPacman(pacManGridPos, pelletPositions); const GridPosition currentPosition = pacMan.positionInGrid(); const auto [x, y] = currentPosition; diff --git a/lib/include/PacManAI.hpp b/lib/include/PacManAI.hpp index b42be8d..3879108 100644 --- a/lib/include/PacManAI.hpp +++ b/lib/include/PacManAI.hpp @@ -22,7 +22,7 @@ public: void update(const PacMan & pacMan, const Pellets & pellets); Direction suggestedDirection() const; GridPosition pelletClosestToPacman(GridPosition pacmanGridPosition, - const Pellets & pellets); + std::vector & pellets); bool isValidMove(const Move & move); Direction optimalDirection(const std::array & moves); void reset(); diff --git a/test/testPacmanAI.cpp b/test/testPacmanAI.cpp new file mode 100644 index 0000000..dd10f31 --- /dev/null +++ b/test/testPacmanAI.cpp @@ -0,0 +1,35 @@ +#include +#include + +TEST_CASE("find pellet closest to pacman", "[AI]") { + using namespace pacman; + PacManAI AI; + using TestData = std::tuple, GridPosition>; + auto data = GENERATE( + TestData{{5, 5}, {{5, 6}}, {5, 6}}, + TestData{{5, 5}, {{5, 5}}, {5, 5}}, + TestData{{5, 5}, {{0, 0}, {5, 6}}, {5, 6}}, + TestData{{5, 5}, {{6, 5}, {5, 6}}, {6, 5}}, + TestData{{5, 5}, {{6, 6}, {5, 6}}, {5, 6}} + ); + + CHECK(AI.pelletClosestToPacman(std::get<0>(data), std::get<1>(data)) == std::get<2>(data)); +} + +TEST_CASE("Is valid move", "[AI]") { + using namespace pacman; + using TestData = std::tuple; + auto data = GENERATE( + TestData{{Direction::RIGHT, {13, 23}}, true}, + TestData{{Direction::LEFT, {13, 23}}, false}, // opposite direction + TestData{{Direction::RIGHT, {13, 22}}, false} // wall + ); + + PacManAI AI; + CHECK(AI.isValidMove(std::get<0>(data)) == std::get<1>(data)); +} + +TEST_CASE("is optimal direction", "[AI]") { + using namespace pacman; + using TestData = std::tuple, std::size_t>; +}