📋课程基本信息
| 项目 | 内容 |
|---|---|
| 课程名称 | 第X课 石头剪刀布大作战——小航对战电脑 |
| 授课对象 | 小学四年级学生(C++入门,已掌握变量、if/else、循环基础) |
| 课程时长 | 120分钟(2课时) |
| 教学方法 | 师生对战游戏导入 + 随机数概念讲解 + 代码填空(石头剪刀布对战程序) |
| 核心知识 | rand()随机数、srand(time(0))种子、if-else if多分支判断胜负、while(true)循环、计数器统计胜负平、算术运算算胜率 |
| 难度边界 | GESP一级—二级,不使用数组、不使用自定义函数 |
🎯教学目标
知识与技能
- 理解rand()随机数的作用,掌握rand()%3+1生成1~3随机数的方法
- 理解srand(time(0))设置随机种子的意义,知道不播种子每次结果相同
- 掌握if-else if多分支结构判断胜负平三种情况
- 会用while(true)循环控制游戏反复进行,用player==0退出
- 会用计数器变量win/lose/tie/total统计战绩,并用除法计算胜率
过程与方法
- 通过师生现场对战石头剪刀布,体会"随机出拳"和"胜负规则"
- 通过掷骰子、抽奖等生活实例理解随机数概念
- 通过代码填空,把游戏规则翻译成C++代码
情感态度与价值观
- 感受"把游戏规则教给电脑"的编程乐趣
- 初步建立概率与统计意识:玩很多局后胜率趋近33.3%
- 激发对博弈论、策略思考的兴趣
📊4C1E 整体设计
| 环节 | 核心活动 | 学生任务 |
|---|---|---|
| 联系 | 师生石头剪刀布对战 → 电脑怎么随机出拳?→ 随机数概念 → 生活中的随机(抽奖、掷骰子) | 参与对战,体会随机与规则 |
| 建构 | rand()随机数 → srand(time(0))种子 → if-else if判断胜负 → while(true)循环 → 计数器统计 → 代码填空 | 理解逻辑,完成10个代码填空 |
| 反思 | 胜率讨论(理论33.3%)→ 随机数真的随机吗(伪随机)→ 常见错误总结 | 深度思考概率与代码误区 |
| 延续 | 分层课后任务 → 拓展任务(密码保护答案)→ 下节课预告 | 课后巩固,拓展提升 |
| 评价 | 课堂小测(5选择+3判断)→ 学习反馈 → 知识点回顾 | 检测学习效果 |
🔗C1 联系 Connection(25分钟)
1. 互动游戏:石头剪刀布大挑战(10分钟)
老师和学生现场玩石头剪刀布,玩5局。故意让学生观察:老师/同学出拳是有规律还是随机的?
2. 认识随机数(8分钟)
- 掷骰子:骰子掷出1~6,每次都不确定,这就是随机
- 抽奖/摇号:每个人中奖的概率差不多
- 电脑里的随机数 rand():就像一个会"掷骰子"的函数,每次调用吐出来一个数
- 石头剪刀布只有3种出法,所以我们要把随机数变成 1、2、3 三个数
• rand() % 3 → 得到 0、1、2(余数只有这三种)
• 再加1 → 得到 1、2、3(正好对应石头、剪刀、布)
记法:要几就模几,再从1开始就加1。
3. 生活中的随机 & 电脑出拳的问题(7分钟)
- 生活实例:抓阄、洗牌、抽签、游戏里随机掉落道具
- 设疑:如果电脑每次运行都吐出一模一样的"随机数",那还叫随机吗?(引出srand种子)
- 预告:今天我们要写一个程序,让小航和电脑连玩多局,还能统计胜率!
🏗️C2 建构 Construction(45分钟)
1. rand()随机数与种子srand(10分钟)
- rand()需要 #include <cstdlib> 头文件
- time(0)需要 #include <ctime> 头文件
- srand(time(0)); 放在main最开头,用当前时间做种子——因为每秒时间都在变,所以每次运行随机数都不同
- 没有srand时,电脑每次开机后第一次运行rand()都从同一个"起点"开始,结果一模一样
2. 胜负规则建模:if-else if多分支(12分钟)
约定:1=石头✊,2=剪刀✌️,3=布🖐️。胜负规则:
- 平局:玩家和电脑出一样(player == computer)→ tie平局
- 玩家赢的三种情况:石头赢剪刀(1,2)、剪刀赢布(2,3)、布赢石头(3,1) → win胜
- 其余情况就是玩家输 → lose负
(player==1 && computer==2) || (player==2 && computer==3) || (player==3 && computer==1)
读法:(石头赢剪刀) 或 (剪刀赢布) 或 (布赢石头)。三种赢法用 || 连起来。
3. while循环与计数器(8分钟)
- while(true):游戏一直玩,直到玩家输入0退出
- if(player == 0) break;:输入0就跳出循环,结束游戏
- 计数器:win、lose、tie、total,开局前全部初始化为0
- 赢了win++、输了lose++、平了tie++,每玩一局total++
4. 代码填空:石头剪刀布(15分钟)
场景:小航写了一个对战程序,电脑随机出拳,玩家输入选择,判断胜负,连玩多局后统计胜率。请补全下面10个空。
填空答案:①srand(time(0)) ②0 ③true ④player==0 ⑤rand()%3+1 ⑥player==computer ⑦tie++ ⑧(三种赢法的复合条件) ⑨win++ ⑩win*100.0/total
🤔C3 反思 Contemplation(20分钟)
1. 胜率大讨论(8分钟)
- 让学生报出自己玩出来的胜率:有人30%、有人40%、有人25%……
- 如果电脑完全随机出拳,玩非常多局后,胜、平、负大约各占多少?
- 结论:理论上每种出法概率相等,玩很多局后胜率趋近 33.3%(胜约1/3)
- 为什么公式里写 win*100.0/total 而不是 win/total*100?——如果写成win/total,整数除法会得到0,再乘100还是0!必须先乘100.0让它变成小数。
2. 随机数真的随机吗?(6分钟)
- 电脑的rand()其实是伪随机数:它是按一个固定公式算出来的,只要种子一样,序列就一样
- srand(time(0))用当前时间做种子,因为时间一直在变,所以看起来很随机
- 真正的物理随机(比如 radioactive decay)电脑做不到,但编程里伪随机已经足够好玩了
3. 常见错误总结(6分钟)
① 忘记srand(time(0)) → 每次运行电脑出拳都一样,不好玩
② rand()%3范围写错:写成rand()%3得到0,1,2,忘记+1;或写成rand()%3+0
③ 胜负条件写反/写漏:把"玩家赢"写成"电脑赢",或漏了某一种赢法(比如只写了石头赢剪刀)
④ 计数器没初始化:win/lose/tie忘记=0,导致结果是乱码大数;或忘记win++/tie++
🚀C4 延续 Continuance(15分钟)
1. 分层课后任务
| 层次 | 任务内容 | 目标 |
|---|---|---|
| 基础题 | ①完成课堂10个代码填空并运行截图;②和电脑对战5局,记录战绩 | 巩固核心代码 |
| 提高题 | 在每次对战后额外输出一行"你当前的连胜:X局",增加连胜记录变量 | 练习计数器与状态变量 |
| 挑战题 | 根据胜率输出评级:≥60%"拳皇大神",≥40%"常胜将军",否则"继续加油" | 多分支判断的综合运用 |
2. 拓展任务(密码保护答案)
拓展任务已放在学生端,包含连胜记录、智能电脑策略、战绩评级三道代码填空。答案解析通过密码 tao123 解锁(密码课后发给家长)。
3. 思维延展预告
- 如果电脑不再随机,而是"学会"你最爱出什么,专门克制你,你还能赢吗?——这就是博弈论的入门
- 下节课预告:我们将学习新的对战游戏,让程序更聪明!
📝E 评价 Evaluation(15分钟)
1. 课堂小测(10分钟)
5道单选 + 3道判断,学生端在线完成并自动判分。覆盖:rand()范围、srand作用、胜负条件、while循环、计数器、胜率计算。
2. 学习反馈(3分钟)
请学生用一句话回答:"为什么电脑加了srand(time(0))后,每次出拳就不一样了?"
3. 知识点回顾(2分钟)
🧠本节课知识点体系总览
本节课共涵盖 3大模块、12个核心知识点,其中 重点 标注的为必须掌握的核心内容。
1. rand()随机数 重点
调用一次rand()吐出一个随机整数,需要#include <cstdlib>。就像电脑在掷骰子。
2. 生成1~3随机数 重点
rand()%3得到0、1、2,再加1变成1、2、3,对应石头、剪刀、布。
3. srand随机种子 重点
srand(time(0))用当前时间做种子,放在main开头。不播种子每次运行结果都一样。
4. 伪随机概念
电脑的"随机"其实是按公式算的伪随机数,种子相同序列就相同,时间做种子就够我们玩了。
5. 出拳约定
1=石头✊,2=剪刀✌️,3=布🖐️,0=退出游戏。用数字代表手势,电脑才好比较。
6. if-else if多分支 重点
平局、赢、输三种情况依次判断。先判平局,再判赢,剩下就是输。
7. 三种赢法条件 重点
石头赢剪刀(1,2)、剪刀赢布(2,3)、布赢石头(3,1),用&&和||连接。
8. while(true)循环 重点
游戏一直玩直到输入0退出。条件永远为真,靠if(player==0) break;跳出。
9. 计数器变量 重点
win/lose/tie/total开局都要=0,赢了win++、输了lose++、平了tie++、每局total++。
10. 胜率计算 重点
胜率=胜÷总局数×100%。要乘100.0把整数除法变成小数,否则结果是0。
11. 概率33.3%
电脑完全随机时,玩很多局后胜、平、负各约1/3,胜率趋近33.3%(大数定律)。
12. 程序完整流程
播种子→初始化计数器→循环:出拳→判胜负→计数→退出后算胜率并输出。
🎯 本节课5大重点知识
① rand()%3+1(生成1~3随机出拳)
② srand(time(0))(播种子,每次运行不同)
③ 三种赢法复合条件((1,2)||(2,3)||(3,1))
④ while(true)+break(游戏循环,输入0退出)
⑤ win*100.0/total(计数器统计胜率,注意100.0)
📝完整代码参考(石头剪刀布对战)
运行示例
💡可拓展授课知识点与思路
拓展A:整数除法陷阱
为什么胜率要写win*100.0/total?如果写win/total*100,win和total都是int,先做整数除法win/total会得到0(比如1/3=0),再乘100还是0。必须乘100.0触发小数除法。可以现场演示两种写法的区别。
拓展B:伪随机与种子
演示不加srand时,每次运行电脑出拳序列完全相同;加srand(1)后,即使两次运行结果也相同(因为种子固定为1);只有srand(time(0))用变化的时间做种子,才每次不同。
拓展C:博弈论入门
石头剪刀布是博弈论经典案例:没有最优出法,因为对手会根据你的习惯调整。如果电脑"记住"你最爱出石头,就会多出布克制你——引出"策略 vs 随机"的思考。
拓展D:故意写bug让学生debug
故意制造:忘记srand、rand()%3忘记+1、赢法条件写反、计数器忘记++、胜率写成win/total*100。让学生运行后找bug,培养排错能力。
拓展E:大数定律
让一个学生玩3局报胜率,再让全班合计玩50局算总胜率,对比——玩得越多越接近33.3%,直观感受概率统计。
📐板书设计
computer = rand() % 3 + 1; // 1✊ 2✌️ 3🖐️
赢:(1,2)||(2,3)||(3,1) → win++
否则 → lose++
胜率 = win * 100.0 / total // ≈33.3%
⚠️教学注意事项与常见问题
时间把控
师生对战游戏容易兴奋超时,控制在10分钟内。代码填空给足12~15分钟。胜率讨论环节学生爱报自己战绩,适当引导但别跑题。
概念难点
两大难点:①rand()%3+1为什么模3加1;②三种赢法的复合条件(最长的一个空)。务必用手势道具演示:石头砸剪刀、剪刀剪布、布包石头。
易错点强调
反复强调:不写srand每次出拳一样;rand()%3会出现0要+1;胜率用100.0别用100;计数器开局必须=0。
硬件准备
课前确认每台电脑编译环境正常,<cstdlib>和<ctime>头文件可用。可准备石头剪刀布手势卡片或小奖品。
差异化教学
理解慢的学生提供"半完成代码"只填5个空;学有余力的学生布置连胜记录、智能电脑、战绩评级等拓展任务。
📊评价标准
| 评价维度 | 优秀(A) | 良好(B) | 需努力(C) |
|---|---|---|---|
| 随机数 | 理解srand播种子,会写rand()%3+1 | 会用rand()%3+1,种子概念模糊 | 随机数范围经常写错 |
| 胜负判断 | 独立写对三种赢法复合条件 | 基本写对,个别赢法遗漏 | 胜负条件写反或漏项 |
| 代码实现 | 独立完成10个填空,运行正确 | 完成大部分,少量错误需提示 | 填空困难,需大量帮助 |
| 统计胜率 | 理解计数器和100.0小数除法 | 会写计数器,胜率需提醒 | 计数器未初始化或忘++ |
| 课堂参与 | 积极对战、主动思考提问 | 能参与课堂活动 | 参与度低 |
📝 课堂点评(家长端)
🔄教学反思(课后填写)
1. 师生对战游戏是否有效引出了"随机数"概念?
(课后记录)
2. "三种赢法复合条件"学生理解了吗?哪个空错误率最高?
(课后记录)
3. 学生是否理解胜率为什么要写100.0而不是100?
(课后记录)
4. 下节课需要复习或补充什么内容?
(课后记录)