Java Swing贪吃蛇游戏难度调整后delay参数不生效问题求助
问题根因
- 静态参数修改顺序错误:
StartMenu中先创建了SnakeStart实例(内部会提前初始化GameEngine),之后才修改GameEngine.size和GameEngine.delay,首次运行时GameEngine初始化已经读取了默认参数值;第二次运行时静态变量已经被上一次操作修改,所以看起来正常生效。 objectSize为静态初始化,只会在类加载时计算一次,后续修改size不会触发objectSize重新计算,会导致蛇身数组长度不匹配新的地图尺寸。Timer实例创建后,修改静态delay变量不会自动同步到已存在的Timer对象,需要主动更新Timer参数或者保证Timer创建前就完成delay赋值。
修复方案
1. 调整StartMenu参数修改顺序
先修改静态参数,再初始化游戏实例,保证GameEngine加载时读取的是修改后的最新参数:
easy.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ setVisible(false); // 先修改参数,再启动游戏 GameEngine.size = 48; GameEngine.delay = 140; new SnakeStart(); } }); hard.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ setVisible(false); // 先修改参数,再启动游戏 GameEngine.size = 24; GameEngine.delay = 70; new SnakeStart(); } });
2. 修复objectSize计算逻辑
把objectSize从静态变量改为构造方法中动态计算,保证每次创建GameEngine时都适配最新的size值:
// 删掉原有静态定义:static int objectSize = (sHeight*sWidth) / size; // 改为成员变量,在构造方法中初始化 int objectSize; final int playerX[]; final int playerY[]; GameEngine(){ objectSize = (sHeight*sWidth) / size; playerX = new int[objectSize]; playerY = new int[objectSize]; random = new Random(); // 剩下的原有构造逻辑保持不变 this.setPreferredSize(new Dimension(sWidth,sHeight)); this.setBackground(Color.black); this.setFocusable(true); this.addKeyListener(new UserMovement()); gameStart(); }
3. 可选:新增游戏运行时改难度的支持
如果需要支持游戏中途切换难度,给GameEngine新增更新delay的方法,主动同步到Timer实例:
public void updateDelay(int newDelay) { GameEngine.delay = newDelay; if(timer != null) { timer.setDelay(newDelay); } }
内容的提问来源于stack exchange,提问作者ZZBowzer
相关产品推荐
相关产品推荐

