Python猜数字游戏完整代码示例

Alice
Alice
发布时间:2026-10-22 | 6人浏览过
原创

猜数字游戏是学习编程控制流与交互逻辑的经典项目。程序的运行机制由计算机生成一个指定区间(例如 1 到 100)的保密随机整数,随后接收玩家在控制台输入的猜测值,对比两者大小并输出“猜大了”、“猜小了”或“猜中了”的反馈提示,直至玩家命中目标数字退出循环。本文提供该游戏从零开始的基础版、容错强化版以及限制尝试次数的完整代码与工程实现细节。

一、游戏规则与核心执行流程

在编写代码前,需要明确程序在生命周期中处理的各项逻辑任务。一个标准控制台猜数字游戏包含四个基础阶段:

  1. 秘密数字生成:程序启动时调用内置模块生成随机目标数,并在整个游戏会话期间保持该数值不变。
  2. 循环输入等待:启动无限循环(while True),提示玩家输入整数,并通过控制台读取文本。
  3. 数值比较与反馈:将输入文本转换为数值,与目标数进行三向条件判断(<、>、==)。
  4. 终止与结算:当数字相等时打破循环,并输出玩家本轮游戏的总尝试次数。
Python猜数字游戏完整代码示例
图 1:猜数字游戏基本执行与控制流闭环步骤

二、基础版本完整代码与逐行解析

下面是用 Python 实现猜数字游戏的基础完整代码。该版本遵循最简可运行原则,便于初学者理解基本控制语句的应用:

import random

def guess_number_basic():
    # 1. 在 [1, 100] 闭区间内随机选取一个目标整数
    target_number = random.randint(1, 100)
    guess_count = 0

    print("========================================")
    print("        欢迎来到 Python 猜数字游戏        ")
    print("系统已选定 1 到 100 之间的一个数字,请猜!")
    print("========================================")

    # 2. 持续循环,直到猜中数字时显式退出
    while True:
        user_input = input("请输入您猜测的数字:")
        guess = int(user_input)
        guess_count += 1

        # 3. 三向逻辑分支比对
        if guess < target_number:
            print("太小了,请往大一点猜!\n")
        elif guess > target_number:
            print("太大了,请往小一点猜!\n")
        else:
            print(f"恭喜您猜对了!目标数字正是 {target_number}。")
            print(f"您总共尝试了 {guess_count} 次。")
            break

if __name__ == "__main__":
    guess_number_basic()

核心技术要点解析

  • random.randint(1, 100):Python 的 random 模块提供的 randint(a, b) 函数生成闭区间 [a, b] 内的随机整数,即边界值 1 和 100 均有可能被抽取到。
  • while True 无限循环:由于无法预先获知玩家需要多少次才能猜中,因此使用无固定次数的 while 循环维持游戏进程。
  • break 语句:当 guess == target_number 条件成立时,执行 break 强制跳出循环,避免程序陷入死循环。
  • int(user_input):input() 函数返回的数据类型固定为字符串(str),必须通过 int() 显式转换为整数后才能参与大小比较运算。
Python猜数字游戏完整代码示例
图 2:数值判定三向分支及搜索区间收敛机理

三、容错强化:拦截非数字输入与范围越界

基础版本的代码存在一个显著的脆弱点:若玩家在控制台输入了字母(如 abc)、标点符号或直接敲击回车,执行 int(user_input) 将直接引发 ValueError 异常,导致程序崩溃终止。此外,如果玩家输入了 -5 或 200,虽不会报错,但显然超出了既定范围。

要让程序具备工业级健壮性,必须在处理核心逻辑前加入两道防线:

  1. 类型转换防护:使用 try...except ValueError 语句捕获非整数字符。
  2. 业务边界防护:使用条件判断过滤不在有效区间的数值。
Python猜数字游戏完整代码示例
图 3:输入类型转换异常拦截与边界过滤机制

四、进阶版本完整代码:增加猜测限制与胜负判定

为了使游戏更具趣味性与挑战性,进阶版本增加了最大猜测次数限制。从信息论与二分查找算法可知,在 1 到 100 之间猜一个数字,最坏情况下只需 $\lceil \log_2(100) \rceil = 7$ 次即可必定命中。因此,将最大猜测次数设定为 7 次,可以有效检验玩家的二分搜索策略。

import random

