# 九艾斯 3D 贪吃蛇 · 原生 9S + 4D 虚拟机 # 绵阳九艾斯科技有限公司 版权所有 (c) 2026 # 运行: 九S虚拟机(4D).exe 贪吃蛇3D.9s 常量 颜色_白 = 16777215 常量 颜色_红 = 255 常量 颜色_绿 = 65280 常量 颜色_蓝 = 16711680 常量 颜色_黄 = 65535 常量 颜色_青 = 16776960 常量 颜色_紫 = 16711935 常量 颜色_橙 = 42495 常量 颜色_暗蓝 = 4202528 常量 颜色_黑 = 0 # ===================================================================== # ★★★ 可改配置:改下面几行,重新运行就能看到不同 3D 效果 ★★★ # ===================================================================== 变量 蛇身颜色 = 颜色_绿 # 蛇身颜色:颜色_绿 / 颜色_青 / 颜色_紫 / 颜色_黄 变量 食物颜色 = 颜色_红 # 食物颜色 变量 网格颜色 = 颜色_暗蓝 # 3D 网格线颜色 变量 移动间隔 = 6 # 每多少帧移动一格(越小越快,33ms 一帧) 变量 相机高度 = 1000 # 相机高度(越大越俯视) 变量 相机距离 = 1100 # 相机离棋盘的距离(越大越远) 变量 蛇身尺寸 = 26 # 每节蛇身的立方体边长 变量 相机摆动 = 20 # 相机左右摆动幅度 # ===================================================================== 变量 窗口 = 空 变量 场景 = 0 变量 蛇X = [] 变量 蛇Z = [] 变量 蛇ID = [] 变量 方向X = 0 变量 方向Z = -1 变量 食物格X = 10 变量 食物格Z = 6 变量 食物ID = 0 变量 分数 = 0 变量 游戏结束 = 假 变量 计时 = 0 # 把格子坐标转成 3D 世界坐标 函数 世界X(格X) { 返回 (格X - 9.5) * 30 } 函数 世界Z(格Z) { 返回 (格Z - 9.5) * 30 } # 选择空格子放食物 函数 放食物() { 变量 已占用 = 真 变量 新X = 0 变量 新Z = 0 当 (已占用 == 真) { 新X = 随机整数(0, 19) 新Z = 随机整数(0, 19) 已占用 = 假 变量 序号 = 0 当 (序号 < 列表长度(蛇X)) { 如果 (列表查询(蛇X, 序号) == 新X 且 列表查询(蛇Z, 序号) == 新Z) { 已占用 = 真 } 序号 = 序号 + 1 } } 食物格X = 新X 食物格Z = 新Z 移动3D物体(场景, 食物ID, 世界X(食物格X), 14, 世界Z(食物格Z)) } # 创建 3D 场景:棋盘网格、蛇身立方体池、食物 函数 创建场景() { 如果 (场景 != 0) { 返回 } 场景 = 创建3D场景(1400) 设置3D相机(场景, 0, 相机高度, 0 - 相机距离) 设置相机注视(场景, 0, 0, 0) 设置3D光源(场景, 0.35, -0.85, -0.35, 0.75) 设置泛光(0) 设置环境光遮蔽(0) 设置色彩校正(1, 1.2, 1.06, -0.02) 设置画质档位(0) 设置渲染质量(2) # 棋盘边框和网格线 添加立方体(场景, 0, -2, -310, 640, 4, 6, 网格颜色) 添加立方体(场景, 0, -2, 310, 640, 4, 6, 网格颜色) 添加立方体(场景, -310, -2, 0, 6, 4, 620, 网格颜色) 添加立方体(场景, 310, -2, 0, 6, 4, 620, 网格颜色) 变量 格线 = -240 当 (格线 <= 240) { 变量 横ID = 添加立方体(场景, 0, -2, 格线, 620, 2, 2, 网格颜色) 设置塑料材质(场景, 横ID, 网格颜色) 变量 竖ID = 添加立方体(场景, 格线, -2, 0, 2, 2, 620, 网格颜色) 设置塑料材质(场景, 竖ID, 网格颜色) 格线 = 格线 + 120 } # 食物:自发光球体 食物ID = 添加球体(场景, 世界X(食物格X), 14, 世界Z(食物格Z), 14, 食物颜色) 设置气泡材质(场景, 食物ID, 食物颜色) 设置3D物体材质(场景, 食物ID, 食物颜色, 0.4, 32, 1.0, 0.2, 0.4, 0.75) } # 创建一节蛇身立方体 函数 创建蛇块(格X, 格Z) { 变量 块ID = 添加立方体(场景, 世界X(格X), 10, 世界Z(格Z), 蛇身尺寸, 18, 蛇身尺寸, 蛇身颜色) 设置金属材质(场景, 块ID, 蛇身颜色) 设置3D物体材质(场景, 块ID, 蛇身颜色, 0.55, 48, 1.0, 0.12, 0.65, 0.0) 返回 块ID } # 初始化 / R 重开 函数 初始化() { 变量 清理 = 0 当 (清理 < 列表长度(蛇ID)) { 删除3D物体(场景, 列表查询(蛇ID, 清理)) 清理 = 清理 + 1 } 蛇ID = [] 蛇X = [10, 10, 10, 10, 10] 蛇Z = [10, 11, 12, 13, 14] 方向X = 0 方向Z = -1 分数 = 0 游戏结束 = 假 计时 = 0 创建场景() 放食物() 变量 序号 = 0 当 (序号 < 列表长度(蛇X)) { 列表追加(蛇ID, 创建蛇块(列表查询(蛇X, 序号), 列表查询(蛇Z, 序号))) 序号 = 序号 + 1 } 播放音效文件("资源/start.wav") } # 蛇移动一格 函数 移动一格() { 变量 新头X = 列表查询(蛇X, 0) + 方向X 变量 新头Z = 列表查询(蛇Z, 0) + 方向Z 如果 (新头X < 0 或 新头X > 19 或 新头Z < 0 或 新头Z > 19) { 游戏结束 = 真 播放音效文件("资源/gameover.wav") 返回 } 变量 吃到 = 假 如果 (新头X == 食物格X 且 新头Z == 食物格Z) { 吃到 = 真 } 变量 身体长 = 列表长度(蛇X) 变量 检查到 = 1 如果 (吃到 == 真) { 检查到 = 0 } 变量 序号 = 检查到 当 (序号 < 身体长) { 如果 (列表查询(蛇X, 序号) == 新头X 且 列表查询(蛇Z, 序号) == 新头Z) { 游戏结束 = 真 返回 } 序号 = 序号 + 1 } 变量 新X列表 = [新头X] 变量 新Z列表 = [新头Z] 变量 保留 = 身体长 如果 (吃到 == 假) { 保留 = 身体长 - 1 } 序号 = 0 当 (序号 < 保留) { 列表追加(新X列表, 列表查询(蛇X, 序号)) 列表追加(新Z列表, 列表查询(蛇Z, 序号)) 序号 = 序号 + 1 } 蛇X = 新X列表 蛇Z = 新Z列表 # 新头生成一节立方体;没吃到就删掉尾巴那一节 变量 新蛇ID = [创建蛇块(新头X, 新头Z)] 变量 保留ID = 列表长度(蛇ID) 如果 (吃到 == 假) { 删除3D物体(场景, 列表查询(蛇ID, 保留ID - 1)) 保留ID = 保留ID - 1 } 序号 = 0 当 (序号 < 保留ID) { 列表追加(新蛇ID, 列表查询(蛇ID, 序号)) 序号 = 序号 + 1 } 蛇ID = 新蛇ID 如果 (吃到 == 真) { 分数 = 分数 + 10 播放音效文件("资源/clear.wav") 放食物() } } # 相机轻微摆动,保持 3D 空间感 函数 更新相机() { 变量 摆动 = 正弦(计时 * 0.02) * 相机摆动 相机运镜(场景, 摆动, 相机高度, 0 - 相机距离, 0, 0, 0) } # 绘制 函数 绘制界面() { 画布_清屏(九S画布()) 渲染3D场景(场景) 画布_画文本(九S画布(), 20, 18, "分数: " + 文本(分数), 颜色_白, 22) 画布_画文本(九S画布(), 20, 50, "长度: " + 文本(列表长度(蛇X)), 颜色_黄, 20) 画布_画文本(九S画布(), 20, 80, "3D 原生 9S · 4D 虚拟机", 颜色_青, 16) 画布_画文本(九S画布(), 20, 108, "帧率: " + 文本(取整(获取渲染帧率())) + " fps", 颜色_绿, 14) 画布_画文本(九S画布(), 20, 560, "方向键 转向 R 重开 ESC 退出", 颜色_白, 14) 如果 (游戏结束 == 真) { 画布_画文本(九S画布(), 270, 250, "游戏结束", 颜色_红, 40) 画布_画文本(九S画布(), 220, 310, "按 R 键重新开始", 颜色_白, 20) } } # 按键转向、重开、退出 函数 按键处理(键码) { 如果 (游戏结束 == 真) { 如果 (键码 == 键_R) { 初始化() } 如果 (键码 == 键_退出) { 关闭窗口() } 返回 } 如果 (键码 == 键_左 且 方向X == 0) { 方向X = -1 方向Z = 0 播放音效文件("资源/move.wav") } 如果 (键码 == 键_右 且 方向X == 0) { 方向X = 1 方向Z = 0 播放音效文件("资源/move.wav") } 如果 (键码 == 键_上 且 方向Z == 0) { 方向X = 0 方向Z = -1 播放音效文件("资源/move.wav") } 如果 (键码 == 键_下 且 方向Z == 0) { 方向X = 0 方向Z = 1 播放音效文件("资源/move.wav") } 如果 (键码 == 键_R) { 初始化() } 如果 (键码 == 键_退出) { 关闭窗口() 返回 } 请求重绘() } # 每帧推进:按移动间隔走一格,其余帧只重绘 函数 帧刷新() { 如果 (游戏结束 == 假) { 计时 = 计时 + 1 如果 (计时 % 移动间隔 == 0) { 移动一格() } 更新相机() } 请求重绘() } # 主程序 窗口 = 创建窗口("九艾斯3D贪吃蛇 · 可改配置", 800, 600) 画布 = 九S画布(窗口) 初始化() 设置绘制函数(绘制界面) 设置按键函数(按键处理) 设置定时器(33, 帧刷新) 显示窗口() 请求重绘() 启动消息循环()