gpt4 book ai didi

C 中的 Connect-N 游戏检查获胜功能不起作用

转载 作者:行者123 更新时间:2023-11-30 14:53:02 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来玩 Connect-N 游戏,这基本上是 Connect-4,但用户决定棋盘的大小(不一定是正方形)和连续获胜的棋子数量(它可以大于棋盘的大小 - 如果棋盘是 3x3,用户可以指定您需要 4 颗棋子才能获胜,而我的代码必须将游戏打成平局,因为不可能获胜)。我正在检查 4 种情况:水平获胜、垂直获胜、左对角获胜和右对角获胜。我写出了实际检查胜利的逻辑步骤,然后尝试将其转化为代码。然而,当我运行实际的程序时,即使玩家获胜,它也会不断返回这是一场平局游戏,只有当所有 4 个获胜函数都返回 false 时才能实现这一点。谁能发现我的代码中的错误吗?

这是我的代码:(仅供引用,变量pieces代表X或O)

横向获胜:

bool horizontalWin(char **board, const int numRows, const int numCols, const char blankSpace, const int numToWin, const char pieces) {
int match = 0;

if (numCols < numToWin) {
return false;
}
else {
for (int row = 0; row < numRows; ++row) {
for (int col = 0; col <= numCols - numToWin; ++col) {
for (int k = 0; k < numToWin; ++k) {
if (board[row][col + k] != pieces) {
match = 0;
}
else {
++match;
if (match == numToWin) {
return true;
}
}
}
}
}
}
return false;
}

垂直获胜:

bool verticalWin(char **board, const int numRows, const int numCols, const char blankSpace, const int numToWin, const char pieces) {
int match = 0;

if (numRows < numToWin) {
return false;
}
else {
for (int col = 0; col < numCols; ++col) {
for (int row = 0; row <= numRows - numToWin; ++row) {
for(int k = 0; k < numToWin; ++k){
if (board[row + k][col] != pieces) {
match = 0;
}
else {
++match;
if (match == numToWin) {
return true;
}
}
}
}
}
}
return false;
}

左对角线:

bool leftDiagonalWin(char **board, const int numRows, const int numCols, const char blankSpace, const int numToWin, const char pieces) {
int match = 0;

if (numCols < numToWin || numRows < numToWin) {
return false;
}
else {
for (int row = 0; row <= numRows - numToWin; ++row) {
for (int col = 0; col <= numCols - numToWin; ++col) {
for (int k = 0; k < numToWin; ++k) {
if(board[k][k] != pieces) {
match = 0;
}
else {
++match;
if (match == numToWin) {
return true;
}
}
}
}
}
}
return false;
}

右对角线:

bool rightDiagonalWin(char **board, const int numRows, const int numCols, const char blankSpace, const int numToWin, const char pieces) {
int match = 0;

if (numCols < numToWin || numRows < numToWin) {
return false;
}
else {
for (int row = numRows - 1; row >= numRows - numToWin; --row) {
for (int col = 0; col <= numCols - numToWin; ++col) {
for (int k = 0; k < numToWin; ++k) {
if (board[numRows - 1 - k][col + k] != pieces) {
match = 0;
} else {
++match;
if (match == numToWin) {
return true;
}
}
}
}

}
}
return false;
}

编辑:这是我用来创建板的函数:

char** createBoard(const int numRows, const int numCols, const char blankSpace) {
char** board = (char**) malloc(numRows * sizeof(char*));
for (int row = 0; row < numRows; ++row) {
board[row] = (char*) malloc(numCols * sizeof(char));
for (int col = 0; col < numCols; ++col) {
board[row][col] = blankSpace;
}
}
return board;
}

最佳答案

你的水平解决方案太复杂了。甚至不使用或不需要“blankSpace”参数。这是一个非常非常简化的版本:

bool horizontalWin(char **board, const int numRows, const int numCols,
const int numToWin, const char piece) {

int match = 0;

for (int row = 0; row < numRows; ++row) {
for (int col = 0; col <= numCols; ++col) {
match = (board[row][col] == piece) ? (match + 1) : 0;
if (match == numToWin) {
break;
}
}
}
return (match >= numToWin);
}

您也可以为 VerticalWin 函数复制相同的逻辑。

关于C 中的 Connect-N 游戏检查获胜功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com