def guess_number_advanced(min_val=1, max_val=100, max_attempts=7):
    """
    Python 猜数字游戏进阶版
    :param min_val: 目标数字最小值
    :param max_val: 目标数字最大值
    :param max_attempts: 允许猜测的最大次数
    """
    secret_number = random.randint(min_val, max_val)
    attempts_used = 0

    print("==================================================")
    print(f"       Python 猜数字挑战赛 (限定 {max_attempts} 次机会)       ")
    print(f"  范围:{min_val} ~ {max_val} 之间,合理使用二分策略获胜! ")
    print("==================================================\n")

    # 循环条件:已用次数小于限定次数
    while attempts_used < max_attempts:
        remaining_attempts = max_attempts - attempts_used
        prompt_text = f"[第 {attempts_used + 1} 轮 | 剩余 {remaining_attempts} 次机会] 请输入数字: "
        user_input = input(prompt_text).strip()

        # 1. 防御性检查:非数字输入拦截
        try:
            guess = int(user_input)
        except ValueError:
            print("【输入无效】检测到非整数输入,请输入合法数字!(本次输入不消耗机会)\n")
            continue

        # 2. 边界检查:越界数值拦截
        if guess < min_val or guess > max_val:
            print(f"【范围越界】请输入 {min_val} 到 {max_val} 之间的数字!(不消耗机会)\n")
            continue

        # 输入合法,正式消耗一次猜测机会
        attempts_used += 1

        # 3. 核心比对分支
        if guess < secret_number:
            print(f"【偏小】你猜的数字 {guess} 太小了!目标数字更大。\n")
        elif guess > secret_number:
            print(f"【偏大】你猜的数字 {guess} 太大了!目标数字更小。\n")
        else:
            print("**************************************************")
            print(f"恭喜胜利!您在第 {attempts_used} 轮成功猜中秘密数字:{secret_number}!")
            print("**************************************************")
            return True

    # 超过限制次数仍未猜中
    print("--------------------------------------------------")
    print("游戏结束!很遗憾,您的尝试次数已全部用尽。")
    print(f"本次电脑设定的秘密数字是:{secret_number}")
    print("不要气馁,建议下次采用二分查找法(每次猜区间中间值)!")
    print("--------------------------------------------------")
    return False

if __name__ == "__main__":
    guess_number_advanced()
二分查找策略提示:在面对 1 到 100 的区间时,第一轮先猜中间值 50。若提示偏大,则目标必然在 1 ~ 49;第二轮猜 25;若提示偏小,则目标在 26 ~ 49,第三轮猜 37。依此类推,每次都能将候选范围削减一半,7 次以内必定能够锁定正确答案。

示例交互运行输出

以下展示该程序在控制台实际运行的一次完整测试记录(示例数据):

==================================================
       Python 猜数字挑战赛 (限定 7 次机会)       
  范围:1 ~ 100 之间,合理使用二分策略获胜! 
==================================================

[第 1 轮 | 剩余 7 次机会] 请输入数字: 50
【偏小】你猜的数字 50 太小了!目标数字更大。

[第 2 轮 | 剩余 6 次机会] 请输入数字: abc
【输入无效】检测到非整数输入,请输入合法数字!(本次输入不消耗机会)

[第 2 轮 | 剩余 6 次机会] 请输入数字: 75
【偏大】你猜的数字 75 太大了!目标数字更小。

[第 3 轮 | 剩余 5 次机会] 请输入数字: 62
【偏小】你猜的数字 62 太小了!目标数字更大。

[第 4 轮 | 剩余 4 次机会] 请输入数字: 68
【偏大】你猜的数字 68 太大了!目标数字更小。

[第 5 轮 | 剩余 3 次机会] 请输入数字: 65
**************************************************
恭喜胜利!您在第 5 轮成功猜中秘密数字:65!
**************************************************

五、工程实现总结与架构全景

通过实现猜数字游戏,开发者可以完整演练 Python 的核心语法知识:

Python猜数字游戏完整代码示例
图 4:猜数字游戏四大核心组件与知识总结

常见问题与注意事项排查表

现象 / 疑问 背后的原因 正确处理规范
输入非数字导致 ValueError 崩溃 直接对未过滤的 input() 执行 int() 强转。 使用 try...except ValueError 包裹强转逻辑,捕获异常后 continue。
random.randint(1, 100) 是否会包含 100? 会包含。randint(a, b) 是闭区间操作。 若需要半开半闭区间 [a, b),应改用 randrange(a, b)。
错误输入消耗了有效猜测机会 在输入校验前就执行了 attempts += 1。 确保计数器自增放在所有前置验证通过之后执行。
代码复用性与测试性不足 脚本代码平铺在文件顶层,无法在其他模块导入。 封装成函数并设置参数默认值,配合 if __name__ == '__main__': 入口调用。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表