✊ ✌️ 🖐️

第X课 石头剪刀布大作战

小航对战电脑 | 趣味C++课堂

🎬
课前动画
看小航怎么和电脑大战三百回合
💻
课堂项目
在线写代码,做石头剪刀布游戏
📚
知识点体系
随机数、胜负判断、计数器统计
✏️
随堂测试
5道选择+3道判断,检验学习成果
🚀
拓展任务
连胜记录、智能电脑、战绩评级
🌟
课后总结
动画回顾本节课重点
1 / 10
🎲 模块一:随机数与出拳

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. 伪随机概念

电脑的"随机"是按公式算出来的伪随机,种子一样序列就一样,时间做种子就够好玩了。

种子一样 → 随机序列一样
随机数生成流程: srand(time(0)) ← 用当前时间播种子(时间每秒都在变) ↓ computer = rand() % 3 + 1 ↓ rand() % 3 → 0 或 1 或 2(三种余数) ↓ + 1 computer → 1(✊石头) 或 2(✌️剪刀) 或 3(🖐️布)
⚖️ 模块二:胜负判断与循环

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;}
胜负判断决策树: player == computer ? ├─ 是 → 🤝 平局(tie++) └─ 否 → 玩家赢? ├─ (1,2) 石头✊赢剪刀✌️ ┐ ├─ (2,3) 剪刀✌️赢布🖐️ ├─ 是 → 🎉 你赢了(win++) └─ (3,1) 布🖐️赢石头✊ ┘ └─ 否则 → 😢 你输了(lose++)
📊 模块三:统计与胜率

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. 程序完整流程

播种子→初始化计数器→循环:出拳→判胜负→计数→退出后算胜率输出。

种子→循环对战→统计→算胜率
计数器统计示意: 开局: win=0 lose=0 tie=0 total=0 第1局 赢 → win=1 total=1 第2局 输 → lose=1 total=2 第3局 平 → tie=1 total=3 ... 退出后:胜率 = win * 100.0 / total 例:赢2局共5局 → 2*100.0/5 = 40.0%

🎯 本节课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)

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

🎮 操作按钮

📤 输出结果

// 点击"运行程序"查看模拟输出

💡 填空提示

  • ① 用当前时间播随机种子的语句?
  • ② 计数器一开始应该是几?
  • ③ 无限循环条件写什么?
  • ④ 输入数字几就退出游戏?
  • ⑤ 怎么把rand()变成1~3?
  • ⑥ 玩家和电脑出一样怎么写?
  • ⑦ 平局了tie要怎么变?
  • ⑧ 三种赢法用||连起来
  • ⑨ 赢了win要怎么变?
  • ⑩ 胜率=胜×100.0÷总局数
1

连胜记录功能

难度:⭐ | 填空数:2

任务描述:在原游戏基础上增加"连胜"功能——连续赢时连胜数+1,并记录历史最高连胜;一旦输了,连胜数清零。

提示:新增变量 streak(当前连胜)和 maxStreak(最高连胜)。赢了 streak++,如果streak超过maxStreak就更新;输了 streak=0。

extend1_streak.cpp
    int win = 0, lose = 0, tie = 0, total = 0;
    int streak = 0, maxStreak = 0; // 连胜变量
    ... (出拳和胜负判断) ...
    if(玩家赢了) {
        cout << "你赢了!" << endl;
        win++;
        ; // ①赢了连胜+1
        if(streak > maxStreak) maxStreak = streak;
    } else if(平局) {
        tie++;
    } else {
        lose++;
        ; // ②输了连胜清零
    }
    cout << "当前连胜:" << streak << " 最高连胜:" << maxStreak << endl;

🎮 操作

📤 输出

// 点击"运行"查看输出
0
2

智能电脑(不再纯随机)

难度:⭐⭐ | 填空数:3

任务描述:电脑不再完全随机!它会记住你最爱出什么拳(用c1/c2/c3三个计数器记录),然后专门出能克制你的拳。

提示:石头(1)最多→电脑出布(3)克制;剪刀(2)最多→电脑出石头(1)克制;否则布(3)最多→电脑出剪刀(2)克制。

extend2_smart.cpp
    int c1 = 0, c2 = 0, c3 = 0; // 记录玩家出石头/剪刀/布的次数
    cin >> player;
    if(player == 0) break;
    // 统计玩家出拳次数
    if(player == 1) ; // ①玩家出石头计数
    else if(player == 2) c2++;
    else c3++;
    // 智能电脑:找出玩家最爱出的,出克制它的
    if(c1 >= c2 && c1 >= c3) computer = ; // ②石头最多→出布(3)克制
    else if(c2 >= c3) computer = 1; // 剪刀最多→出石头(1)克制
    else computer = ; // ③布最多→出剪刀(2)克制
    cout << "电脑出了:" << computer << endl;

🎮 操作

📤 输出

// 点击"运行"查看输出
0
3

战绩评级功能

难度:⭐⭐ | 填空数:2

任务描述:游戏结束后,根据胜率rate给玩家一个称号:≥60%是"拳皇大神",≥40%是"常胜将军",否则是"继续加油"。

提示:用if-else if多分支,判断胜率率达到哪个等级。

