我想在国际象棋程序中移动骑士。为此原因,
我在所有函数(包括main)之上定义了这两个变量(currentRow
和currentColumn
)。 (我这样做是因为我希望这些变量作为所有函数的全局变量),如下所示。因为当骑士移动时,它的位置会发生变化。这将成为下一步的投入。
我不明白的是,当我调试时,我看到这些变量在函数中发生了变化,但一旦退出函数,它们就会返回默认值(3和4)。
你能告诉我如何解决这个问题吗?提前谢谢......
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int currentRow=3;
int currentColumn=4;
int main(void){
...
}
int checkIsEmptyandMoveAccordingly(int moveNumber, int currentRow, int currentColumn){
if (chessBoard[currentRow+vertical[moveNumber]][currentColumn+horizontal[moveNumber]]==0 && currentRow+vertical[moveNumber]>=0 && currentColumn+horizontal[moveNumber] >=0 ){ //if empty,move to new location
currentRow+=vertical[moveNumber];
currentColumn+=horizontal[moveNumber];
printf("Move randomised to: %d\n", moveNumber);
printf("Knight has moved to chessBoard[%d][%d].\n",currentRow,currentColumn);
count++;
printf("Move count is %d.\n",count);
chessBoard[currentRow][currentColumn]=1;
if(!checkIsAroundFUll()){
moveNumber=randomiseMovement();
return moveNumber;
}
else {
printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!\n");
return -1;
}
}
else if (chessBoard[currentRow+vertical[moveNumber]][currentColumn+horizontal[moveNumber]]==1) { //if not empty, randomise again
printf("Knight CAN NOT MOVE! Target SPACE IS OCCUPIED\n");
if(!checkIsAroundFUll()){
moveNumber=randomiseMovement();
return moveNumber;
}
else {
printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!");
return -1;
}
}
else {
printf("OUT OF BOUNDS!! CAN NOT MOVE. TRYING ANOTHER MOVEMENT");
if(!checkIsAroundFUll()){
moveNumber=randomiseMovement();
return moveNumber;
}
else {
printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!");
return -1;
}
}
}
答案 0 :(得分:4)
int currentRow, int currentColumn
位于函数参数列表中,因此它们是局部变量。他们隐藏了具有相同名称的全球名称。
答案 1 :(得分:3)
您的函数将新变量currentRow和currentColumn声明为函数的参数。如果要更新全局变量,请删除这些参数(并且在调用函数时不要传递它们),您应该看到全局变量。
你正在做的是遮蔽全局变量。启用正确的编译器警告(因编译器而异),您将被告知此错误。
如果您使用的是gcc,请尝试使用-Wall -Werror进行编译。
答案 2 :(得分:2)
您的功能正在更改本地副本。将它们传递给函数时,它们按值传递,函数创建本地副本,本地范围覆盖全局范围。如果你想引用全局变量,不要将它们传递给你的函数,只需从那里访问它们。