C++ Connect 4 检查下一步错误

     2023-02-22     107

关键词:

【中文标题】C++ Connect 4 检查下一步错误【英文标题】:C++ Connect 4 Checking Next Step Error 【发布时间】:2012-12-04 06:39:45 【问题描述】:

我正在编写一个使用 minimax 的 Connect 4 游戏,但我的下一步检查功能有时会给我带来意想不到的结果。你能告诉我我的算法是否正确吗?

例如,如果我的电路板看起来像这样

0000000 
0000000
0000000
0000000
1000000
2002120

它将返回第 0 列作为玩家 2 的真值。

bool Board::check2(int player, int& bestMove)

    for (int i=0; i<WIDTH; i++)
    
        if(addToColumn(i, player))
        



            if (checkNext(2, i, player))
            
                bestMove=i;
                removeFromColumn(i, player);
                return true;
            
            removeFromColumn(i, player);
        

    
    return false;



    bool Board::checkNextVertical(int size, int column, int player1)
    
        int counter=0;
        int player2;

        if (player1==1)
        
            player2=2;
        
        else
            player2=1;

        for (int i=0 ; i<DEPTH; i++)
        
            if (arrBoard[column][i]==player1)
            
                counter++;
            

            if (arrBoard[column][i]==player2)
            
                return false;
            
            if (counter==size)
            
                return true;
            



        
        return false;
    

    bool Board::checkNextHorizontal(int size, int column, int player1)
    
        int counter=0;
        int player2;

        if (player1==1)
        
            player2=2;
        
        else
            player2=1;

        for (int i=0 ; i<DEPTH; i++)
        
            if (arrBoard[i][column]==player1)
            

                for (int j = 0; j<WIDTH; j++)
                
                    if (arrBoard[i][j]==player1)
                    
                        counter++;
                    

                    if (arrBoard[i][j]!=player1)
                    
                        counter=0;
                    
                    if (counter==size)
                    
                        return true;
                    


                
            
    
        return false;

    

    bool Board::checkNext(int size, int column, int player)
    
        if (checkNextVertical(size, column, player))
        
            //  printBoard();
            return true;
        


        if (checkNextHorizontal(size, column, player))
        
          //  printBoard();
            return true;
        



        return false;
    

【问题讨论】:

您可以在调试器中逐行检查代码,检查变量的值以及逻辑(即在调试器中执行所有条件以查看它们的行为是否符合您的预期)。 【参考方案1】:

欢迎来到论坛。

您发布的代码存在一些问题:

您的checkNextVertical 函数似乎正在尝试水平检查,而您的checkNextHorizontal 函数似乎试图同时进行水平和垂直检查。

如果您注意到您同时使用了arrBoard[column][i]arrBoard[i][column]。我相信你会同意其中只有一个是正确的。了解哪个是正确的很重要,否则您的代码最终会尝试访问数组中无效的位置,并且您会得到意外的行为,例如 checkNextHorizontal 函数中的 j 循环当前正在执行这个。

它应该用作array[y / depth / row][x / width / column] - 或任何你会记得的东西。

就个人而言,这段代码看起来很混乱:

    int player2;

    if (player1==1)
    
        player2=2;
    
    else
        player2=1;

player2=1 似乎试图将方形钉子推入圆孔中。您能否使用int player 并将其设置为12 以使其更易于阅读?

我完全同意 Joachim 的观点 - 如果您遇到这类问题,最好用一些数据填充数组,然后使用调试器逐步执行您的代码并检查正在访问的数据是否是您的数据期望被访问。

另外,由于它是一个 connect4 游戏,我假设您在某些时候知道最后一步是在哪一列进行的,在这种情况下,您可以使用此函数来检查它是否是一个获胜的举动。你只需要告诉它最后一步是哪一列,以及获胜所需的“大小”。如果您确实使用它,我仍然建议您使用调试器单步执行它,以便您了解数组访问。注意:您的代码没有对角检查-所以也没有。如果你想这样做,需要一些额外的逻辑:

bool winningMove(int column, int size)

  bool winnerWinnerChickenDinner = false;

  int player = 0;
  int row    = 0;

  // Who was the last player to go in this column
  // i.e. find the top non-zero entry
  for (int i = 0; i < DEPTH; i++)
  
    if (arrBoard[i][column] != 0)
    
      player = arrBoard[i][column];
      row = i;
      break;
    
  

  // If we found a player, check if it was a winning move
  if (player != 0)
  
    int count = 0;

    // Loop twice, first horizontally, then vertically
    for (int i = 0; i < 2 && !winnerWinnerChickenDinner; i++)
    
      bool horizontal = (i == 0);

      for (int j = 0; j < (horizontal ? WIDTH : DEPTH); j++)
      
        // Check if we have 'size' consecutive entries by the same player
        // (When we check horizontally, use arrBoard[row][j]    to check the row)
        // (When we check vertically,   use arrBoard[j][column] to check the column)
        if (arrBoard[(horizontal ? row : j)][(horizontal ? j : column)] == player)
        
          if (++count == size)
          
            winnerWinnerChickenDinner = true;
            break;
          
        
        else
        
          count = 0;
        
      
    
  

  return winnerWinnerChickenDinner;

老游戏是最好的 - Connect4 很棒,祝你好运。

【讨论】:

用c++如何读取图片

...捷方式,然后单击以打开该软件,如下图所示,然后进入下一步。2、其次,完成上述步骤后,已经进入了取模软件,单击“载入图片”按钮以添加图片,如下图所示,然后进入下一步。3、接着,完成上述步骤后,选择要添加的... 查看详情

离散傅里叶变换 C++ - 下一步做啥?

