искусственный интеллект — C ++ / SDL, ход Tic Tac Toe

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

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

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;
}

}

Последнее — моя функция показа, где я показываю Круг (игрок), если значение массива сетки = 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]
}

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

0

Решение

Пробовали ли вы ставить точки останова в различных точках, например if (event.button.button == SDL_BUTTON_LEFT && moveMade == true) и затем следует программе, чтобы узнать, действительно ли 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;
}
}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]