Added scoring and chance-based algorithm picking #3

Merged
Trianta merged 3 commits from dev into master 2023-10-24 00:55:31 -05:00
4 changed files with 21 additions and 2 deletions
Showing only changes of commit 5dce9b677d - Show all commits

View File

@ -36,17 +36,33 @@ namespace snakeplusplus
return lastKnownDirection; return lastKnownDirection;
} }
void AISnake::UpdateProbability(int snakeSize)
{
probabilityBFS = 1 - ((double) snakeSize) / 1000;
return;
}
// Gets a new path for the bot to follow // Gets a new path for the bot to follow
// Uses DFS algorithm // Uses DFS algorithm
void AISnake::GetNewPath(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries, const int snakeSize) void AISnake::GetNewPath(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries, const int snakeSize)
{ {
// Search for food // Search for food
/*
BFS(gameBoard, source, boundaries); BFS(gameBoard, source, boundaries);
if (gameBoard[botPathUnsanitized.top().y][botPathUnsanitized.top().x] != 'X') { if (gameBoard[botPathUnsanitized.top().y][botPathUnsanitized.top().x] != 'X') {
while (!botPathUnsanitized.empty()) { botPathUnsanitized.pop(); } while (!botPathUnsanitized.empty()) { botPathUnsanitized.pop(); }
DFS(gameBoard, source, boundaries); DFS(gameBoard, source, boundaries);
while (botPathUnsanitized.size() > 15) { botPathUnsanitized.pop(); } while (botPathUnsanitized.size() > 15) { botPathUnsanitized.pop(); }
} }
*/
// Probability-based approach for fun
double roll = ((double) GenerateRandomNumber(RAND_MAX)) / ((double) RAND_MAX);
if (roll <= probabilityBFS)
{
BFS(gameBoard, source, boundaries);
} else {
DFS(gameBoard, source, boundaries);
}
// Create path for food // Create path for food
path.push(botPathUnsanitized.top()); path.push(botPathUnsanitized.top());
botPathUnsanitized.pop(); botPathUnsanitized.pop();
@ -136,7 +152,7 @@ namespace snakeplusplus
} }
for (sf::Vector2f newLocation : localLocations) { for (sf::Vector2f newLocation : localLocations) {
try { try {
if (newLocation.x < 2 || newLocation.y < 2 if (newLocation.x < 1 || newLocation.y < 1
|| newLocation.x > boundaries.x - 2 || newLocation.x > boundaries.x - 2
|| newLocation.y > boundaries.y - 2) { || newLocation.y > boundaries.y - 2) {
continue; continue;

View File

@ -14,7 +14,9 @@ namespace snakeplusplus
AISnake(); AISnake();
void GetNewPath(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries, const int snakeSize); void GetNewPath(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries, const int snakeSize);
PlayerDirection GetInput(const sf::Vector2f* source); PlayerDirection GetInput(const sf::Vector2f* source);
void UpdateProbability(int snakeSize);
private: private:
double probabilityBFS = 1.000;
std::stack<sf::Vector2f> botPathUnsanitized; std::stack<sf::Vector2f> botPathUnsanitized;
void BFS(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries); void BFS(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries);
void DFS(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries); void DFS(const std::vector< std::vector<char> >& gameBoard, const sf::Vector2f& source, const sf::Vector2f& boundaries);

View File

@ -44,6 +44,7 @@ namespace snakeplusplus
PlaceNewSnakePart(MovePlayer()); PlaceNewSnakePart(MovePlayer());
RegenerateFood(); RegenerateFood();
currentScore = player.body.size() * 100; currentScore = player.body.size() * 100;
bot.UpdateProbability(player.body.size());
graphics.DisplayGameState(gameBoard, currentScore); graphics.DisplayGameState(gameBoard, currentScore);
} }
return; return;

View File

@ -31,7 +31,7 @@ namespace snakeplusplus
sf::RectangleShape drawObject; sf::RectangleShape drawObject;
sf::Event event; sf::Event event;
bool isWindowAlive; bool isWindowAlive;
sf::Time delay = sf::milliseconds(15); sf::Time delay = sf::milliseconds(10);
}; };
} }