# 九艾斯 2D 打地鼠 · 原生 9S # 绵阳九艾斯科技有限公司 版权所有 (c) 2026 # 运行: 九S虚拟机.exe 打地鼠.9s # ===================================================================== # ★★★ 可改配置:只改下面这几行,重新运行就能看到不同效果 ★★★ # ===================================================================== 变量 草地颜色 = 绿色 变量 泥土颜色 = 橙色 变量 地鼠颜色 = 橙色 变量 金鼠颜色 = 黄色 变量 锤子颜色 = 蓝色 变量 背景颜色 = 深灰 变量 光标速度 = 1 变量 地鼠停留帧 = 60 变量 出现间隔 = 30 变量 游戏时长 = 45 变量 初始生命 = 5 变量 音效开关 = 真 # ===================================================================== 变量 窗口 = 空 变量 画布 = 空 变量 宽 = 560 变量 高 = 680 变量 选中 = 0 变量 鼠洞 = -1 变量 鼠类型 = 1 变量 鼠剩余 = 0 变量 分数 = 0 变量 生命 = 3 变量 连击 = 0 变量 计时 = 0 变量 剩余秒 = 45 变量 游戏结束 = 假 变量 粒子X = [] 变量 粒子Y = [] 变量 粒子寿命 = [] 变量 粒子颜色 = [] 变量 提示 = "" 变量 提示寿命 = 0 函数 画圆块(中X, 中Y, 半径, 颜色) { 画布.画矩形(中X - 半径, 中Y - 半径 / 2, 半径 * 2, 半径, 颜色, 颜色) 画布.画矩形(中X - 半径 / 2, 中Y - 半径, 半径, 半径 * 2, 颜色, 颜色) 画布.画矩形(中X - 半径 + 4, 中Y - 半径 + 4, 半径 * 2 - 8, 半径 * 2 - 8, 颜色, 颜色) } 函数 洞X(序号) { 变量 列 = 序号 % 3 返回 150 + 列 * 130 } 函数 洞Y(序号) { 变量 行 = 取整(序号 / 3) 返回 230 + 行 * 150 } 函数 初始化() { 选中 = 0 鼠洞 = -1 鼠类型 = 1 鼠剩余 = 0 分数 = 0 生命 = 初始生命 连击 = 0 计时 = 0 剩余秒 = 游戏时长 游戏结束 = 假 提示 = "" 提示寿命 = 0 粒子X = [] 粒子Y = [] 粒子寿命 = [] 粒子颜色 = [] 如果 (音效开关 == 真) { 播放音效文件("资源/start.wav") } } 函数 爆炸(中心X, 中心Y, 颜色) { 变量 序号 = 0 当 (序号 < 10) { 列表追加(粒子X, 中心X) 列表追加(粒子Y, 中心Y) 列表追加(粒子寿命, 16) 列表追加(粒子颜色, 颜色) 序号 = 序号 + 1 } } 函数 更新粒子() { 变量 新X = [] 变量 新Y = [] 变量 新寿命 = [] 变量 新颜色 = [] 变量 序号 = 0 当 (序号 < 列表长度(粒子X)) { 变量 余命 = 列表查询(粒子寿命, 序号) - 1 如果 (余命 > 0) { 列表追加(新X, 列表查询(粒子X, 序号) + 随机整数(-5, 5)) 列表追加(新Y, 列表查询(粒子Y, 序号) + 随机整数(-6, 2)) 列表追加(新寿命, 余命) 列表追加(新颜色, 列表查询(粒子颜色, 序号)) } 序号 = 序号 + 1 } 粒子X = 新X 粒子Y = 新Y 粒子寿命 = 新寿命 粒子颜色 = 新颜色 } 函数 出现地鼠() { 鼠洞 = 随机整数(0, 8) 鼠类型 = 1 如果 (随机整数(1, 10) == 10) { 鼠类型 = 2 } 鼠剩余 = 地鼠停留帧 } 函数 敲击() { 如果 (游戏结束 == 真) { 返回 } 如果 (鼠洞 >= 0 且 选中 == 鼠洞 且 鼠剩余 > 0) { 连击 = 连击 + 1 变量 得分 = 10 变量 颜色 = 地鼠颜色 如果 (鼠类型 == 2) { 得分 = 30 颜色 = 金鼠颜色 } 分数 = 分数 + 得分 + 连击 爆炸(洞X(鼠洞), 洞Y(鼠洞) - 30, 颜色) 如果 (音效开关 == 真) { 播放音效文件("资源/clear.wav") } 提示 = "打中 +" + 文本(得分 + 连击) 提示寿命 = 40 鼠洞 = -1 鼠剩余 = 0 } 否则 { 连击 = 0 提示 = "扑空" 提示寿命 = 30 } } 函数 更新地鼠() { 如果 (游戏结束 == 真) { 返回 } 如果 (鼠剩余 > 0) { 鼠剩余 = 鼠剩余 - 1 如果 (鼠剩余 <= 0) { 生命 = 生命 - 1 连击 = 0 鼠洞 = -1 如果 (音效开关 == 真) { 播放音效文件("资源/drop.wav") } 如果 (生命 <= 0) { 游戏结束 = 真 如果 (音效开关 == 真) { 播放音效文件("资源/gameover.wav") } } } } 否则 { 如果 (计时 % 出现间隔 == 0) { 出现地鼠() } } } 函数 绘制地鼠(序号) { 变量 中X = 洞X(序号) 变量 中Y = 洞Y(序号) 画圆块(中X, 中Y + 8, 40, 黑色) 画圆块(中X, 中Y + 4, 34, 泥土颜色) 如果 (序号 == 鼠洞 且 鼠剩余 > 0) { 变量 颜色 = 地鼠颜色 如果 (鼠类型 == 2) { 颜色 = 金鼠颜色 } 画圆块(中X, 中Y - 22, 28, 颜色) 画布.画矩形(中X - 12, 中Y - 34, 6, 8, 黑色, 黑色) 画布.画矩形(中X + 6, 中Y - 34, 6, 8, 黑色, 黑色) 画布.画矩形(中X - 10, 中Y - 32, 2, 3, 白色, 白色) 画布.画矩形(中X + 8, 中Y - 32, 2, 3, 白色, 白色) 画布.画矩形(中X - 4, 中Y - 22, 8, 6, 红色, 红色) 画圆块(中X - 20, 中Y - 14, 8, 颜色) 画圆块(中X + 20, 中Y - 14, 8, 颜色) } } 函数 绘制界面() { 画布.清屏() 画布.画矩形(0, 0, 宽, 高, 草地颜色, 草地颜色) 画布.画矩形(0, 0, 宽, 100, 背景颜色, 背景颜色) 画布.画矩形(0, 600, 宽, 80, 橙色, 橙色) 变量 序号 = 0 当 (序号 < 9) { 绘制地鼠(序号) 序号 = 序号 + 1 } 序号 = 0 当 (序号 < 列表长度(粒子X)) { 画圆块(列表查询(粒子X, 序号), 列表查询(粒子Y, 序号), 6, 列表查询(粒子颜色, 序号)) 序号 = 序号 + 1 } 变量 光标X = 洞X(选中) 变量 光标Y = 洞Y(选中) - 12 画布.画矩形(光标X - 4, 光标Y - 44, 8, 40, 锤子颜色, 锤子颜色) 画布.画矩形(光标X - 18, 光标Y - 44, 36, 16, 锤子颜色, 锤子颜色) 画布.画矩形(光标X - 18, 光标Y - 44, 36, 4, 青色, 青色) 画布.画文本(20, 18, "分数: " + 文本(分数), 白色, 24) 画布.画文本(220, 20, "生命: " + 文本(生命), 黄色, 20) 画布.画文本(380, 20, "连击: " + 文本(连击), 青色, 20) 画布.画文本(20, 58, "剩余: " + 文本(剩余秒) + " 秒", 白色, 18) 画布.画文本(120, 618, "方向键选洞 空格敲击 R 重开 ESC 退出", 白色, 13) 如果 (提示寿命 > 0) { 画布.画文本(210, 108, 提示, 黄色, 20) } 如果 (游戏结束 == 真) { 画布.画矩形(80, 280, 400, 130, 黑色, 白色) 画布.画文本(130, 304, "时间到 / 生命耗尽", 红色, 28) 画布.画文本(160, 356, "按 R 重新开始", 白色, 20) } } 函数 按键处理(键码) { 如果 (键码 == 键_左) { 如果 (选中 % 3 > 0) { 选中 = 选中 - 1 } } 如果 (键码 == 键_右) { 如果 (选中 % 3 < 2) { 选中 = 选中 + 1 } } 如果 (键码 == 键_上) { 如果 (选中 >= 3) { 选中 = 选中 - 3 } } 如果 (键码 == 键_下) { 如果 (选中 <= 5) { 选中 = 选中 + 3 } } 如果 (键码 == 键_空格) { 敲击() } 如果 (键码 == 键_R) { 初始化() } 如果 (键码 == 键_退出) { 关闭窗口() 返回 } 请求重绘() } 函数 帧刷新() { 如果 (游戏结束 == 假) { 计时 = 计时 + 1 剩余秒 = 游戏时长 - 取整(计时 / 60) 如果 (剩余秒 <= 0) { 剩余秒 = 0 游戏结束 = 真 如果 (音效开关 == 真) { 播放音效文件("资源/gameover.wav") } } 更新地鼠() 更新粒子() 如果 (提示寿命 > 0) { 提示寿命 = 提示寿命 - 1 } } 请求重绘() } 初始化() 窗口 = 创建窗口("九艾斯打地鼠 · 可改配置", 宽, 高) 画布 = 九S画布(窗口) 设置绘制函数(绘制界面) 设置按键函数(按键处理) 设置定时器(16, 帧刷新) 显示窗口() 请求重绘() 启动消息循环()