C ++ / SDL,Tic Tac Toe转身

时间:2014-01-29 01:18:41

标签: c++ artificial-intelligence sdl tic-tac-toe

好吧所以我有这个与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移动之前再做一次动作。很抱歉,如果这太长了,但如果我能得到任何反馈意见那就太棒了。

1 个答案:

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

}