✊✌️🖐️第X课 石头剪刀布大作战 — 小航对战电脑

教师备课端 | 4C1E教学设计 | GESP一级知识点 | 小学四年级趣味C++ | 课程时长 120分钟

🎬 课前动画 & 课后总结动画(学生端入口)

本课程配套两段动画,均已在学生学习端实现,课前/课后由学生点击观看:

课前导入动画:10幕分幕动画,讲述小航和电脑玩石头剪刀布的故事,引出随机数、胜负判断、计数器统计。
课后总结动画:6张知识卡片回顾 rand()随机数 / if-else if多分支 / while循环 / 计数器 / 胜率计算。

👉 课堂使用:课前放课前动画导入故事;代码完成后放课后动画收束知识点。下方为老师授课参考提示词。

【课前动画授课提示词】 "小朋友们,你们玩过石头剪刀布吗?今天小航要和电脑大战三百回合! 可是电脑怎么会知道出什么呢?它又是怎么判断输赢的? 我们一起来看看小航和电脑的对战故事吧——点击'下一幕',看看发生了什么!"
【课后总结动画授课提示词】 "今天我们让电脑学会了玩石头剪刀布!谁能说说: 电脑出拳是怎么做到随机的?(rand()%3+1,还要srand(time(0))播种子) 三局怎么判断输赢?(if-else if多分支) 玩了那么多局,战绩怎么记?(win/lose/tie计数器) 胜率是怎么算出来的?(胜÷总局数×100%)" —— 播放总结动画,逐卡片回顾。
课程概览
教学流程
知识点体系
代码与拓展
反思与评价

📋课程基本信息

项目内容
课程名称第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 整体设计

C1联系
25分钟
C2建构
45分钟
C3反思
20分钟
C4延续
15分钟
E评价
15分钟
环节核心活动学生任务
联系师生石头剪刀布对战 → 电脑怎么随机出拳?→ 随机数概念 → 生活中的随机(抽奖、掷骰子)参与对战,体会随机与规则
建构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 + 1
• 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()都从同一个"起点"开始,结果一模一样
现场演示对比:同一段代码,不加srand连跑两次 → 出拳完全相同;加上srand(time(0))再跑两次 → 出拳不同。让学生直观看到种子的作用。

2. 胜负规则建模:if-else if多分支(12分钟)

约定:1=石头✊,2=剪刀✌️,3=布🖐️。胜负规则:

  1. 平局:玩家和电脑出一样(player == computer)→ tie平局
  2. 玩家赢的三种情况:石头赢剪刀(1,2)、剪刀赢布(2,3)、布赢石头(3,1) → win胜
  3. 其余情况就是玩家输 → 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个空。

#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); // ①设置随机种子 int player, computer; int win = 0, lose = 0, tie = 0; // ②胜利计数器初始值 int total = 0; while(true) { // ③游戏循环条件 cout << "=== 石头剪刀布 ===" << endl; cout << "1=石头 2=剪刀 3=布 0=退出" << endl; cout << "请出拳:"; cin >> player; if(player == 0) break; // ④退出条件 computer = rand() % 3 + 1; // ⑤电脑随机出拳1~3 cout << "电脑出了:"; if(computer == 1) cout << "石头"; else if(computer == 2) cout << "剪刀"; else cout << "布"; cout << endl; if(player == computer) { // ⑥平局判断 cout << "平局!" << endl; tie++; // ⑦平局计数 } else if((player==1&&computer==2)||(player==2&&computer==3)||(player==3&&computer==1)) { // ⑧赢的条件 cout << "你赢了!" << endl; win++; // ⑧胜利计数 } else { cout << "你输了!" << endl; lose++; } total++; cout << "战绩:胜" << win << " 负" << lose << " 平" << tie << endl; } if(total > 0) { double rate = win * 100.0 / total; // ⑩胜率计算 cout << "=== 游戏结束 ===" << endl; cout << "总场次:" << total << endl; cout << "胜率:" << rate << "%" << endl; } return 0; }

填空答案:①srand(time(0)) ②0 ③true ④player==0 ⑤rand()%3+1 ⑥player==computer ⑦tie++ ⑧(三种赢法的复合条件) ⑨win++ ⑩win*100.0/total

