Хорошо, поэтому у меня есть эта игра 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]
}
Хорошо, поэтому моя проблема не связана с ИИ, так как я даже не настраивал свои функции защиты и правонарушения. Моя проблема в том, что я могу сделать еще один шаг до того, как движется ИИ. Извините, если это слишком долго, но если бы я мог получить отклик на это, это было бы здорово.
Вы пробовали поставить точки останова в разных точках, например 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;
}
}
}