贪吃蛇游戏创作手记:从构思到优化

简介: 使用通义灵码辅助开发贪吃蛇游戏的过程,从游戏框架搭建到代码优化,详细记录了遇到的问题及解决方案。重点讨论了安全性、逻辑Bug、异常处理、边界条件、性能效率和可维护性等方面的优化措施,最终成功完成游戏开发

在创作贪吃蛇游戏的过程中,我运用了通义灵码辅助,这是一种将复杂问题简化的编程思维。以下是我在这段旅程中遇到的问题以及相应的解决方案。

游戏框架搭建

游戏从搭建基本的 HTML 结构开始,包括一个 canvas 元素用于绘制游戏画面,以及控制按钮和得分显示。以下是游戏的基本结构:

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- ... -->
</head>
<body>
    <div class="container">
        <h1>贪吃蛇游戏</h1>
        <canvas id="gameCanvas" width="400" height="400"></canvas>
        <!-- ... -->
    </div>
    <script src="script.js"></script>
</body>
</html>
html复制代码

image.png

image.png

image.png


写好之后使用通义灵码进行了代码审查和优化建议,确实找出了很多表面以及潜在的问题,并给出了优化建议,根据下面的这些优化建议对代码进行了二次修改与订正。


潜在问题及风险

  1. 安全性问题:
  • XSS攻击: 用户输入的内容如果直接插入到页面中,可能会导致跨站脚本攻击(XSS)。虽然当前代码没有明显的用户输入,但为了安全起见,应该确保所有动态生成的内容都经过适当的转义或验证。
  • CSRF攻击: 虽然这是一个简单的游戏,但如果涉及到用户登录或敏感操作,应该考虑防止跨站请求伪造(CSRF)攻击。
  1. 逻辑Bug:
  • 按钮状态管理: 当游戏开始后,开始游戏按钮和暂停按钮的状态需要正确管理,避免用户在不适当的时间点击这些按钮导致逻辑混乱。
  • 难度选择: 难度选择的值应该在游戏开始时生效,而不是在游戏过程中动态改变。
  1. 异常处理:
  • Canvas初始化: 如果浏览器不支持<canvas>元素,或者<canvas>元素无法正确初始化,应该有适当的错误处理机制。
  • 事件绑定: 事件绑定时应该捕获并处理可能的异常,避免因为某个事件处理程序出错而导致整个游戏崩溃。
  1. 边界条件:
  • 初始状态: 确保游戏在初始状态下所有变量和状态都正确初始化。
  • 游戏结束: 游戏结束时应该正确处理各种边界条件,如蛇撞墙、蛇自相撞等。

优化建议

  1. 性能效率:
  • 事件委托: 使用事件委托来减少事件处理器的数量,提高性能。
  • 请求动画帧: 使用requestAnimationFrame来控制游戏的绘制频率,确保游戏在不同设备上都能流畅运行。
  1. 可维护性:
  • 模块化: 将游戏的不同部分(如蛇的移动、食物的生成、分数的更新等)拆分成独立的模块,提高代码的可读性和可维护性。
  • 常量和配置: 将常量和配置项提取到单独的文件或对象中,方便管理和调整。

遇到的问题与解决方案

问题 1:食物生成重复

在游戏初始化时,食物可能会生成在蛇的身上,导致游戏无法开始。为了解决这个问题,我修改了 spawnFood 函数,确保食物不会生成在蛇的任何部分上。

问题代码:

function spawnFood() {
    food = {
        x: Math.floor(Math.random() * gridCount) * boxSize,
        y: Math.floor(Math.random() * gridCount) * boxSize,
    };
    for (let part of snake) {
        if (part.x === food.x && part.y === food.y) {
            spawnFood();
            break;
        }
    }
}
javascript复制代码

解决方案:

function spawnFood() {
    let food;
    do {
        food = {
            x: Math.floor(Math.random() * gridCount) * boxSize,
            y: Math.floor(Math.random() * gridCount) * boxSize,
        };
    } while (snake.some(part => part.x === food.x && part.y === food.y));
}
javascript复制代码

问题 2:游戏速度调整

随着游戏的进行,我希望根据得分调整游戏速度。这需要动态修改 setInterval 的延迟时间。我通过在得分达到特定值时重置计时器来实现这一点。

问题代码:

if (score % 5 === 0 && score !== 0) {
    clearInterval(gameInterval);
    speed = Math.max(20, speed - 10); // 确保速度不低于20ms
    gameInterval = setInterval(() => {
        // ... (移动和绘制蛇的代码)
    }, speed);
}
javascript复制代码

问题 3:障碍物生成

我想要在游戏中随机生成障碍物,以增加游戏的难度。我通过设置一个定时器来定期生成障碍物。

问题代码:

function startObstacleGeneration() {
    setInterval(() => {
        if (Math.random() < 0.2) {
            spawnObstacle();
        }
    }, 3000); // 每3秒生成一次障碍物
}
javascript复制代码

