Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

PyFirst

08. 游戏小工坊

学了这么多 Python 技能,是时候用它们来做游戏了!本章我们用条件判断、循环、列表、随机数……做一个迷你游戏厅 🎮

🕹️ Python 魔法学院 · 游戏工坊(特别篇)

你推开魔法学院深处一扇吱呀作响的木门,发现了一个被遗忘的游戏厅。角落里摆着三台古老的魔法游戏机——它们不用投币,只需要代码来驱动。

今天你将用 Python 复活这三台游戏机:猜数字、石头剪刀布、掷骰子大比拼。写出的代码就是游戏,游戏就是你写的代码。准备好了吗?


8.1 游戏一:猜数字 🔢

还记得之前的猜数字雏形吗?加上循环,它变成了真正的游戏!

📋 游戏规则

🎯 猜数字 —— 游戏规则
────────────────────────────
1. 电脑心里想一个 1~100 之间的秘密数字
2. 你来猜这个数字是多少
3. 电脑会告诉你:"太大了"还是"太小了"
4. 根据提示继续猜,直到猜中!
5. 猜中后,根据次数评定你的等级 🏆

💡 制胜策略:二分查找法!
   先从 50 开始(一半),如果大了就猜 25(再一半),
   如果小了就猜 75……每次砍掉一半,最快 7 次以内必中!
Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 试试看:改 secret 的范围(比如 1~50),或者改 guesses 列表,用不同的策略猜。

🧠 思考时间

停下来想一想:

  1. 为什么二分查找这么快? 普通猜法(1, 2, 3...)最多猜 100 次;二分查找每次砍一半,最多只要 7 次!100 → 50 → 25 → 12 → 6 → 3 → 1。这就是算法的力量

  2. else 跟在 for 后面是什么意思? 这可不是 ifelsefor...else 的意思是:如果循环正常结束(没有 break),就执行 else 里的代码。猜中了会 break,所以只有没猜中才会走 else

🎮 难度升级

试试把猜数字改成让玩家自己输入数字(用列表模拟),然后换成不同的难度!


8.2 游戏二:石头剪刀布 ✊✋✌️

📋 游戏规则

✊✋✌️ 石头剪刀布 —— 游戏规则
────────────────────────────
1. 石头 赢 剪刀  ✊ > ✌️
2. 剪刀 赢 布    ✌️ > ✋
3. 布 赢 石头    ✋ > ✊
4. 相同 = 平局

📊 赛制:5局3胜!
Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 试试看:改 player_moves 列表,试试不同的出拳策略!比如全出石头,会不会赢?

🧠 思考时间

  1. 判断输赢的逻辑是什么? 仔细看那个长长的不等式:(player == "石头" and computer == "剪刀") or ...。其实它在说:“你出石头且电脑出剪刀” 就是你赢。三种赢的情况摆在一起就行了。有没有更聪明的写法?提示:用 ("石头", "剪刀") in [("石头","剪刀"), ("剪刀","布"), ("布","石头")] 试试!

  2. 如果全出石头会怎样? 电脑是随机的(random.choice),所以长期来看电脑会赢大约 1/3、输 1/3、平 1/3。这就是概率

🎮 难度升级


8.3 游戏三:掷骰子大比拼 🎲

📋 游戏规则

🎲 掷骰子大比拼 —— 游戏规则
────────────────────────────
1. 你和电脑各掷 2 个骰子(每个 1~6 点)
2. 比较两个骰子的点数总和
3. 点数大的获胜!
4. 额外玩法:1000 次概率实验,看看每个点数出现多少次

🎓 数学知识:两个骰子的最小和是 2(1+1),最大是 12(6+6),
   但出现概率不同!和为 7 有 6 种组合,和为 2 只有 1 种。
Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 试试看:改 roll_dice(2) 中的数字,试试掷 3 个或 5 个骰子!观察概率实验——掷的次数越多,各点数出现的比例越接近。

🧠 思考时间

  1. 为什么概率实验的柱子差不多高? 因为每个骰子的 1~6 点是等可能的。掷 1000 次,每个点数大约出现 1000 ÷ 6 ≈ 167 次。掷的次数越多,越接近这个理论值——这就是大数定律

  2. draw_dice 函数是怎么画出骰子的? 它用字典把 1~6 每种点数映射到三行 ASCII 艺术。"●" 是实心圆点。你看——把图案存在字典里,用点数当钥匙一查就出来,多优雅!

🎮 难度升级


8.4 游戏厅整合——一键启动

把三个游戏打包成一个可选菜单:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

💡 常见误区:三个容易踩的坑

本章我们大量用了 random 模块,以下是初学者常犯的错误:

误区 1:random.randint() 两头都包含

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

不是 range(1, 6) 那样不含末尾!randintinclusive(包含两端)。

误区 2:忘记 import random

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

每个 Python 文件用到 random 时,都需要在顶部写 import random。这不是"啰嗦",而是告诉 Python 你要用这个工具箱

误区 3:字符串比较的陷阱

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

如果换成:

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

🧠 关键记忆"3"(字符串)和 3(整数)是两种完全不同的东西,就像"三"这个汉字和数字 3 一样——看起来表达同一个意思,但 Python 眼里是完全不同的数据!

🧠 思考时间(本章总结)

学完三个游戏,你其实已经掌握了:

这三个游戏看起来简单,但它们包含了所有编程的基本功。下次你自己设计游戏时,这些就是你的"乐高积木"——想怎么拼就怎么拼!


🎯 恭喜!你现在有一个可以随时玩的迷你游戏厅了。试着改改代码:调整难度、换出拳策略、加更多游戏……这是你自己的游戏厅,想怎么改就怎么改!