bug代码
cpp
//第一关、第二关第一次进入的时候的标记变量
int flag1 = 1, flag2 = 1;
int main() {
while (!gameOver) {
if (level == 1 && flag1 == 1) {
currentpr = rk[0][0];
currentpc = rk[0][1];
newpr = currentpr;
newpc = currentpc;
flag1 = 0;
}
/*
出现bug的代码
*/
//else if (level == 2 && flag2 == 2) {
/*
*/
else if(level == 2 && flag2 == 1){
currentpr = rk[1][0];
currentpc = rk[1][1];
newpr = currentpr;
newpc = currentpc;
flag2 = 0;
}
system("cls");//清屏
showMap();
showMenu();
if (isSuccess()) {
if (level == 1) {
cout << "逃出成功!" << endl;
cout << "下一关" << endl;
cout << "是否继续游戏?(Y/N)" << endl;
cin >> direction;
if (direction == 'Y') {
level++;//下一关
continue;
}
else {
cout << "游戏结束,欢迎下次游玩。" << endl;
break;
}
}
else if (level == 2) {
cout << "逃出成功!" << endl;
break;
}
}
input();
move();
}
return 0;
}
Bug 原因分析
在第二关初始化逻辑中,flag2
的判断条件错误,导致第二关的初始坐标未被正确设置,进而无法移动。
具体来看这段代码:
cpp
else if (level == 2 && flag2 == 2) { // 条件错误
currentpr = rk[1][0]; // 第二关入口坐标(0,2)
currentpc = rk[1][1];
newpr = currentpr;
newpc = currentpc;
flag2 = 0;
}
- 全局变量
flag2
初始值为1
(int flag2 = 1;
),但判断条件写成了flag2 == 2
,导致该分支永远不会执行。 - 因此进入第二关时,
currentpr
、currentpc
仍保留第一关结束时的坐标(而非第二关入口(0,2)
),而该坐标在map2
中可能是墙壁(非空格),导致move()
函数中始终触发 "回退" 逻辑,表现为无法移动。
Bug 解决方案
修正第二关初始化的flag2
判断条件,将flag2 == 2
改为flag2 == 1
,确保第一次进入第二关时正确初始化坐标。