这个函数假设在连接4游戏中返回1步,但是,它返回两次...我用调试器完成了这个功能,它似乎跳过了getc()调用我没有知道为什么。非常感谢任何帮助!
char UndoBoard(char x[ROWS][COLS], char * player){
struct Node* temp = head;
int i,j;
temp = temp->next;
char input = 'q';
while((input != 'q' || input != 'Q') && temp != NULL){
for (i=0;i<ROWS;i++){
for (j=0;j<COLS;j++){
x[i][j] = temp->data[i][j];
}
}
printBoard(x);
if(*player == 'O')*player = 'X';
else *player = 'O';
printf("b - undo one step more, f - go forward, q - resume game from here\n");
input = getc(stdin);
if(input == 'q' || input == 'Q')break;
temp = temp -> next;
}
}
答案 0 :(得分:5)
中使用的逻辑
while((input != 'q' || input != 'Q') && temp != NULL){
有问题。你需要使用:
while((input != 'q' && input != 'Q') && temp != NULL){
答案 1 :(得分:4)
input
条件下while
的条件错误。无论input
的值如何,这两个术语中的一个都是正确的,因此只有在temp != NULL
时,循环才会终止。
但是你实际上break
使用正确的表达式在循环中稍后用户输入,所以实际上不需要在循环条件下进行测试。相反,请在此处仅使用temp
:
while ( temp != NULL ) {
现在你也可以改变
char input = 'q';
到
char input;
因为现在不是在循环中读取用户输入之前。
请注意,getc
会返回int
,而不是char
来提供EOF
,您也应该进行测试。 (感谢@chux指点我这一点。)
当您在循环中使用它时,您可以将其移动到(包括所有更改):
while ( temp != NULL ) {
int input;
...
if ( input == EOF || input == 'q' || input == 'Q' )
break;
temp = temp->next;
}