】离散傅里叶变换C++-下一步做啥?【英文标题】:DiscreteFourierTransformC++-Whattodonext?离散傅里叶变换C++-下一步做什么?【发布时间】:2014-09-1212:41:34【问题描述】:我正在使用fftw库对从视频录制中接收到的音频信号执行DFT。这是... 查看详情

如何安装sqlserver2012

...(命名实例选择“默认”即可),点击“下一步”按钮。检查磁盘空间,点击“下一步”按钮。在“数据库引擎配置”界面,点击“添加当前用户”按钮,点击“下一步”按钮。继续点击“添加当前用户”按钮,点击“下一步”... 查看详情

Accordion Form:在启用下一步之前检查必填字段

】AccordionForm:在启用下一步之前检查必填字段【英文标题】:AccordionForm:Checkrequiredfieldsbeforeenablingnextstep【发布时间】:2021-08-2515:08:16【问题描述】:我有一个手风琴风格的表格。每一步都在自己的手风琴中。https://mci.bitpix.co.uk/... 查看详情

错误信息:无法连接:sqlserver不可用或不存在。

...下图所示。这样,问题就解决了。   参考技术A1-检查连接的实例名、用户名、密码是否正确2-关闭防火墙(如:windows防火墙),非本机连接时是MSSQL什麼版本?以上都没问题时,用以下方法排除以SQL2000为例排除方法/*引用*/SQ... 查看详情

3dsmax中怎么使用骨骼?

...   4、然后,用几根手指和几只脚趾观察模型,检查屏幕截图右侧的躯干类型,可以根据模型的对应零件数直接修改每个零件的数目。例如,模型有4个手指,将其更改为4个手指,如果查看骨骼,它将变为4个手指,依此... 查看详情

vscode配置c++出现无法识别g++问题怎么办?

...项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。系统路径我也加了以windows7正确安装步骤为例:1、首先,需要打开桌面的visualc++6.0文件夹进入。3、然... 查看详情

exchangeserver2013部署部署&常规配置命令[一](代码片段)

...2013部署及配置。1.挂载ExchangeServer2013镜像,运行,选择不检查更新,下一步2.选择下一步3.选择我接受条款,下一步4.选择不使用默认配置,下一步5.勾选邮箱角色和客户访问角色,下一步6.选择安装路径,下一步7.选择不,下一步... 查看详情

mysql打不开,提示#1045-accessdeniedforuser'root'@'localhost'(usingpassword:yes)

...点击“下一步”按钮。5、点击“下一步”按钮。6、等待检查完成后,点击“下一步”(注意:如果此处有错误的话,就需要先把错误解决了才能继续下面的安装,否则的话可能会导致后面的安装失败,那个IIS功能要求可以不用... 查看详情

我们是不是应该手动检查 mysqli_connect() 错误?

】我们是不是应该手动检查mysqli_connect()错误?【英文标题】:Shouldweevercheckformysqli_connect()errorsmanually?我们是否应该手动检查mysqli_connect()错误?【发布时间】:2020-03-0713:15:01【问题描述】:mysqli_connect()的PHP手册建议检查返回值并... 查看详情

如果在 if 语句之前输入了无效的登录名,如何防止检查密码以启用“下一步”按钮?

】如果在if语句之前输入了无效的登录名,如何防止检查密码以启用“下一步”按钮?【英文标题】:HowdoIpreventthepasswordbeingcheckedtoenablethe"next"buttonifaninvalidloginisenteredpriortotheifstatement?【发布时间】:2021-11-2015:35:32【问题... 查看详情

如何在windows系统上安装oracle数据库

...etup.exe,系统将启动OracleUniversalInstaller,然后进行先决条件检查。会出现如下图示:3之后,系统将打开如下界面:选择安装方法。ORACLE提供了两种安装方法:基本安装(I)和高级安装(A)。从上面的图中我们可以看到两种安装方... 查看详情

如何在windows系统上安装oracle数据库

...etup.exe,系统将启动OracleUniversalInstaller,然后进行先决条件检查。会出现如下图示:3之后,系统将打开如下界面:选择安装方法。ORACLE提供了两种安装方法:基本安装(I)和高级安装(A)。从上面的图中我们可以看到两种安装方... 查看详情

mysql安装教程教程指导在这

...C盘,不建议,可以自己选择安装路径和数据存储目录4、检查电脑配置是否符合安装要求,直接点击下一步,可能会有一个弹出框,直接点击yes进入下一步5、来到安装界面,点击execute执行安装,这个过程可能有点慢,需要逐个... 查看详情

避免在 C++ 循环中的每一步都检查相同的条件

】避免在C++循环中的每一步都检查相同的条件【英文标题】:AvoidcheckingthesameconditioneverystepinaloopinC++【发布时间】:2019-11-0615:13:08【问题描述】:我正在检查循环内的一个条件,如果它成立,就做点什么。for(i=0;i<n;i++)//dolotsofwo... 查看详情

虚拟机最小化安装centos7怎么安装桌面

...修复模式4)硬盘启动5)内存测试13提示是否对安装介质进行检查,选择“Skip”直接跳过即可14到这里就和装windows区别不大了,无非是设置个语言,选个时区,设置个用户密码,按照提示下一步即可。参考技术A配置好YUM源,然后用y... 查看详情

vm虚拟机安装与下载

...可以随心所欲的修改目录,只要空间够,点击下一步。8.检查虚拟机硬件信息,点击完成9.点击设备中的CD/DVD,选择你的iso镜像,点 查看详情

IOCP 套接字,不知道下一步该做啥

...:我学习了如何使用WindowsMessageProc创建套接字并打开了FD_CONNECT、FD_ACCEPT、FD_CLOSE等。我使用了:WSAAsyncSelect(socket,WindowHandle,WM_SOCKET 查看详情