我有一个作业,必须在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;
}
}
}
但是以这种方式,它会停止检查是否找到两列,并且不会检查行中的所有列是否都匹配。
答案 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.