1. 代码功能概览

import random
import re
from collections import Counter
import time

def 算式是否规范(算式,所有的数字):
    global 游戏当前状态
    for 用户输入的除了数字以外的单个字符 in re.sub(r'\d+', '', 算式):
        if 用户输入的除了数字以外的单个字符 not in "+-*/()":
            游戏当前状态='输入了不符合预期的字符'
            return False
    if Counter(re.findall(r'\d+', 算式)) != Counter(所有的数字):
        游戏当前状态 = '输入了错误的数字'
        return False
    return True

游戏进行=True
一副去除了大小王的扑克牌=['1','2','3','4','5','6','7','8','9','10','11','12','13','1','2','3','4','5','6','7','8','9','10','11','12','13','1','2','3','4','5','6','7','8','9','10','11','12','13','1','2','3','4','5','6','7','8','9','10','11','12','13']
print('24点游戏,输入完整的算式,必须包括所有显示的数字各一个,可以包括运算符号"+"、"-"、"*"、"/"、"("、")"。表达的算式的结果为24即胜利。\n输入"重新开始"后将重新开始。\n输入"退出"后在5秒后退出。')

while 游戏进行:
    运算结果是否正确=False
    游戏当前状态 = '出现了未知的错误'
    所有的数字=random.sample(一副去除了大小王的扑克牌,4)
    用户输入=input(f'当前数字为{所有的数字[0]},{所有的数字[1]},{所有的数字[2]},{所有的数字[3]},请输入:')
    if 用户输入=='重新开始':
        游戏当前状态 = '已重新开始'
    elif 用户输入=='退出':
        游戏进行=False
        游戏当前状态 = '即将于5秒后退出'
    elif 算式是否规范(用户输入,所有的数字):
        try:
            运算结果是否正确=(eval(用户输入)==24)
            if 运算结果是否正确:
                游戏当前状态 = '恭喜!你的计算正确!'
            else:
                游戏当前状态 = '运算错误'
        except Exception:
            运算结果是否正确 = False
            游戏当前状态 = '语法错误'
    print(游戏当前状态)
time.sleep(5)

这段 Python 代码实现了一个命令行交互式的 24 点游戏。程序从一副去除了大小王的扑克牌中随机抽取 4 张(数字 1~13),玩家需要输入一个包含这 4 个数字各一次的算术表达式,使其结果等于 24。输入必须使用加、减、乘、除和括号,程序会对输入进行格式与数字正确性校验,并利用 eval() 求值判定是否胜利。游戏还支持"重新开始"与"退出"控制。

2. 主要模块与逻辑

2.1 输入校验函数

算式是否规范(算式, 所有的数字) 是整个游戏的核心校验逻辑,它通过两个步骤过滤非法输入:

  • 字符合法性检查:使用正则 re.sub(r'\d+', '', 算式) 去掉数字后,检查剩余字符是否全在 +-*/() 中,若出现其他字符则标记 游戏当前状态='输入了不符合预期的字符' 并返回 False。
  • 数字一致性检查:通过 Counter(re.findall(r'\d+', 算式)) 统计表达式中出现的数字及其次数,与当前抽取的 所有的数字 对比,如果不一致(如遗漏或重复使用)则标记 游戏当前状态='输入了错误的数字' 并返回 False。

校验通过后返回 True,允许进入求值阶段。

2.2 游戏主循环

游戏在 while 游戏进行: 循环中运行,主要步骤为:

  1. 生成随机数字:使用 random.sample(一副去除了大小王的扑克牌, 4) 从长度为 52(包含 4 组 1~13)的牌组中抽取 4 个不重复的数字。
  2. 接收用户输入:通过 input() 提示当前四个数字,并获取玩家输入的算式或命令。
  3. 命令处理:若用户输入 重新开始,则更新状态为已重新开始,进入下一轮;若输入 退出,则将 游戏进行 置为 False,并在等待 5 秒后结束程序。
  4. 输入校验与求值:调用 算式是否规范() 进行校验,通过后使用 eval(用户输入) 计算表达式值,与 24 比较并设置对应的游戏状态(成功、运算错误或语法错误)。
  5. 打印状态:每轮结束后打印 游戏当前状态 提示玩家结果。

2.3 游戏结束与延迟

退出命令触发 游戏进行 = False 后,循环结束,调用 time.sleep(5) 等待 5 秒,程序才会最终退出。这给了玩家一个“即将退出”的缓冲时间。

3. 代码特点与评价

  • 优点:用中文变量名和函数名使逻辑直白易懂;输入校验避免了大部分非法或错误输入;利用 eval() 直接求值简化了表达式解析;整体流程清晰,适合 Python 初学者理解循环、异常处理和正则的应用。
  • 改进空间eval() 存在安全风险,若用户输入恶意代码可能被直接执行;抽牌逻辑使用了 52 张牌的列表但名称暗示"去除了大小王",实际并未真正去除(1~13 循环了四次);校验函数通过修改全局变量 游戏当前状态 返回布尔值,耦合度较高;提示数字的顺序和表达式中数字的顺序并未强制匹配,可能引起歧义。

4. 总结

这段代码以直观的方式演示了如何使用 Python 打造一个简单的小游戏,涵盖了输入处理、正则表达式、计数器比较、异常处理以及时间控制等知识点。在学习过程中,可以在此基础上进一步优化安全性与用户体验,例如用 ast.literal_eval() 或自行实现表达式解析来替代 eval()

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