PYTHON 从零到精通
第 11 讲 · 实战:剪刀石头布
进阶阶段第 4 篇:做一个能玩 N 局的小游戏
前面 10 讲学的都是"零件":变量、循环、判断、字符串、字典……今天把它们组装成一个完整的小游戏。这也是你写的第一个"能反复玩"的程序——做完会有真正的成就感。
一、我们要实现什么:自定义循环次数的剪刀石头布
这个游戏要满足 4 个要求:
① 自定义局数:开局先问"想玩几局",玩家说几就玩几局。
② 玩家出拳:每局手输"剪刀/石头/布"。
③ 电脑随机:电脑每局随机出拳,不让你猜到。
④ 统计战绩:玩完告诉你是几胜几平几负。
先看成品跑起来长什么样(这是后面要一步步做出来的最终效果):
想玩几局:3
—— 第 1 局 ——
你出(剪刀/石头/布):石头
电脑出了:布
你输了!
—— 第 2 局 ——
你出(剪刀/石头/布):布
电脑出了:剪刀
你输了!
—— 第 3 局 ——
你出(剪刀/石头/布):剪刀
电脑出了:剪刀
平局!
===== 最终战绩 =====
总场次:3
胜:0 平:1 负:2二、需要什么技术(先认个脸熟)
做这个游戏,一共用到 6 个知识点,全是我们前面学过的。先一句话复习:
| | |
|---|
import random | | |
random.choice() | | |
input() | | |
for + range | | |
if/elif/else | | |
字典 win_map | | |
三、一步步教学:5 步拼出这个游戏
▍第 1 步:让电脑随机出拳
先引入 random 模块,再用 random.choice(列表) 从三个选项里随机抽一个:
import random
choices = ["剪刀", "石头", "布"]
com = random.choice(choices)
print("电脑出了:", com)▍第 2 步:让玩家出拳,并拦住乱输的
用 input() 收集玩家出拳。但玩家可能打错字,所以先判断他输的是不是在合法选项里(呼应第 9 讲字典的 in):
choices = ["剪刀", "石头", "布"]
you = input("你出(剪刀/石头/布):")
if you not in choices:
print("输入不对,请出 剪刀/石头/布")
else:
print("你出了:", you)▍第 3 步:判一局胜负(用字典存规则)
剪刀石头布的胜负是有规律的:石头赢剪刀、剪刀赢布、布赢石头。用一个字典 win_map 把"谁赢谁"存起来,判胜负就一行,比写一堆 if 清爽:
win_map = {"剪刀": "布", "石头": "剪刀", "布": "石头"} # key 赢 value
you = "石头"
com = "剪刀"
if you == com:
print("平局!")
elif win_map[you] == com: # 你的拳能赢电脑的拳
print("你赢了!")
else:
print("你输了!")▍第 4 步:加上"玩几局"的循环
开局先问局数,再用 for i in range(1, rounds + 1) 循环对应次数。注意 range(1, n+1) 是从 1 开始数(第 1 局而不是第 0 局):
import random
choices = ["剪刀", "石头", "布"]
rounds = int(input("想玩几局:"))
for i in range(1, rounds + 1):
print(f"\n—— 第 {i} 局 ——")
you = input("你出(剪刀/石头/布):")
com = random.choice(choices)
print(f"电脑出了:{com}")想玩几局:3
—— 第 1 局 ——
你出(剪刀/石头/布):石头
电脑出了:布
—— 第 2 局 ——
你出(剪刀/石头/布):布
电脑出了:剪刀
—— 第 3 局 ——
你出(剪刀/石头/布):剪刀
电脑出了:剪刀▍第 5 步:统计总战绩
开三个计数器 win / draw / lose,每局结束按结果 +1,循环外打印总结:
win = draw = lose = 0
# 循环里每判完一局:
# 平局 → draw += 1
# 赢 → win += 1
# 输 → lose += 1
print("\n===== 最终战绩 =====")
print(f"总场次:{rounds}")
print(f"胜:{win} 平:{draw} 负:{lose}")===== 最终战绩 =====
总场次:3
胜:0 平:1 负:2四、最终成品代码:把 5 步拼起来
把上面 5 步按顺序写进一个文件,就是完整可运行的剪刀石头布游戏:
# 剪刀石头布游戏(自定义循环次数)
# 功能:玩家设定局数,逐局出拳,电脑随机出拳,结束统计战绩
# 作者:小黄Apollo
import random
choices = ["剪刀", "石头", "布"]
# 胜负规则:key 能赢 value
win_map = {
"剪刀": "布",
"石头": "剪刀",
"布": "石头",
}
rounds = int(input("想玩几局:"))
win = draw = lose = 0
for i in range(1, rounds + 1):
print(f"\n—— 第 {i} 局 ——")
you = input("你出(剪刀/石头/布):")
if you not in choices:
print("输入不对,这局算你输~")
lose += 1
continue
com = random.choice(choices)
print(f"电脑出了:{com}")
if you == com:
print("平局!")
draw += 1
elif win_map[you] == com:
print("你赢了!")
win += 1
else:
print("你输了!")
lose += 1
print("\n===== 最终战绩 =====")
print(f"总场次:{rounds}")
print(f"胜:{win} 平:{draw} 负:{lose}")五、测试终端输出:实测跑一遍
把上面的代码存成 game.py,在终端运行 python game.py,输入"3"开局、连出"石头/布/剪刀",真实运行输出如下(和开头预览完全一致):
$ python game.py
想玩几局:3
—— 第 1 局 ——
你出(剪刀/石头/布):石头
电脑出了:布
你输了!
—— 第 2 局 ——
你出(剪刀/石头/布):布
电脑出了:剪刀
你输了!
—— 第 3 局 ——
你出(剪刀/石头/布):剪刀
电脑出了:剪刀
平局!
===== 最终战绩 =====
总场次:3
胜:0 平:1 负:2读一下输出你能确认逻辑都对:电脑随机出拳、你输错会被判负、相同出拳算平局、战绩统计准确。你的第一个能反复玩的小游戏,做出来了。
五个新手必踩的坑
① random 没 import:直接用 random.choice() 会 NameError,先写 import random。
② 局数没 int():input() 返回字符串,range("3") 直接报错,要 int(input())。
③ 出拳拼错字:先 if you not in choices 拦住,否则后面 win_map[you] 直接 KeyError。
④ range 从 0 开始:想显示"第 1 局"要用 range(1, rounds+1)。
⑤ 胜负规则写反:win_map 存的是"key 赢 value",写成"被谁赢"判定就全反了。记住这三句话,游戏就稳了
① random.choice(列表) 从列表里随机取一个,电脑出拳全靠它。
② for i in range(1, n+1) 是"循环 n 次且从 1 数"的标准写法。
③ 用字典存规则比一堆 if 清爽,但查之前先校验 key 存在,避免 KeyError。
动手才有手感
把上面的游戏跑一遍,试试连赢三局!再挑战一下:加一个"再来一局?"的提示,输入 y 就整体重开(提示:外面再套一层 while True)。把你的战绩截图发到评论区,下一篇我们把这个游戏拆成函数,让代码更整洁!
Python 学习群:618215568
下一篇预告:第 12 讲 · 函数入门——把今天的游戏拆成可复用的函数,让重复代码消失
作者:小黄Apollo | B站:apollo小黄 | QQ群:618215568
关注「小黄Apollo」,Python 从零到精通,一篇一个知识点。