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 游戏进行:循环中运行,主要步骤为:
- 生成随机数字:使用
random.sample(一副去除了大小王的扑克牌, 4)从长度为 52(包含 4 组 1~13)的牌组中抽取 4 个不重复的数字。 - 接收用户输入:通过
input()提示当前四个数字,并获取玩家输入的算式或命令。 - 命令处理:若用户输入
重新开始,则更新状态为已重新开始,进入下一轮;若输入退出,则将游戏进行置为 False,并在等待 5 秒后结束程序。 - 输入校验与求值:调用
算式是否规范()进行校验,通过后使用eval(用户输入)计算表达式值,与 24 比较并设置对应的游戏状态(成功、运算错误或语法错误)。 - 打印状态:每轮结束后打印
游戏当前状态提示玩家结果。
2.3 游戏结束与延迟
退出命令触发游戏进行 = False后,循环结束,调用time.sleep(5)等待 5 秒,程序才会最终退出。这给了玩家一个“即将退出”的缓冲时间。
3. 代码特点与评价
- 优点:用中文变量名和函数名使逻辑直白易懂;输入校验避免了大部分非法或错误输入;利用
eval()直接求值简化了表达式解析;整体流程清晰,适合 Python 初学者理解循环、异常处理和正则的应用。 - 改进空间:
eval()存在安全风险,若用户输入恶意代码可能被直接执行;抽牌逻辑使用了 52 张牌的列表但名称暗示"去除了大小王",实际并未真正去除(1~13 循环了四次);校验函数通过修改全局变量游戏当前状态返回布尔值,耦合度较高;提示数字的顺序和表达式中数字的顺序并未强制匹配,可能引起歧义。
4. 总结
这段代码以直观的方式演示了如何使用 Python 打造一个简单的小游戏,涵盖了输入处理、正则表达式、计数器比较、异常处理以及时间控制等知识点。在学习过程中,可以在此基础上进一步优化安全性与用户体验,例如用ast.literal_eval()或自行实现表达式解析来替代eval()。