【发布时间】:2014-01-29 01:18:40
【问题描述】:
好的,所以我有了这个用 SDL 和 C++ 制作的井字游戏。我正在尝试将 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;
}
}
最后是我的显示函数,如果网格数组值 = 1,我会显示一个 Circle(player),如果网格值 = 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 处理无关,因为我什至还没有设置我的防守和进攻功能。我的问题是我可以在 AI 移动之前再进行一次移动。对不起,如果这太长了,但如果我能得到任何反馈,那就太好了。
【问题讨论】:
-
是的,它太长了见sscce.org。没有人会经历这一切。
-
我刚刚编辑并缩短了很多
-
cout
-
你在哪里打电话给
AI_move()和handle_input()?
标签: c++ artificial-intelligence sdl tic-tac-toe