【发布时间】:2017-11-23 01:47:03
【问题描述】:
我正在尝试编写一个程序来玩 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;
}
【问题讨论】:
-
横胜太复杂了。为什么需要 3 个循环?只需计算您在这一行中看到了多少正确的部分 - 当您看到错误的部分时重置为 0。只需要 rows 和 cols 循环,而不需要额外的“k” - 与垂直相同,但这次你想先遍历列然后再遍历行。对角线比较复杂,需要一些想法。
-
这些函数是怎么调用的?我很好奇
board是如何在主程序中声明的。 -
@AlexP 在 main.c 中,我使用 char** board = createBoard(numRows, numCols, blankSpace);我会将 createBoard 添加到我的帖子中。