检查NxN井字游戏(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;
}
}
}

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

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

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

由于这是家庭作业,我将只展示如何检查单行是否获胜。基本上,它涉及检查行中的所有元素,但一个元素(例如,跳过第一个元素(以查看它是空的还是与其邻居(如果跳过第一个元素,则为前一个元素(不同。如果任何测试失败,则该行没有获胜。

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.

根据 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]将超过第二个索引数组边界。 这将导致未定义的行为

另外,短语:

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

最新更新