C ++ / SDL, ход Tic Tac Toe

0

Хорошо, поэтому у меня есть эта игра tic tac toe, которую я делаю с SDL и C++. Я пытаюсь реализовать AI в игре. У меня нет проблем с настройкой ИИ, но у меня есть проблема, когда вы можете по очереди. Моя проблема в том, что когда я делаю свой ход, я могу просто перемещаться столько раз, сколько хочу, прежде чем движется ИИ. Я хочу, чтобы я сделал свой ход, и я не могу сделать свой ход еще до того, как ИИ сделает ход. Независимо от того, что я делаю, кажется, что поворот не работает должным образом.

Это заголовок класса

class Buttons
{
private:
    SDL_Rect squares[8];

public:
    Buttons();
    void handle_input();
    void load_Squares(SDL_Rect sqRects, SDL_Texture* squarTexs);
    void show_Squares();
    void AI_move();
    int grid[9];
    bool moveMade = true;
};

Здесь я проверяю ввод мыши, и в зависимости от местоположения во время нажатия левой кнопки он устанавливает соответствующее значение сетки равным 1, что означает, что он отображается в виде круга на экране. Я также удостоверяюсь, что ИИ сделал шаг, прежде чем он позволяет мне щелкнуть.

void Buttons::handle_input()
{
    double mouseX = 0, mouseY = 0;

    if((event.type == SDL_MOUSEBUTTONDOWN))
    {
        //If left mouse button was clicked and AI has made a move
        if(event.button.button == SDL_BUTTON_LEFT && moveMade == true)
        {
            //Get mouse location
            mouseX = event.button.x;
            mouseY = event.button.y;

            //If mouse location is in particular square, set according grid value to 1
            if((mouseX >= 0) && (mouseX < SCREEN_WIDTH / 3) && (mouseY >= 0) && (mouseY < SCREEN_HEIGHT / 3) && (grid[0] == 0))
            {
                grid[0] = 1;
                moveMade = false;
            }
            //Basically does this for all other 9 grids

Вот моя функция AI, где я проверяю, чтобы переменная moveMade = false. Каждый раз, когда я делаю движение во входной функции выше, он устанавливает moveMade в false, что означает, что он должен получить доступ к этой функции, и только до тех пор, пока он не завершит эту функцию AI_move, я должен снова сделать ход, потому что moveMade установлен равным к истине.

void Buttons::AI_move()
{

    if(moveMade == false)
    {
        AI_block(&moveMade);
        AI_complete(&moveMade);
        AI_rand(&moveMade);
        moveMade = true;
    }

}

Последняя - моя функция show, где я показываю Circle (player), если значение сетки = 1, и я показываю X (AI), если значение сетки = 2.

void Buttons::show_Squares()
{
    switch(grid[0])
    {
    case 1:
        load_Squares(squares[0], circleTexture); break;
    case 2:
        load_Squares(squares[0], xTexture); break;
    }

    switch(grid[1])
    {
    //Does this all the way to grid[8]
}

Хорошо, поэтому моя проблема не связана с ИИ, так как я даже не настраивал свои функции защиты и правонарушения. Моя проблема в том, что я могу сделать еще один шаг до того, как движется ИИ. Извините, если это слишком долго, но если бы я мог получить отклик на это, это было бы здорово.

  • 1
    Да, это слишком долго. Смотрите sscce.org . Никто не собирается пробираться через все это.
  • 0
    Я только отредактировал это и сделал это намного короче
Показать ещё 2 комментария
Теги:
sdl
artificial-intelligence
tic-tac-toe

1 ответ

1

Вы пробовали поставить точки останова в разных точках, например if (event.button.button == SDL_BUTTON_LEFT && moveMade == true), а затем следовать программе через see, если moveMade когда-либо фактически изменено на false?

Вы также должны посмотреть на изменение show_Squares() в цикле, так как много повторяющихся кодов с использованием инкрементированных индексов. Что-то вроде этого:

void Buttons::show_Squares()
{
    size_t array_size = sizeof(squares) / sizeof(int); //gets the number of elements in the array

    for(size_t i = 0; i < array_size; i++)
    {
        switch(grid[i])
        {
        case 1:
            load_Squares(squares[i], circleTexture); break;
        case 2:
            load_Squares(squares[i], xTexture); break;
        }
    }

}
  • 0
    У меня есть moveMade == true в этом операторе if. Это то, что я делал, и это все еще не работает. Я буду использовать это для идеи цикла, хотя!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню