Python小游戏代码:从零写一个可玩的猜数字游戏

古代神殿奇幻场景

为什么用猜数字游戏练手最合适

很多初学者搜“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次。

下一步可以加什么功能?

加入历史最佳成绩记录、难度选择、把得分写入文件做排行榜。每加一个功能前先想清楚它改的是哪一段代码,这样练习才有效。

相关文章