Added scoring and chance-based algorithm picking #3
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user