24点游戏的Python实现代码总结 1. 代码功能概览import randomimport refrom collections import Counterimport timedef 算式是否规范(算式,所有的数字):global 游戏当前状态for 用户输入的除了数字以外的单个字符 in re.sub(r\d, , 算式):if 用户输入的除了数字以外的单个字符 not in -*/():游戏当前状态输入了不符合预期的字符return Falseif Counter(re.findall(r\d, 算式)) ! Counter(所有的数字):游戏当前状态 输入了错误的数字return Falsereturn 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()。