教学提示:给学生12~15分钟完成填空。重点盯:①srand播种子 ⑤rand()%3+1范围 ⑧三种赢法的复合条件(最长、最易错)⑩为什么要写100.0而不是100(整数除法陷阱)。完成后请2~3名学生上台演示对战。

🤔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让它变成小数。
震撼对比:玩3局胜率可能是0%或100%(运气),玩300局胜率就会接近33.3%——这就是大数定律,次数越多越接近真实概率。

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分钟)

本课主线:师生对战 → 随机数rand()%3+1 → 播种子srand → if-else if判断胜负 → while(true)循环 → 计数器统计 → 算胜率。一句话总结:"电脑出拳靠随机,胜负规则写清楚,一局一局计数器,玩多了胜率三成三!"

🧠本节课知识点体系总览

本节课共涵盖 3大模块、12个核心知识点,其中 重点 标注的为必须掌握的核心内容。

🎲 模块一:随机数与出拳

1. rand()随机数 重点

调用一次rand()吐出一个随机整数,需要#include <cstdlib>。就像电脑在掷骰子。

rand() → 一个随机整数

2. 生成1~3随机数 重点

rand()%3得到0、1、2,再加1变成1、2、3,对应石头、剪刀、布。

computer = rand() % 3 + 1;

3. srand随机种子 重点

srand(time(0))用当前时间做种子,放在main开头。不播种子每次运行结果都一样。

srand(time(0)); // #include <ctime>

4. 伪随机概念

电脑的"随机"其实是按公式算的伪随机数,种子相同序列就相同,时间做种子就够我们玩了。

种子一样 → 随机序列一样
⚖️ 模块二:胜负判断与循环

5. 出拳约定

1=石头✊,2=剪刀✌️,3=布🖐️,0=退出游戏。用数字代表手势,电脑才好比较。

1✊ 2✌️ 3🖐️ 0退出

6. if-else if多分支 重点

平局、赢、输三种情况依次判断。先判平局,再判赢,剩下就是输。

if(平)... else if(赢)... else 输

7. 三种赢法条件 重点

石头赢剪刀(1,2)、剪刀赢布(2,3)、布赢石头(3,1),用&&和||连接。

(1,2)||(2,3)||(3,1)

8. while(true)循环 重点

游戏一直玩直到输入0退出。条件永远为真,靠if(player==0) break;跳出。

while(true){... if(p==0) break;}
📊 模块三:统计与胜率

9. 计数器变量 重点

win/lose/tie/total开局都要=0,赢了win++、输了lose++、平了tie++、每局total++。

int win=0,lose=0,tie=0,total=0;

10. 胜率计算 重点

胜率=胜÷总局数×100%。要乘100.0把整数除法变成小数,否则结果是0。

rate = win * 100.0 / total;

11. 概率33.3%

电脑完全随机时,玩很多局后胜、平、负各约1/3,胜率趋近33.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)

📝完整代码参考(石头剪刀布对战)

#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); // 设置随机种子 int player, computer; int win = 0, lose = 0, tie = 0; // 胜负平计数器 int total = 0; while(true) { cout << "=== 石头剪刀布 ===" << endl; cout << "1=石头 2=剪刀 3=布 0=退出" << endl; cout << "请出拳:"; cin >> player; if(player == 0) break; // 退出游戏 computer = rand() % 3 + 1; // 电脑随机出拳1~3 cout << "电脑出了:"; if(computer == 1) cout << "石头"; else if(computer == 2) cout << "剪刀"; else cout << "布"; cout << endl; if(player == computer) { cout << "平局!" << endl; tie++; } else if((player==1&&computer==2) || (player==2&&computer==3) || (player==3&&computer==1)) { cout << "你赢了!" << endl; win++; } else { cout << "你输了!" << endl; lose++; } total++; cout << "战绩:胜" << win << " 负" << lose << " 平" << tie << endl; cout << endl; } if(total > 0) { double rate = win * 100.0 / total; cout << "=== 游戏结束 ===" << endl; cout << "总场次:" << total << endl; cout << "胜率:" << rate << "%" << endl; } return 0; }

