Building an AI Opponent for a C++ Matchstick Game

Technical aspects of programming games, including physics, graphics, and AI.
Post Reply
User avatar
paypal56_ab6mk6y7
Site Admin
Posts: 47
Joined: Sat Oct 26, 2024 3:05 pm

Building an AI Opponent for a C++ Matchstick Game

Post by paypal56_ab6mk6y7 »

**Task**: Write a program in C++ for a matchstick game where the player competes against artificial intelligence.

**Requirements**: Use a neural network and machine learning methods to implement an intelligent opponent capable of adapting its strategy based on previous games.
User avatar
paypal56_ab6mk6y7
Site Admin
Posts: 47
Joined: Sat Oct 26, 2024 3:05 pm

Re: Building an AI Opponent for a C++ Matchstick Game

Post by paypal56_ab6mk6y7 »

Here’s a simple example of a matchstick game program in C++ with a graphical interface, using the SFML library. The program implements a basic matchstick game where the player competes against a simple artificial intelligence.

### Installing SFML

Before you begin, you need to install the SFML library. You can download it from the [official SFML website](https://www.sfml-dev.org/download.php) and set it up in your IDE (for example, Visual Studio or Code::Blocks).

### Matchstick Game Code

```cpp

Code: Select all

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <vector>
#include <string>

class MatchstickGame {
public:
    MatchstickGame(int totalMatches) : matches(totalMatches) {}

    void playerTurn(int num) {
        if (num > 0 && num <= 3 && num <= matches) {
            matches -= num;
        }
    }

    void aiTurn() {
        int num = (matches - 1) % 4;
        if (num == 0) num = 1; // AI takes at least 1 match
        matches -= num;
    }

    int getMatches() const {
        return matches;
    }

    bool isGameOver() const {
        return matches <= 0;
    }

private:
    int matches;
};

void drawMatches(sf::RenderWindow &window, int matches) {
    window.clear(sf::Color::White);
    sf::Font font;
    font.loadFromFile("arial.ttf"); // Make sure to have a font file in the project directory
    sf::Text text("Matches remaining: " + std::to_string(matches), font, 30);
    text.setFillColor(sf::Color::Black);
    text.setPosition(50, 50);
    window.draw(text);
    window.display();
}

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Matchstick Game");
    MatchstickGame game(20);
    int playerMatches = 0;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }

            if (event.type == sf::Event::TextEntered) {
                if (event.text.unicode < 128) {
                    char input = static_cast<char>(event.text.unicode);
                    if (input >= '1' && input <= '3') {
                        playerMatches = input - '0'; // Convert char to int
                        game.playerTurn(playerMatches);
                        if (game.isGameOver()) {
                            std::cout << "You lost! AI wins!" << std::endl;
                            window.close();
                        } else {
                            game.aiTurn();
                            if (game.isGameOver()) {
                                std::cout << "You win!" << std::endl;
                                window.close();
                            }
                        }
                    }
                }
            }
        }
        drawMatches(window, game.getMatches());
    }

    return 0;
}
### Code Description

1. **`MatchstickGame` Class**: Implements the game logic, including player and AI moves, and checks the game state.
2. **`drawMatches` Function**: Displays the number of remaining matches on the screen.
3. **Main Loop**: Handles events, allows the player to input the number of matches they want to take, and performs the AI's moves.
4. **Graphical Interface**: Uses SFML to display the window and text.

### Running the Program

1. Make sure you have the font file `arial.ttf` in the project directory, or change the font path in the code.
2. Compile the project, ensuring the SFML setup is correct (libraries and headers).
3. Run the program. The player can input numbers from 1 to 3 to choose matches. The game continues until one side wins.

### Notes

This code is a simple example and can be improved. You can add error handling, enhance the AI, implement graphical elements for buttons instead of text input, and expand the game with new features.
Post Reply