小航对战电脑 | 趣味C++课堂
点击"下一幕",看小航怎么和电脑玩石头剪刀布!
3大模块、12个知识点,标注重点
调用rand()会吐出一个随机整数,需要#include <cstdlib>。就像电脑在帮你掷骰子。
rand()%3得到0、1、2,再加1变成1、2、3,正好对应石头、剪刀、布。
srand(time(0))放在main开头,用当前时间做种子,每次运行结果都不同。
电脑的"随机"是按公式算出来的伪随机,种子一样序列就一样,时间做种子就够好玩了。
1=石头✊,2=剪刀✌️,3=布🖐️,0=退出游戏。用数字代表手势,电脑才好比较。
平局、赢、输三种情况依次判断。先判平局,再判赢,剩下就是输。
石头赢剪刀(1,2)、剪刀赢布(2,3)、布赢石头(3,1),用&&和||连起来。
游戏一直玩直到输入0退出。条件永远为真,靠if(player==0) break;跳出。
win/lose/tie/total开局都要=0,赢了win++、输了lose++、平了tie++、每局total++。
胜率=胜÷总局数×100%。要乘100.0变成小数,否则整数除法得到0。
电脑完全随机时,玩很多局后胜、平、负各约1/3,胜率趋近33.3%(大数定律)。
播种子→初始化计数器→循环:出拳→判胜负→计数→退出后算胜率输出。
① rand()%3+1(生成1~3随机出拳)
② srand(time(0))(播种子,每次运行不同)
③ 三种赢法复合条件((1,2)||(2,3)||(3,1))
④ while(true)+break(游戏循环,输入0退出)
⑤ win*100.0/total(计数器统计胜率,注意100.0)
填写代码空缺,让小航能和电脑对战并统计胜率!
3道拓展代码填空,挑战让游戏更智能!
难度:⭐ | 填空数:2
任务描述:在原游戏基础上增加"连胜"功能——连续赢时连胜数+1,并记录历史最高连胜;一旦输了,连胜数清零。
提示:新增变量 streak(当前连胜)和 maxStreak(最高连胜)。赢了 streak++,如果streak超过maxStreak就更新;输了 streak=0。
难度:⭐⭐ | 填空数:3
任务描述:电脑不再完全随机!它会记住你最爱出什么拳(用c1/c2/c3三个计数器记录),然后专门出能克制你的拳。
提示:石头(1)最多→电脑出布(3)克制;剪刀(2)最多→电脑出石头(1)克制;否则布(3)最多→电脑出剪刀(2)克制。
难度:⭐⭐ | 填空数:2
任务描述:游戏结束后,根据胜率rate给玩家一个称号:≥60%是"拳皇大神",≥40%是"常胜将军",否则是"继续加油"。
提示:用if-else if多分支,判断胜率率达到哪个等级。
完成拓展任务后,输入老师/家长提供的密码,查看3道拓展题的完整答案与详细解析。
填空答案:
解析:streak记录"当前连续赢了几局"。每赢一局streak++,并且和maxStreak比较,刷新历史最高连胜。一旦输了,连胜被打断,streak归0。平局不影响连胜(既不++也不清零)。
填空答案:
解析:电脑不再随机,而是用c1/c2/c3记住你每种出拳的次数。如果你最爱出石头,电脑就多出布来包你。这就是简单的"策略"——但如果你发现电脑在针对你,你也可以改变习惯反制它,这就是博弈论的乐趣!
填空答案:
解析:用if-else if多分支按等级从高到低判断。注意要先判高等级(60%)再判低等级(40%),因为60%同时也满足>=40,顺序反了就永远进不了"拳皇"分支。
密码由老师/家长提供,输入正确后可查看3道拓展题的完整答案与详细解析。
5道单选 + 3道判断,提交后查看判分与解析
rand()%3 的余数只有0、1、2三种,再加1就变成1、2、3,正好对应石头、剪刀、布。记住口诀:要几就模几,从1开始就加1。
time(0)取当前系统时间,每秒都在变,用它做随机种子,电脑每次运行就会吐出不同的随机序列。不写srand时,电脑每次开机后第一次运行rand()结果都一样。
石头(1)赢剪刀(2),因为石头能砸坏剪刀。这正是赢法条件之一:(player==1 && computer==2)。
玩家赢有三种情况:石头(1)赢剪刀(2)、剪刀(2)赢布(3)、布(3)赢石头(1),三种用||连起来。B是平局,C是玩家输(剪刀碰石头),D也是平局。
win和total都是整数int。如果先算win/total,比如2/5,整数除法结果是0(小数部分被扔掉),再乘100还是0!写成win*100.0/total,100.0是小数,会触发小数除法,才能得到40.0这样的正确结果。
正确!rand()是伪随机数,不播种子时电脑每次都从同一个"起点"开始算,所以出拳序列完全相同。加上srand(time(0))用变化的时间做种子,每次才不同。
错误!rand()%3的余数只有0、1、2三种,会出现0。必须再加1写成rand()%3+1,才能得到1、2、3。这是最常见的错误之一。
正确!胜、平、负三种情况概率相等,各约占1/3。玩得少时胜率波动很大(可能0%也可能100%),但玩得越多就越接近33.3%,这就是大数定律。
回顾本节课的重点知识