Есть ли способ реализовать AI на компьютере в TicTacToe? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть эта программа, которая запускает игру Tictactoe, но я бы хотел добавить AI в компьютерную функцию, чтобы было сложнее играть с

Я пробовал rand ();но он просто заставляет компьютер принять решение в любой доступный слот.

void ia_turn(){
    while (true){
        int ia_tu = (rand() % 9) +1;
        int ia_op = ia_tu - 1;

        int row = ia_op / 3;
        int column = ia_op % 3;

    char matrix_pos = matrix[row][column];
            if (matrix_pos == 'X' || matrix_pos == 'O'){ 
                continue;
            }else{
                cout << "The AI selected the position: "<<ia_tu<<endl;
                matrix[row][column] = 'O';
                break;
            }
    }
}

Я ожидаю, что движения ComputerAI заблокируют мои движения, но этого нельзя сделать с помощью функции rand ().

У меня есть функция проверки выигрышей

void checking_for_wins(){
    const char* wins_possibilities[8] = {"123","456","789","159","753","147","258","369"};

    for (int i =0;i<8;i++){
        bool win = true;
        char prev_op = '0';
        const char* win_possibility = wins_possibilities[i]; //funciona como puntero en caso de que se cumpla uno de las wins_possibilities[]

        for (int rcl = 0;rcl<dim_m;rcl++){
                char alphaChar = win_possibility[rcl];

                int intr_number = alphaChar - '0';
                int op_sp = intr_number - 1;

                int row = op_sp / dim_m;    //busca la posición de la fila
                int column = op_sp % dim_m; //busca la posición de la columna

                char current_op = matrix[row][column];

                    if (prev_op == '0'){
                        prev_op = current_op;
                    }else if (prev_op == current_op){
                        continue;
                    }else{
                        win = false;
                        break;
                    }
        }
                if (win){
                    cout << "Felicidades, ganaste!! \n";
                    cout << "El jugador "<<prev_op<<" gana, felicidades! \n";
                    exit(0);
                    break;
                }
    }
}

1 Ответ

0 голосов
/ 16 июня 2019

Лучший способ начать - написать функцию, которая ищет возможные победы (вместо того, чтобы посмотреть, есть ли три подряд, проверьте, есть ли два подряд). Затем пусть функция вернет пространство, которое было бы победой, и вместо этого ИИ переместился туда. Пример: если матрица выглядит как

X X _
_ _ _
_ O O

Имеют функцию возврата 0,2 и 2,0. Затем пусть ваш ИИ выберет это случайно.

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

Реализация может выглядеть примерно так:

#include <vector> // Vector comes from this
#include <utility> // Pair comes from this

std::vector<std::pair<bool, Point>> GetPossibleVictories()
{
    std::vector<std::pair<bool, Point>> retVal;
    // Check for two in a row Horitzontally, Vertically, and Diagonally.
    {
        if (/*IsPossibleWin*/)
        {
            retVal.push_back(std::pair<bool, Point>(isAIsVictory, Point{ X, Y }));
        }
    }
    return retVal;
}

Кроме того, я бы также исследовал более современные конструкции C ++, которые могут вам помочь, такие как контейнеры (std :: vector, std :: list, std :: set и т. Д.), Которые могут помочь вам хранить вашу матрицу в более удобной форме. манипулировать способом.

В приведенном выше примере я использую пользовательский тип (Point), который в простейшем виде можно запрограммировать так:

struct Point
{
    int X = 0;
    int Y = 0;
};

Используя структуру (или класс, в котором каждый член по умолчанию открыт), вы можете хранить координаты вашей матрицы в одном объекте. Кроме того, я использую вектор, который действует как автоматически изменяющий размер массив. Вы можете пройти каждую вещь в векторе, как это:

for(const auto& possibleWin : possibleWins) // possibleWins is the vector returned from the previous example.
{
    // possibleWin in this block will be the same value as if you used a for loop and did possibleWins[x]
}

Наконец, в приведенном выше примере используется пара, которая содержит два разных типа вещей. Может использоваться следующим образом:

std::pair<bool, Point> myPair;
myPair.first = true;
myPair.second = Point{0, 2};

Для дополнительного чтения (прокрутите вниз до примеров того, как их использовать):


Надеюсь, это даст вам некоторые идеи о том, как начать делать свой ИИ немного умнее.

...