编程启蒙|Scratch 转 Python 系列第8天:节奏敲击机游戏实战(AI节奏谱生成实战)
摘要本篇是 Scratch 转 Python 系列第 8 天核心学习time 模块的计时time.time()和延时time.sleep()功能。我们将 Scratch 的计时器和等待秒数积木与 Python 的 time 模块进行双向对照串联Day 3 的while True循环和Day 5 的函数知识最终完成一个节奏敲击机游戏实战——AI 生成节奏谱玩家在限定时间内按下对应按键反应越快得分越高节奏越来越快1. 本节课学习目标⏱️ 掌握time.time()获取当前时间戳理解如何用两个时间点相减计算经过的时间 掌握time.sleep()实现程序延时理解它与 Scratch等待()秒积木的对应关系 能够综合运用while True循环Day 3、函数封装Day 5、时间计算完成限时输入的反应时间测量AI 应用场景了解如何用random模拟 AI 编曲生成节奏谱并通过scratch代码学习如何对接真正的 AI 大模型生成游戏节奏2. 专业名词通俗释义名词通俗解释生活类比time模块Python 自带的时间工具箱里面有很多跟时间有关的函数就像你手机上的时钟App里面有秒表、闹钟、世界时钟time.time()返回从 1970 年 1 月 1 日到现在经过了多少秒就像秒表上的数字按下时记录当前是第几秒时间戳time.time()返回的那个大数字如1700000000.5就像快递单号——一个唯一的编号标记某个特定时刻time.sleep()让程序暂停指定的秒数然后再继续执行就像 Scratch 里的等待 1 秒积木也像你妈喊你等5分钟再吃蛋糕毫秒1 秒 1000 毫秒是比秒更小的时间单位就像 1 元 100 分毫秒是时间的零钱事件驱动程序的执行流程由事件触发比如用户按下键盘就像门铃——你不按门铃不响你一按它就响。程序也是等用户按门铃才行动主循环while True让程序不断重复运行等待用户操作就像旋转木马——一圈又一圈地转直到你说停才下来反应时间从看到提示到做出反应所花费的时间就像赛跑时从听到枪响到迈出第一步的时间3. 分模块双向对照知识点知识串联本模块用到的while True循环来自 Day 3函数封装def来自 Day 5。今天我们在它们的基础上加入时间这个新维度模块1计时基础time.time() 获取当前时间戳 Scratch 积木逻辑在 Scratch 中我们用计时器积木来获取时间计时器积木返回从绿旗点击后经过的秒数重置计时器积木将计时器归零典型用法记录一个起始时间 → 执行某些操作 → 再读取一次计时器 → 两次相减 经过的秒数。 Python 源码importtime# 【Scratch积木】点击绿旗时程序开始print( 程序开始)# 【Scratch积木】将 [start_time] 设为 (计时器)start_timetime.time()print(f 开始时间戳{start_time:.2f})# 【Scratch积木】等待 (1) 秒print(⏳ 等待1秒中...)time.sleep(1)# 【Scratch积木】将 [end_time] 设为 (计时器)end_timetime.time()print(f 结束时间戳{end_time:.2f})# 【Scratch积木】将 [elapsed] 设为 ([end_time] - [start_time])elapsedend_time-start_timeprint(f\n✅ 经过的时间 {end_time:.2f}-{start_time:.2f}{elapsed:.2f}秒) 运行结果 程序开始 开始时间戳1700000000.00 ⏳ 等待1秒中... 结束时间戳1700000001.00 ✅ 经过的时间 1700000001.00 - 1700000000.00 1.00 秒⚠️ 核心易错说明时间戳很大是正常的time.time()返回的是从 1970 年 1 月 1 日到现在的秒数数字可能像1700000000.5不要害怕Scratch 计时器 vs Pythontime.time()Scratch 的计时器从绿旗点击开始算Python 从 1970 年开始算但相减求差值的思路完全一样。保留小数用:.2f可以只显示两位小数否则数字会很长很难读。模块2延时控制time.sleep() 暂停程序 Scratch 积木逻辑Scratch 中的等待()秒积木让程序暂停指定时间等待 (1) 秒程序暂停 1 秒后继续执行下面的积木 Python 源码importtime# 模拟红绿灯# 【Scratch积木】说 [红灯亮了] 持续 (1) 秒print( 红灯亮了)# 【Scratch积木】等待 (2) 秒time.sleep(2)# 【Scratch积木】说 [黄灯亮了] 持续 (1) 秒print( 黄灯亮了)# 【Scratch积木】等待 (1) 秒time.sleep(1)# 【Scratch积木】说 [绿灯亮了] 持续 (1) 秒print( 绿灯亮了可以通行)# 倒计时小演示# 【Scratch积木】重复执行 [3] 次foriinrange(3,0,-1):# 【Scratch积木】说 (连接 [倒计时] 和 (i))print(f ⏰{i}...)# 【Scratch积木】等待 (1) 秒time.sleep(1)print( 时间到) 运行结果 红灯亮了 等待2秒 黄灯亮了 等待1秒 绿灯亮了可以通行 再来一个倒计时小演示 ⏰ 3... 等待1秒 ⏰ 2... 等待1秒 ⏰ 1... 等待1秒 时间到⚠️ 核心易错说明秒数可以是小数time.sleep(0.5)表示暂停 0.5 秒不一定是整数。完全对应time.sleep(秒数)和 Scratch 的等待()秒积木是一对一的映射关系是最容易理解的对照。sleep 期间程序什么也不做就像 Scratch 等待时角色也不会动一样Python 在 sleep 期间也不会执行任何代码。模块3限时输入计算反应时间 Scratch 积木逻辑在 Scratch 中实现限时输入需要组合多个积木询问()并等待等待用户输入回答计时器同时记录经过的时间如果 计时器 3 那么判断是否超时 Python 源码importtime# 【Scratch积木】等待 (2) 秒print(3秒后开始...)time.sleep(1)print(2...)time.sleep(1)print(1...)time.sleep(1)# 【Scratch积木】将 [target] 设为 [g]targetg# 【Scratch积木】说 (连接 [请快速输入] 和 [target])print(f\n 请快速输入字母{target})# 【Scratch积木】将 [start_time] 设为 (计时器)start_timetime.time()# 【Scratch积木】询问 (请输入) 并等待answerinput(请输入).strip().lower()# 【Scratch积木】将 [end_time] 设为 (计时器)end_timetime.time()# 【Scratch积木】将 [reaction] 设为 ([end_time] - [start_time])reactionend_time-start_timeprint(f\n 你的反应时间{reaction:.2f}秒)# 【Scratch积木】如果 (回答) [target] 那么ifanswertarget:# 【Scratch积木】如果 [reaction] [1] 那么ifreaction1.0:print( 闪电手反应超快)# 【Scratch积木】否则else:print( 不错继续练习会更快)# 【Scratch积木】否则else:print(f 输入错了应该是 {target}) 运行结果3秒后开始... 2... 1... 请快速输入字母g 请输入g 你的反应时间0.45 秒 闪电手反应超快⚠️ 核心易错说明input() 会阻塞程序input()和 Scratch 的询问()并等待一样程序会停在这里等用户输入这就是事件驱动的体现。计时要在 input 前后start_time必须在input()之前记录end_time必须在input()之后记录顺序不能错strip() 和 lower() 很重要strip()去掉首尾空格lower()转小写这样用户输入 G 或 “g” 都能正确匹配。串联 Day 3这里用if/else判断和嵌套条件跟 Day 3 学的条件判断完全一致4. 综合实战项目节奏敲击机完整游戏 把模块 1-3 的知识全部串起来加上 Day 3 的while True循环和 Day 5 的函数封装做一个完整的游戏 游戏设计要素说明按键W / A / S / D 四个键AI 编曲用random.choice()随机生成按键模拟 AI 生成节奏谱限时第 1 轮 3.0 秒之后每轮减少 0.2 秒最低 1.0 秒计分基础分 10 速度奖励剩余时间 × 10 连击奖励连击数 × 2连击连续答对累积答错或超时清零退出输入q随时退出scratch积木代码 完整可运行代码importtimeimportrandomdefrhythm_tap_machine(): 节奏敲击机完整游戏 print(*50)print( 节奏敲击机 Rhythm Tap Machine )print(*50)print( 游戏规则)print( · 屏幕会显示一个字母W/A/S/D)print( · 你需要尽快输入对应的字母)print( · 反应越快得分越高)print( · 随着轮次增加时间会越来越短)print( · 输入 q 可以随时退出)print(*50)# 【Scratch积木】将 [score] 设为 [0]score0# 【Scratch积木】将 [round_num] 设为 [0]round_num0# 【Scratch积木】将 [combo] 设为 [0]combo0# 【Scratch积木】将 [best_combo] 设为 [0]best_combo0# 可选按键列表keys[w,a,s,d]# 准备阶段input(\n按回车键开始游戏...)print(\n 游戏开始\n)# 【Scratch积木】重复执行直到 回答 qwhileTrue:# 【Scratch积木】将 [round_num] 增加 (1)round_num1# AI生成节奏谱用random模拟AI编曲# 【Scratch积木】将 [target_key] 设为 (在 [keys] 中取随机一个)target_keyrandom.choice(keys)# 时间限制随轮次减少节奏越来越快# 【Scratch积木】将 [time_limit] 设为 ([3.0] - (([round_num] - [1]) * [0.2]))time_limitmax(1.0,3.0-(round_num-1)*0.2)# 【Scratch积木】说 (连接 [第] 和 ([round_num]) 和 [轮])print(f━━━ 第{round_num}轮 ━━━)print(f⏱️ 时间限制{time_limit:.1f}秒)print(f 请按【{target_key.upper()}】)# 记录开始时间# 【Scratch积木】将 [start_time] 设为 (计时器)start_timetime.time()# 【Scratch积木】询问 (请输入) 并等待answerinput( ).strip().lower()# 记录结束时间# 【Scratch积木】将 [end_time] 设为 (计时器)end_timetime.time()# 计算反应时间# 【Scratch积木】将 [reaction] 设为 ([end_time] - [start_time])reactionend_time-start_time# 退出游戏# 【Scratch积木】如果 (回答) [q] 那么 停止该脚本ifanswerq:break# 判断是否超时# 【Scratch积木】如果 [reaction] [time_limit] 那么ifreactiontime_limit:print(f⏰ 超时反应时间{reaction:.2f}s 限制{time_limit:.1f}s)print(❌ 本轮不得分连击中断)# 【Scratch积木】将 [combo] 设为 [0]combo0# 判断是否按对# 【Scratch积木】如果 (回答) 不 [target_key] 那么elifanswer!target_key:print(f❌ 按错了应该是{target_key.upper()})print(❌ 本轮不得分连击中断)# 【Scratch积木】将 [combo] 设为 [0]combo0# 答对且未超时# 【Scratch积木】否则else:# 计算得分越快得分越高# 【Scratch积木】将 [speed_bonus] 设为 (取整 ([time_limit] - [reaction]) * [10])speed_bonusint((time_limit-reaction)*10)# 基础分10分base_score10# 【Scratch积木】将 [combo] 增加 (1)combo1# 连击奖励每连击2分# 【Scratch积木】将 [combo_bonus] 设为 ([combo] * [2])combo_bonuscombo*2# 本轮总分# 【Scratch积木】将 [total] 设为 ([base_score] [speed_bonus] [combo_bonus])totalbase_scorespeed_bonuscombo_bonus# 【Scratch积木】将 [score] 增加 [total]scoretotal# 更新最高连击# 【Scratch积木】如果 [combo] [best_combo] 那么ifcombobest_combo:# 【Scratch积木】将 [best_combo] 设为 [combo]best_combocomboprint(f✅ 正确反应时间{reaction:.2f}s)print(f 得分{total}基础{base_score} 速度{speed_bonus} 连击{combo_bonus})print(f 连击{combo} 总分{score})# 短暂停顿# 【Scratch积木】等待 (0.5) 秒time.sleep(0.5)print()# 游戏结束统计print(*50)print( 游戏结束)print(f 完成轮数{round_num-1})print(f 总得分{score})print(f 最高连击{best_combo})print(*50)# 启动游戏rhythm_tap_machine() 游戏代码拆解代码区块对应知识点串联来源while True主循环无限循环 break退出Day 3 循环def rhythm_tap_machine()函数封装游戏逻辑Day 5 函数time.time()计时获取时间戳计算反应时间Day 8 新知识time.sleep(0.5)延时轮次间短暂停顿Day 8 新知识random.choice(keys)AI 模拟生成节奏Day 8 AI 实战if/elif/else条件判断超时/按错/按对Day 3 条件判断input()事件驱动等待用户输入Day 1 输入输出5. 高频易错点总结❌ 易错点1计时顺序搞反# ❌ 错误先 input 再记开始时间反应时间永远是 0answerinput(请输入)start_timetime.time()# 错end_timetime.time()reactionend_time-start_time# 永远约等于 0# ✅ 正确先记开始时间再 input最后记结束时间start_timetime.time()answerinput(请输入)end_timetime.time()reactionend_time-start_time# 这才是真实反应时间❌ 易错点2忘记 import time# ❌ 错误直接用 time.time() 但没有导入starttime.time()# 报错NameError: name time is not defined# ✅ 正确文件开头先导入importtime starttime.time()# 正常运行❌ 易错点3time.sleep() 的参数单位搞混# ❌ 错误以为参数是毫秒time.sleep(1000)# 实际暂停 1000 秒约16分钟# ✅ 正确参数是秒1秒就写 1time.sleep(1)# 暂停 1 秒time.sleep(0.5)# 暂停 0.5 秒500毫秒❌ 易错点4忘记 strip() 和 lower() 导致匹配失败# ❌ 错误用户输入 W 带空格大写无法匹配 wanswerinput(请输入)ifanswerw:# W ! w匹配失败# ✅ 正确strip() 去空格 lower() 转小写answerinput(请输入).strip().lower()ifanswerw:# W → w匹配成功❌ 易错点5while True 忘记写退出条件# ❌ 错误没有 break死循环永远停不下来whileTrue:answerinput(请输入)print(answer)# 只能按 CtrlC 强制停止很不友好# ✅ 正确加上退出条件whileTrue:answerinput(请输入)ifanswerq:break# 输入 q 就退出print(answer)6. 学习提示 学习提示为鼓励大家动手练习、吃透编程逻辑本篇不提供Scratch成品源码请对照截图亲手搭建积木完成复刻配套Python代码可直接复制运行学习。7. 往期历史笔记编程启蒙Scratch 转 Python 系列第 1 天变量、数字运算积木双向对照AI 基础数值计算实战编程启蒙Scratch 转 Python 系列第 2 天分支判断 if 积木双向对照AI 指令条件过滤实战编程启蒙Scratch 转 Python 系列第 3 天循环重复积木双向对照AI 批量循环处理已收录 AI Agent 技术社区编程启蒙Scratch 转 Python 系列第 4 天字符串文本积木双向对照AI 提示词拼接、文本清洗实战编程启蒙Scratch 转 Python 系列第 5 天自定义积木 / 函数双向对照AI 工具封装、重复指令简化实战编程启蒙Scratch 转 Python 系列第 6 天列表、数组积木双向对照AI 底层语法 / AI 批量数据处理实战编程启蒙Scratch 转 Python 系列第 7 天猜数字大挑战·升级版实战AI 出题 二分查找最优解 完整命令行游戏知识串联提醒本篇的while True主循环来自Day 3的循环结构游戏中用break退出本篇的def rhythm_tap_machine()函数封装来自Day 5的函数知识把整个游戏逻辑打包成一个函数建议如果对循环或函数还不熟练的同学先回顾 Day 3 和 Day 5 再来看本篇9. 下一章预告Day 9字典/哈希表积木双向对照AI大模型参数配置表实战明天我们将学习 Python 中非常重要的数据结构——字典dict 字典就像标签收纳盒用键key找值value 对照 Scratch 中的列表和变量组合使用 AI 实战用字典管理 AI 大模型的参数配置表模型名称、温度、最大token数等 动手做一个AI 模型参数调试器敬请期待10. 原创声明本文为梅雅达编程笔记原创内容系列课程持续更新中。禁止搬运本文所有文字、代码、图片均为原创未经授权禁止转载、复制、摘编或以其他方式使用。 如需授权请联系作者。© 梅雅达编程笔记 · Scratch 转 Python 系列 · Day 8每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容

相关新闻