news 2026/7/19 2:03:14

24点游戏的Python实现代码总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
24点游戏的Python实现代码总结

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()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 2:02:17

C#实现邮件发送功能全解析与实战技巧

1. 为什么选择C#实现邮件发送功能?在众多编程语言中,C#因其强大的类库支持和简洁的语法特性,成为实现邮件发送功能的理想选择。.NET Framework自带的System.Net.Mail命名空间提供了完整的SMTP协议实现,开发者无需处理底层网络通信…

作者头像 李华
网站建设 2026/7/19 2:01:09

2026新学期选课堂录音工具,这3个实用挑选标准帮你避坑

2026新学期选课堂录音工具,核心要解决三个常见痛点:录完音转文字错漏多、整理复习费时间、操作复杂耽误事。这里给你三个实用挑选避坑标准,还按场景适配度整理了工具清单,适合喜欢尝试新效率工具的学生党按需挑选,避开…

作者头像 李华
网站建设 2026/7/19 2:00:05

Spring Cloud与Spring Boot版本匹配指南

1. Spring Cloud与Spring Boot版本匹配的核心逻辑 Spring Cloud本质上是一套基于Spring Boot的微服务工具集,这种设计架构决定了二者版本必须严格匹配。就像手机系统和APP的关系——新系统可能不兼容老APP,而老系统又无法运行新APP的功能。Spring Cloud…

作者头像 李华
网站建设 2026/7/19 1:59:51

从用户点餐到订单完成:一个外卖请求如何穿越SpringBoot项目

想象你打开一个外卖APP,从浏览菜品到吃上热乎饭,整个过程在程序世界里要经过几十个"岗位"的协同配合。下面我们就跟着一份订单的旅程,把"苍穹外卖"这个SpringBoot项目的每个角落都走一遍。第一章 用户还没来——餐厅开门…

作者头像 李华
网站建设 2026/7/19 1:57:01

3步掌握《经济研究》LaTeX模板:新手友好的终极排版指南

3步掌握《经济研究》LaTeX模板:新手友好的终极排版指南 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 想要让你的经济学论文瞬间…

作者头像 李华
网站建设 2026/7/19 1:54:04

Hi3516EV200嵌入式开发环境搭建与配置指南

1. Hi3516EV200开发环境概述 Hi3516EV200是海思半导体推出的一款高性能视频处理芯片,广泛应用于安防监控、智能门禁等嵌入式视觉领域。作为一款ARM架构的SoC,其开发环境配置与传统x86平台存在显著差异,核心在于交叉编译工具链的搭建。 这块芯…

作者头像 李华