【问题标题】:C++/SDL, Tic Tac Toe turn takingC++/SDL,井字游戏轮流
【发布时间】: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


【解决方案1】:

您是否尝试过在 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;
        }
    }

}

【讨论】:

  • 我在 if 语句中有 moveMade == true 。这就是我一直在做的,但它仍然不起作用。不过我会使用这个 for 循环的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多