extend3_rank.cpp
    double rate = win * 100.0 / total;
    cout << "胜率:" << rate << "%" << endl;
    // 根据胜率评级
    if(rate ) { // ①胜率达到几评拳皇?
        cout << "评级:👑 拳皇大神!" << endl;
    } else if(rate ) { // ②胜率达到几评常胜将军?
        cout << "评级:⚔️ 常胜将军!" << endl;
    } else {
        cout << "评级:💪 继续加油哦!" << endl;
    }

🎮 操作

📤 输出

// 点击"运行"查看输出
0

🔐 拓展任务答案解析

完成拓展任务后,输入老师/家长提供的密码,查看3道拓展题的完整答案与详细解析。

拓展1:连胜记录功能 — 答案解析

填空答案:

streak++ — 赢了,当前连胜数+1
streak=0 — 输了,连胜记录清零

解析:streak记录"当前连续赢了几局"。每赢一局streak++,并且和maxStreak比较,刷新历史最高连胜。一旦输了,连胜被打断,streak归0。平局不影响连胜(既不++也不清零)。

拓展2:智能电脑 — 答案解析

填空答案:

c1++ — 玩家出石头(1)时,石头计数器+1
3 — 石头最多,电脑出布(3)克制石头
2 — 布最多,电脑出剪刀(2)克制布

解析:电脑不再随机,而是用c1/c2/c3记住你每种出拳的次数。如果你最爱出石头,电脑就多出布来包你。这就是简单的"策略"——但如果你发现电脑在针对你,你也可以改变习惯反制它,这就是博弈论的乐趣!

拓展3:战绩评级功能 — 答案解析

填空答案:

>=60 — 胜率≥60%评"拳皇大神"
>=40 — 胜率≥40%评"常胜将军"

解析:用if-else if多分支按等级从高到低判断。注意要先判高等级(60%)再判低等级(40%),因为60%同时也满足>=40,顺序反了就永远进不了"拳皇"分支。

🔒

输入密码查看答案解析

密码由老师/家长提供,输入正确后可查看3道拓展题的完整答案与详细解析。

❌ 密码错误,请重试
🎉 答题完成!
0
第1题单选题
代码 rand() % 3 + 1 得到的数字范围是?

✅ 正确答案:B

rand()%3 的余数只有0、1、2三种,再加1就变成1、2、3,正好对应石头、剪刀、布。记住口诀:要几就模几,从1开始就加1。

第2题单选题
srand(time(0)) 的作用是什么?

✅ 正确答案:B

time(0)取当前系统时间,每秒都在变,用它做随机种子,电脑每次运行就会吐出不同的随机序列。不写srand时,电脑每次开机后第一次运行rand()结果都一样。

第3题单选题(中)
石头(1)剪刀(2)布(3),玩家出1,电脑出2,结果是?

✅ 正确答案:A

石头(1)赢剪刀(2),因为石头能砸坏剪刀。这正是赢法条件之一:(player==1 && computer==2)。

第4题单选题(中)
下面哪个是"玩家赢"的正确条件?

✅ 正确答案:A

玩家赢有三种情况:石头(1)赢剪刀(2)、剪刀(2)赢布(3)、布(3)赢石头(1),三种用||连起来。B是平局,C是玩家输(剪刀碰石头),D也是平局。

第5题单选题(难)
计算胜率时为什么要写 win * 100.0 / total,而不是 win / total * 100?

✅ 正确答案:B

win和total都是整数int。如果先算win/total,比如2/5,整数除法结果是0(小数部分被扔掉),再乘100还是0!写成win*100.0/total,100.0是小数,会触发小数除法,才能得到40.0这样的正确结果。

第6题判断题
不写 srand(time(0)),每次运行程序电脑出的拳都一样。

✅ 正确答案:✅ 正确

正确!rand()是伪随机数,不播种子时电脑每次都从同一个"起点"开始算,所以出拳序列完全相同。加上srand(time(0))用变化的时间做种子,每次才不同。

第7题判断题(中)
rand() % 3 直接就能得到 1、2、3 三个数。

✅ 正确答案:❌ 错误

错误!rand()%3的余数只有0、1、2三种,会出现0。必须再加1写成rand()%3+1,才能得到1、2、3。这是最常见的错误之一。

第8题判断题(难)
电脑完全随机出拳时,玩非常多局后,胜率会越来越接近33.3%。

✅ 正确答案:✅ 正确

正确!胜、平、负三种情况概率相等,各约占1/3。玩得少时胜率波动很大(可能0%也可能100%),但玩得越多就越接近33.3%,这就是大数定律。

🎉 本节课你学会了什么?
我们让电脑学会了玩石头剪刀布!✊✌️🖐️
🎲
随机数
rand()%3+1 生成1~3,对应石头剪刀布
🌱
播种子
srand(time(0)) 用时间做种子,每次不同
⚖️
胜负判断
if-else if 判平局、赢、输三种情况
🔄
游戏循环
while(true) 反复玩,输入0 break退出
📊
计数器
win/lose/tie 记录战绩,算胜率33.3%
💻
代码实现
10个填空全部搞定,对战游戏运行成功!
🚀 继续保持这份探索精神,下节课见!