如何修改贪吃蛇游戏的restartGame函数使其正常工作?
贪吃蛇游戏重启功能修复方案
问题核心原因
- 画布未即时刷新:游戏结束后
displayGameover绘制的文字会留在画布上,首次重启时仅设置gameOver=false,需等待下一个定时器周期才会执行update清除画布,导致屏幕仍显示“Game Over”,看起来未更新。 - 蛇身初始化顺序错误:先基于旧的
snakeX/snakeY值初始化snakeBody,再重置蛇头位置,导致首次重启时蛇身位置异常。 - 定时器管控不当:游戏结束后定时器仍在运行,
update因gameOver=true直接返回,造成无效循环;若仅调用clearInterval却未重新启动,会导致游戏冻结。
修复方案
1. 修正restartGame函数
调整蛇身初始化顺序,并手动触发一次update强制刷新画布:
restart.addEventListener("click", restartGame); function restartGame(){ // 先重置蛇头位置,再初始化蛇身 snakeX = 5 * blockSize; snakeY = 5 * blockSize; snakeBody = [ [snakeX - blockSize, snakeY], [snakeX - 2 * blockSize, snakeY], ]; score = 0; velocityX = 0; velocityY = 0; currentDirection = null; placeFood(); gameOver = false; // 立即执行update清除旧画面,绘制初始游戏状态 update(); };
2. 优化定时器生命周期(可选)
游戏结束时暂停定时器,避免无效循环;重启时重新启动:
// 修改update内的displayGameover函数 function displayGameover(){ clearInterval(intervalID); // 结束后停止定时器 ctx.font = "75px Courier New"; ctx.fillStyle = foodClr; ctx.textAlign = "center"; ctx.fillText("Game Over!", board.height / 2, board.width / 2); } // 在restartGame中添加定时器重启 function restartGame(){ // ... 其他重置代码 ... gameOver = false; // 重新启动游戏循环 intervalID = setInterval(update, gameSpeed); update(); };
内容的提问来源于stack exchange,提问作者ouzei
相关产品推荐
相关产品推荐