运行示例

=== 石头剪刀布 === 1=石头 2=剪刀 3=布 0=退出 请出拳:1 电脑出了:剪刀 你赢了! 战绩:胜1 负0 平0 === 石头剪刀布 === 请出拳:2 电脑出了:石头 你输了! 战绩:胜1 负1 平0 === 石头剪刀布 === 请出拳:0 === 游戏结束 === 总场次:2 胜率:50%

💡可拓展授课知识点与思路

拓展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%,直观感受概率统计。

📐板书设计

石头剪刀布大作战
一、电脑出拳(随机)
  srand(time(0)); // 播种子
  computer = rand() % 3 + 1; // 1✊ 2✌️ 3🖐️

二、胜负规则
  平:player == computer → tie++
  赢:(1,2)||(2,3)||(3,1) → win++
  否则 → lose++

三、循环与统计
  while(true){ 对战... if(player==0) break; }
  胜率 = 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小数除法会写计数器,胜率需提醒计数器未初始化或忘++
课堂参与积极对战、主动思考提问能参与课堂活动参与度低

📝 课堂点评(家长端)

📚 第X课《石头剪刀布大作战》课堂点评 ━━━━━━━━━━━━━━━━━━━━ 🎯 本节课学习重点: 1. 随机数 rand() % 3 + 1,让电脑随机出石头、剪刀、布 2. srand(time(0)) 设置随机种子,每次运行结果都不一样 3. if-else if 多分支判断平局、胜利、失败 4. while(true) 循环反复对战,输入0退出游戏 5. win / lose / tie 计数器统计战绩,计算胜率 ━━━━━━━━━━━━━━━━━━━━ 🌟 孩子课堂表现: - 上课认真听讲,积极参与和老师、同学的石头剪刀布对战 (๑•̀ㅂ•́)و✧ - 对"电脑怎么随机出拳"这个问题很好奇,能主动举手回答 - 代码填空环节思考认真,遇到不确定的地方会主动提问 - 调试环节表现不错,能根据电脑出拳结果一步步检查胜负判断 - 拓展任务部分愿意尝试,有探索精神和求知欲 🚀 ━━━━━━━━━━━━━━━━━━━━ 📝 知识点掌握情况: - 随机数 rand()%3+1:掌握较好 - srand(time(0)) 播种子:理解到位 - 三种赢法的复合条件:基本掌握,建议再复习石头赢剪刀、剪刀赢布、布赢石头 - while(true) 循环和 break:能正确使用 - 计数器统计和胜率计算:完成情况良好 ━━━━━━━━━━━━━━━━━━━━ 💡 课后建议: 1. 复习为什么要加 srand(time(0)),不加会怎样 2. 可以和电脑多玩几局,观察胜率是不是慢慢接近三分之一 3. 完成学生端拓展任务的3道代码填空,巩固多分支判断 4. 生活中可以找找还有哪些地方用到了"随机",比如抽奖、掷骰子 ━━━━━━━━━━━━━━━━━━━━ 加油!今天我们让电脑学会了玩石头剪刀布,这就是把游戏规则翻译成代码的魔力!(ง •_•)ง
💡 提示:点击"一键复制点评"后,可直接粘贴到微信发送给家长,格式已优化无特殊符号、无加粗标记

🔄教学反思(课后填写)

1. 师生对战游戏是否有效引出了"随机数"概念?

(课后记录)

2. "三种赢法复合条件"学生理解了吗?哪个空错误率最高?

(课后记录)

3. 学生是否理解胜率为什么要写100.0而不是100?

(课后记录)

4. 下节课需要复习或补充什么内容?

(课后记录)

🎬 课后总结动画 — 本节课知识点回顾(学生端可播放)
🎲
随机数
rand()%3+1 生成1~3,对应石头剪刀布
🌱
种子
srand(time(0)) 用时间播种子,每次不同
⚖️
胜负判断
if-else if 判平局、赢、输三种情况
🔄
游戏循环
while(true) 反复玩,输入0 break退出
📊
计数器
win/lose/tie 记录战绩,算胜率33.3%