在NxN井字游戏(C程序)中检查获胜者

时间:2019-11-26 14:03:28

标签: c

我有一个作业,必须在C程序中创建一个N x N井字游戏。我已经研究了两天,唯一的问题是检查获胜者。

有人可以给我建议如何检查水平赢/对角线等吗?

板的尺寸为N x N,由用户确定尺寸。
我制作了一个阵列板[i] [j],用于保存玩家的动作。 我愿意接受任何有关如何进行水平检查或对角线检查的建议。

我试图做类似的事情以进行水平检查

void horizontalwin()
{
    for (r=0; r<size; r++){
        for(c=0; c<size; c++){
            for(int n=1; n<=size; n++)
        if(board[r][c]==board[r][c+n]&& board[r][c]!='_')
          win=1;
          break;
        }
    }
}

但是以这种方式,它会停止检查是否找到两列,并且不会检查行中的所有列是否都匹配。

2 个答案:

答案 0 :(得分:0)

根据2D数组board的定义方式,这里存在一个潜在问题:

if(board[r][c]==board[r][c+n]&& board[r][c]!='_')  
                          ^^    

例如,如果将板定义为:

int board[size][size] = {0};  

然后:

如果c可以增长到size-1
如果r可以成长为size-1
然后,如果n大于0
board[r][c+n]将超出第二个索引数组的范围。这将导致 undefined behavior

此外,短语:

if(board[r][c]==board[r][c+n]&& board[r][c]!='_')
  win=1;
  break;
即使win不等于1

也会中断。

可能应该这样写:

if(board[r][c]==board[r][c+n]&& board[r][c]!='_')
{
    win=1;
    break;
}

答案 1 :(得分:0)

三个嵌套循环似乎过多。您只需要两个嵌套循环即可检查水平或垂直获胜。您只需要一个非嵌套循环即可检查对角线胜利。

对于水平检查,您可以依次检查每行。如果该行上的所有列都包含相同的非空值(即不是'_'字符),则返回胜利。检查所有行后,不返回任何胜利。

由于这是家庭作业,所以我将仅说明如何检查单行是否获胜。基本上,它涉及检查该行中的所有元素,但检查一个元素(例如,跳过第一个元素)以查看其是否为空或与其邻居(如果跳过了第一个元素则为上一个元素)不同。如果任何一项测试失败,那么该行就没有胜利。

        for (c = 1; c < size; c++) {
            if (board[r][c] == '_' || board[r][c] != board[r][c-1]) {
                break; // no winner on this row
            }
        }
        if (c == size) {
            // board[r][0] is the winner!
            // do something here to return the winner.
        }
        // else: no winner on row r
        // continue iterating over the remaining rows.