好吧所以我有这个与SDL和C ++一起制作的tic tac toe游戏。我试图在游戏中实现AI。我没有设置AI的问题,但我有一个问题,你可以轮流。我的问题是,当我移动时,我可以在AI移动之前移动多次。我想要它,所以我可以做出我的举动,我不能再采取行动,直到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,这意味着它在屏幕上显示为圆圈。我还确保AI在允许我点击之前做了一个动作。
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函数,如果网格数组值= 1则显示Circle(播放器),如果网格值= 2,则显示X(AI)。
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]
}
好吧所以我的问题与人工智能处理没有关系,因为我甚至没有建立我的防守和进攻功能。我的问题是我可以在AI移动之前再做一次动作。很抱歉,如果这太长了,但如果我能得到任何反馈意见那就太棒了。
答案 0 :(得分:1)
您是否尝试过将断点放在各个点上,例如if(event.button.button == SDL_BUTTON_LEFT&amp;&amp; moveMade == true),然后通过查看moveMade是否实际变为false来跟踪程序? / p>
您还应该将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;
}
}
}