
为什么用猜数字游戏练手最合适
很多初学者搜“python小游戏代码”,拿到的是几十行代码,复制能跑,但说不清每一句在干什么。猜数字游戏只有百来行,却把随机数、输入、判断、循环、异常处理都用上了,是最适合“读一段、改一段、加一段”的练习对象。本文不给你十个小游戏,只把这一款从零写到能玩,再教你往上加功能。
先想清楚游戏规则
程序随机生成1到100之间的整数,玩家最多猜7次。每次输入后,程序提示“太大”“太小”或“猜中”,猜中后按次数给分,7次用完则公布答案并询问是否再来一局。规则定死后再写代码,思路会清楚很多。
核心代码:四段结构
第一段:引入模块与常量
只需要 random 模块。把最大值、最大猜测次数写成常量,后面改难度只改一处。用 random.randint(1, 100) 取值,注意上下界都包含,这与 randrange 不同。
第二段:主循环与重开机制
外层用 while True 包住一整局,每局结束问玩家是否继续,输入 n 就 break 跳出。内层用 for 控制最多7次猜测,猜中就 break。这种“外层管重开、内层管一局”的双层结构,比用 flag 变量判断更直观。
第三段:输入校验不能省
玩家可能输入字母、空格、小数或超范围数字。用 try/except ValueError 捕获转换失败,用 continue 让这次输入不计入次数,或按规则扣次数,两者都可以,但要在提示里说明清楚,否则玩家会觉得程序“吞”了他的机会。超范围时直接提示范围,不要浪费一次猜测。
第四段:计分与反馈
猜中时可用公式计算得分,例如剩余次数乘10再加基础分100。反馈信息里同时给出当前范围和已用次数,玩家体验会好很多。结束时打印本局得分与累计得分,让玩家有继续玩的动力。
完整代码骨架
import random
LOW, HIGH, MAX_TRIES = 1, 100, 7
def play_once():
answer = random.randint(LOW, HIGH)
left, right = LOW, HIGH
for i in range(1, MAX_TRIES + 1):
try:
guess = int(input(f'第{i}次,请输入{LOW}-{HIGH}:'))
except ValueError:
print('请输入整数')
continue
if not LOW <= guess <= HIGH:
print('超出范围')
continue
if guess == answer:
return 100 + (MAX_TRIES - i) * 10
if guess < answer:
left = max(left, guess + 1)
print('太小了,范围是', left, '-', right)
else:
right = min(right, guess - 1)
print('太大了,范围是', left, '-', right)
print('答案是', answer)
return 0
if __name__ == '__main__':
total = 0
while True:
total += play_once()
print('累计得分:', total)
if input('再来一局?(y/n) ').strip().lower() != 'y':
break
注意示例中不等号用了 HTML 转义,真实代码里写成普通的 <= 和 >= 即可。把每局封装成函数,好处是得分用 return 返回,主流程只负责累加和询问,逻辑一目了然。
常见坑点
- 把 input 得到的内容直接和整数比较,忘记 int() 转换。
- 用 randrange(1, 100) 以为包含100,实际不包含。
- 异常后没有 continue,导致本次循环提前结束却仍计次。
- 内层猜中后用 return 而不是 break,忘记处理“没猜中”的收尾分支。
FAQ
代码跑起来一直提示输入整数怎么办?
检查是否输入了中文标点或全角数字,int() 无法识别。可先用 strip() 去掉首尾空白,再转换。
想做成两人对战可以吗?
可以。让玩家A输入一个数作为答案,用 getpass 隐藏输入,再让玩家B猜,其他逻辑不用改。
怎么限制猜测次数更合理?
二分法最多约7次可覆盖1到100,所以7次是合适上限。若把范围改成1到1000,可设为10次。
下一步可以加什么功能?
加入历史最佳成绩记录、难度选择、把得分写入文件做排行榜。每加一个功能前先想清楚它改的是哪一段代码,这样练习才有效。