最后再次使用通义灵码进行了代码审查修改,给出了修改后的示例代码

image.png

image.png

结果后面又出现新的问题,速度直接逆天,直接撞墙,合着这蛇就是奔着墙去的。下面又再一次进行了优化。

image.png


进一步对游戏优化


在游戏开发过程中,我不断优化代码,以提高性能和用户体验。并给出了优化措施:

  1. 安全性:
  • 代码中没有直接插入用户输入,因此 XSS 攻击的风险较低。如果后续增加用户输入功能,需要确保对输入进行转义或验证。
  • 由于这是一个简单的游戏,CSRF 攻击的风险较低,但如果有用户登录等功能,应考虑添加 CSRF 保护。
  1. 逻辑Bug:
  • 添加了按钮状态管理,确保在游戏开始后,开始游戏按钮被禁用,暂停按钮启用。
  • 难度选择的值在游戏开始时生效,并在游戏过程中提示用户难度将在下一次游戏开始时生效。
  1. 异常处理:
  • draw 函数中添加了异常捕获,确保即使某个绘制步骤出错,也不会导致整个游戏崩溃。
  • 初始化 canvas 时,如果浏览器不支持 <canvas> 元素,可以通过检查 canvas.getContext 是否返回 null 来处理。
  1. 边界条件:
  • 确保游戏在初始状态下所有变量和状态都正确初始化。
  • 游戏结束时,正确处理蛇撞墙和蛇自相撞的情况。
  1. 性能效率:
  • 使用 requestAnimationFrame 控制游戏的绘制频率,确保游戏在不同设备上都能流畅运行。
  • 通过事件委托减少事件处理器的数量,提高性能。
  1. 可维护性:
  • 将游戏的不同部分拆分成独立的函数,提高代码的可读性和可维护性。
  • 提取常量和配置项,方便管理和调整。



总结

通过通义灵码辅助,成功地创作了一个简单的贪吃蛇游戏。这个过程学到了很多关于编程和游戏开发的技巧,更加体验到了编程的乐趣。希望这篇手记能够为其他开发者提供一些灵感和帮助。

相关文章
|
4月前
|
Java
3D炫酷赛车游戏【附源码】设计实现
3D炫酷赛车游戏【附源码】设计实现
59 10
|
5天前
|
API C语言 C++
贪吃蛇游戏(必备知识篇)
贪吃蛇游戏(必备知识篇)
25 1
|
4月前
|
编译器 API C++
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
|
4月前
|
前端开发 JavaScript 安全
前端复刻经典小游戏之飞机大战(三)
前端复刻经典小游戏之飞机大战(三)
46 0
|
4月前
|
前端开发 JavaScript 测试技术
前端复刻经典小游戏之飞机大战(二)
前端复刻经典小游戏之飞机大战(二)
80 0
|
5月前
|
开发者
不会美术也能做出好看的游戏
不会美术也能做出好看的游戏
51 0
|
开发者
不会美术如何做出好看的游戏
我不会美术怎么做游戏嘞?这也是一个经常有人问的问题,尤其是对于很多的技术而言,想要自己做个游戏,却苦于自己搞不定美术,上网找素材,东拼西凑看起来缺乏整体性,找人画的话价格昂贵,找美术合作的话,又不太容易找的到合适的。 那对于不会美术的人来讲,是不是就做不出游戏了?或者说就做不出好看的游戏了?当然不是。
134 0
|
小程序 流计算
如何做个泡泡龙游戏(三)
嗨!大家好,我是小蚂蚁。今天我们来继续了解在泡泡龙游戏中,泡泡是如何发射,移动,反弹和停靠的。 这一节里会涉及到比较多的数学运算,不过完全不用担心,试着找一张纸和一支笔,画一画,很容易理解的。
126 0
|
算法 小程序
如何做一个泡泡龙游戏(五)
嗨!大家好,我是小蚂蚁。我们今天来继续学习泡泡龙游戏中最核心的东西:查找匹配算法。 其实这也不算是什么新东西了,如果你有看过我的其它关于消除游戏的教程,应该会知道,消除游戏的查找算法就那么一个,不论何种类型的消除游戏,这个算法的核心是不变的,只不过会根据不同类型的消除稍作调整而已。所以,如果你之前对查找算法还不是很了解的话,那么就尝试跟随着这篇教程把它彻底搞懂吧!
114 0
|
小程序 索引
如何做一个泡泡龙游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习制作一个泡泡龙游戏。 绝大部分的泡泡龙游戏都是关卡制的,你玩过了一关,然后接着再玩下一关。每个关卡其实都是预先设计好的,闯关的过程就是游戏将一个一个设计好的关卡呈现给玩家的过程。这些关卡都是怎样设计的呢?游戏又是怎样将这些设计好的关卡呈现出来的呢?欢迎带着这两个疑问开启今天的阅读之旅。
140 0