【发布时间】:2017-11-22 01:50:07
【问题描述】:
在connect-N游戏中,玩家只需输入一栏即可。然而,我对如何让玩家在棋盘上最低的空位移动有点困惑。我获取玩家移动的程序是这样的:
void getMove(char **board, const int numRows, const int numCols, const
char blankSpace, int *row, int *col) {
int numArgsRead;
const int numArgsNeeded = 1;
do {
printf("Enter a column between 0 and %d to play in: ", numCols - 1);
numArgsRead = scanf("%d", col);
for (int i = numRows - 1; i >= 0; --i) {
if (board[i][*col] != blankSpace) {
continue;
}
else {
*row = i;
}
}
} while(!isMoveValid(numArgsRead, numArgsNeeded, board, numRows, numCols, *row,
*col, blankSpace));
}
注意:isMoveValid 基本上接受所有这些参数并确定参数是否为整数,(row,col) 是否在板上,以及该位置是否为空白。
我从 main 调用 getMove,我希望这个函数将行和列的值“返回”给我在 main 中定义的变量 rowPlayed 和 colPlayed。我知道根据用户输入为 col 分配了正确的值,但我不确定为什么 for 循环没有将相应的行索引分配给 *row。有什么建议吗?
编辑:这是我的 main.c
int main(int argc, char* argv[]) {
const char blankSpace = '*';
const int numRows = atoi(argv[1]);
const int numCols = atoi(argv[2]);
const int numToWin = atoi(argv[3]);
const char pieces[] = "XO";
int rowPlayed, colPlayed;
int playerTurn = 1; // 0 is player 1, 1 is player 2
correctNumOfArgs(argc, numRows, numCols, numToWin);
char** board = createBoard(numRows, numCols, blankSpace);
do {
playerTurn = changeTurn(playerTurn);
displayBoard(board, numRows, numCols);
getMove(board, numRows, numCols, blankSpace, &rowPlayed, &colPlayed);
makeMove(board, rowPlayed, colPlayed, pieces[playerTurn]);
} while(!isGameOver(board, numRows, numCols, blankSpace, numToWin, pieces[playerTurn]));
declareOutcome(playerTurn, board, numRows, numCols, blankSpace, numToWin, pieces[playerTurn]);
cleanUp(&board, numRows, numCols);
return 0;
}
【问题讨论】:
-
您也可以发布您的主要代码吗?如果我们可以构建和运行您的代码,它会有所帮助:)
-
@Michi scanf 将用户输入读入指针变量col,同时赋值给变量numArgsRead。由于它读取一个值,它将为 numArgsRead 分配一个值 1,它等于 numArgsNeeded。
-
@roelofs 我不确定我的主要代码是否会对您有帮助,因为它只是一堆函数调用。但无论如何我都会发布它
-
将
atoi替换为strtol并验证转换。atoi绝对无法确保用户没有输入./program foo bar baz。 -
"寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确的问题陈述对其他读者没有用。请参阅:How to create a Minimal, Complete, and Verifiable example。”如果没有 MCVE,我们无法确定
createBoard等中不会产生问题。