如何修复游戏关卡跳转故障,实现通关后自动进入下一级?
问题原因
currentLevel定义在levelComplete()方法内部,属于局部变量,每次调用该方法都会被重新初始化为0,自增后值永远为1,方法执行结束后变量就会被销毁,值完全无法留存,这是关卡无法正常递进的核心原因。- 现有判断逻辑也存在对应偏差:初始首次进入游戏默认加载level1,通关后自增应该加载level2,你当前的分支逻辑和关卡递进顺序并不匹配。
局部变量和static静态变量的差异
- 局部变量:定义在方法内部,存储在栈内存中,每次方法调用时创建,方法执行结束立即销毁,每次调用都是全新的变量,之前的值完全不会保留。
- 普通成员变量:定义在类内部、方法外部,每个类实例持有一份,生命周期和类实例一致,只要实例不销毁,变量值会一直留存,单游戏进程场景用这类变量就可以满足需求。
- static静态变量:属于类本身而非类实例,全类共享唯一一份,整个程序运行期间只会初始化一次,值会全局留存,适合需要多实例共享进度的场景。
修正代码
把currentLevel移到类成员位置,不要在方法内重复定义即可:
// 定义为类成员变量,初始值对应你默认加载的第一关 private int currentLevel = 1; private char[][] level1 = { {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' '}, {'#', ' ', '|', '#', ' ', ' ', ' ', ' ', ' ', ' '}, {'#', ' ', ' ', '#', '#', '#', ' ', ' ', ' ', ' '}, {'#', ' ', '@', ' ', ' ', '#', ' ', ' ', ' ', ' '}, {'#', ' ', ' ', '$', ' ', '#', ' ', ' ', ' ', ' '}, {'#', ' ', ' ', '#', '#', '#', ' ', ' ', ' ', ' '}, {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' '} }; private char[][] level2 = { {'#', '#', '#', '#', '#', ' ', ' ', ' ', ' '}, {'#', '@', ' ', ' ', '#', ' ', ' ', ' ', ' '}, {'#', ' ', '$', '$', '#', ' ', '#', '#', '#'}, {'#', ' ', '$', ' ', '#', ' ', '#', '|', '#'}, {'#', '#', '#', ' ', '#', '#', '#', '|', '#'}, {' ', '#', '#', ' ', ' ', ' ', ' ', '|', '#'}, {' ', '#', ' ', ' ', ' ', '#', ' ', ' ', '#'}, {' ', '#', ' ', ' ', ' ', '#', '#', '#', '#'}, {' ', '#', '#', '#', '#', '#', ' ', ' ', ' '}, }; private char[][] level3 = { {'#', '#', '#', '#', '#', '#', ' '}, {'#', ' ', ' ', ' ', ' ', '#', ' '}, {'#', ' ', '#', '@', ' ', '#', ' '}, {'#', ' ', '$', '*', ' ', '#', ' '}, {'#', ' ', '|', '*', ' ', '#', ' '}, {'#', ' ', ' ', ' ', ' ', '#', ' '}, {'#', '#', '#', '#', '#', '#', ' '}, }; public void act() { // game code here if (testLevelComplete() == true) { levelComplete(); } } public void levelComplete() { // 不要在方法内重新定义currentLevel,直接操作类成员变量 currentLevel = currentLevel + 1; showWarning("Level Complete! Current level is " + currentLevel); if (currentLevel == 1) { loadLevel(level1); } else if (currentLevel == 2) { loadLevel(level2); } else if (currentLevel == 3) { loadLevel(level3); } else if (currentLevel > 3) { showWarning("Level Complete! No more levels."); } }
如果需要全局共享关卡进度,把成员变量改成static修饰即可:
private static int currentLevel = 1;
内容的提问来源于stack exchange,提问作者Jaz
相关产品推荐
相关产品推荐

