24点游戏(python)

article/2025/10/24 9:55:29

24点游戏(python)

一、题目要求
1.问题描述
24点游戏是经典的纸牌益智游戏。常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
2.基本要求
随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
(1)程序风格良好(使用自定义注释模板)
(2)列出表达式无重复。
3.提高要求:
用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
(1) 程序风格良好(使用自定义注释模板)
(2)使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
(3)所有成绩均可记录在TopList.txt文件中
二、算法设计
1.题目分析
基本要求:
24点游戏,一共使用52张牌,4种花色,因此使用13张不同数字和字母的扑克即可。
(1)抽牌阶段:将13张牌打乱,从13张随机可重复抽取4张牌,即可模拟从52张牌中不可重复抽4张牌,完成抽牌阶段。
(2)计算阶段:对4个数和计算要用的运算符进行排列组合,在适当的位置加上括号进行计算,判断计算结果是否为24,将结果为24的表达式输出即可。
提高要求:
(1)抽牌阶段:将13张牌打乱,从13张随机可重复抽取4张牌,即可模拟从52张牌中不可重复抽4张牌,完成抽牌阶段。
(2)输入阶段:在输入提示后开始计时,若计时结束尚未作答则生命值-1,重新进行游戏,在规定时间内输入正确表达式
(3)计算阶段:将输入的表达式进行计算,并进行正确性验证,若等于24,则分数+1,继续进行游戏,若不等于24,则生命值-1,继续游戏
(4)若生命值为0,则游戏结束,将用户命和分数保存至指定的txt文件中

2.算法设计
基于Python3.7
(1)抽牌阶段:将13张牌的数值和字母存入列表中,并给字母赋特定的值,利用random.shuffle()函数将整个列表打乱,模拟洗牌过程;random.choice()从列表中随机选取元素,利用此函数和for语句组成列表推导式,随机拿出4个数,模拟抽取4张牌。
(2)计算阶段:利用itertools.permutations()函数对随机出来的4个数进行全排列,可替代用4次for语句进行排列,同时更好的解决了排列组合的元素重复性问题,将所有可能性存在列表中;利用 itertools.product ()函数对运算符也进行全排列,每个运算符可重复,在运算过程中只需要用3个运算符,在存入列表之后将最后一个删去即可;利用for语句将4个数字和3个运算符进行排列组合,将表达式转化成字符串,利用eval()对字符串进行求值,利用try和except将计算中的异常(除数为0)忽略。将值为24的所有表达式输出。
(3)在提高要求中,定时器需要用的多线程,利用threading.Thread()创建一个计时器的线程,用来控制输入时长
三、算法示意图
在这里插入图片描述
24点计算器流程图:
在这里插入图片描述
24点小游戏:
在这里插入图片描述
四、主要代码

"""24点游戏是经典的纸牌益智游戏
功能:1.随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式.2.用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
作者:Qixiang.Su修改历史:1.  2019-04-08      创建项目,实现基本框架2.  2019-04-10     完成各项功能,并完善
"""
import random
import itertools
def getallresult():list_card = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']A = 1J = 11Q = 12K = 13random.shuffle(list_card)  # 洗牌print(list_card)list_operator = ['+', '-', '*', '/']       #运算符list_four =[random.choice(list_card) for i in range(4)]  #随机取出4张牌print("你获得以下四张牌:")print(list_four)            #输出四张牌的值result_list = []          #储存四张牌全排列的列表# set() 用于去除重复的排列,itertools.permutations()用于生成全排列的各个组合for i in set(itertools.permutations(list_four, len(list_four))):result_list.append(list(i))result_list1 = []  #存储四个运算符的列表for j in set(itertools.product(list_operator,repeat=  4)):templist = list(j)templist.pop()    #在实际运算过程中,4个数只需要3个运算符,删掉最后一个运算符,保留3个运算符if templist not in result_list1:result_list1.append(templist)expression_list = []    #存放各个符合条件的表达式count = 0               #计数器for i in result_list:for j in result_list1:expression1 = str(i[0]) + j[0] + str(i[1]) + j[1] + str(i[2]) + j[2] + str(i[3])    #将各个数都转化为str类型#捕获异常,此处可能出现的是除数为0的异常try:result = eval(expression1)except:result = 0if result == 24:expression_list.append(expression1 + '=' + str(result))count += 1else:expression2 = '(' + str(i[0]) + j[0] + str(i[1]) + ')' + j[1] + str(i[2]) + j[2] + str(i[3])try:result = eval(expression2)except:result = 0if result == 24:expression_list.append(expression2 + '=' + str(result))count += 1else:expression3 = str(i[0]) + j[0] + '(' + str(i[1]) + j[1] + str(i[2]) + ')' + j[2] + str(i[3])try:result = eval(expression3)except:result = 0if result == 24:expression_list.append(expression3 + '=' + str(result))count += 1else:expression4 = str(i[0]) + j[0] + str(i[1]) + j[1] + '(' + str(i[2]) + j[2] + str(i[3]) + ')'try:result = eval(expression4)except:result = 0if result == 24:expression_list.append(expression4 + '=' + str(result))count += 1           #计算结果为24则计数+1print("如下结果:")for each in expression_list:print(each)                #列出每一种可能的表达式print('一共有%d个表达式' % count)
def playgame():n = 3print("您共有", end="")print(n, end="")print("次机会")score = 0while (n > 0):print("当前得分", end="")print(score)list_card = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']A = 1J = 11Q = 12K = 13random.shuffle(list_card)  # 洗牌print(list_card)list_operator = ['+', '-', '*', '/']           #运算符列表list_four = [random.choice(list_card) for i in range(4)]        #随机四张牌print(list_four)str_result = str(input("请将上述四张扑克牌的点数凑成24点(请输入表达式):"))if eval(str_result) != 24:n -= 1if n == 0:print("机会已经用完,游戏结束!")str_name = input("请输入您的尊姓大名,存入排行榜:")f = open('TopList.txt','a')f.write(str_name)f.write("\t")f.write(str(score))f.write("\n")breakelse:# 回答错误机会-1print(str_result + "=", end="")print(eval(str_result))print("回答错误,您还剩", end="")print(n, end="")print("次机会,请继续您继续游戏")else:score += 1print("回答正确,得分+1,请继续")
flag = 0
while(flag==0):print("请选择您要进行的操作的序号:")print("1.24点计算器")print("2.进行24点小游戏")print("3.退出程序")want = int(input())if want == 1:getallresult()flag = 0elif want == 2:playgame()flag = 0elif want == 3:flag = 1else:want = 0

关于输入计时的多线程代码并不完善,所以没有给出。

五、调试和测试
1.出现错误及解决方法
(1)出现错误:在计算字符串表达式值。出现了除数为0的情况,如下:
在这里插入图片描述
解决方案:对计算字符串表达式值得式子进行异常捕获,将出现的异常忽略,保证程序正常运行,具体如下:在这里插入图片描述
(2)出现错误:在24点小游戏中,对输入进行计时,采用单一线程时,出现错误,要么倒计时结束才能进行输入,要么输入完成之后才能进行计时。
(2)解决方法:添加一个线程,用来倒计时。计时和输入同时进行。因为程序设计时并未考虑多线程问题,在添加线程之后,程序存在设计上的漏洞(未解决)。
(2)解决方法:不采用多线程,在输入前计时,输入完成后计时,求出所用时间,然后判断时间长短。但这样并未做到正真意义上对输入进行计时。
2.运行结果图
24点计算器:
在这里插入图片描述
在这里插入图片描述
24点小游戏:
输入错误之后,生命值-1,游戏继续,如下:
在这里插入图片描述
输入的表达式正确,得分+1,游戏继续,如下:
在这里插入图片描述
机会用完后,输入姓名,将成绩计入指定txt文件中,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
六、总结
通过本次编程,了解了更多python中功能强大的库,更好的解决了本次程序中的问题。同时也体会到了程序结构对程序功能的影响。也对程序的多线程有了一定的了解,在对数字进行排列组合的时候,不能通过多重循环得到所有所需结果,通过查询资料了解到了itertools库可直接对结果进行各种想要的排列组合形式。在解决问题的过程中,python提供了很多功能强大的库解决实际问题,还需要对常用的库进行更多了解。认识到了自身存在的一些不足,在程序设计的结构上存在一些缺陷,使得程序的修改变得很困难,在以后的程序设计上应该对结构进行优化。


http://chatgpt.dhexx.cn/article/MqN0BqhO.shtml

相关文章

用java实现24点游戏

前言 用java实现24点游戏 Welocome to Xiang’s world~ 题目ღ( ・ᴗ・ ) 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11&am…

C++ 实现计算24点

原理 暴力枚举所有的情况,运算符号4个,加减乘除 - * / ,整数数字4个(易扩展为5个数或者更多)。所需要枚举的次数: 数字顺序:4个数的全排列,4! 24。运算符号:4个数需要…

计算机上的24点游戏怎么玩,趣味算数二十四点游戏规则怎么玩技巧

概述:这是一个算数游戏,用四张牌计算得出24。 时间:20分钟 人数:集体参与 目的:锻炼学员的快速计算能力。 道具:扑克牌 步骤: 1.去点大小王,“K”计13点,“Q”计12点&…

【编程|二十四点】关于编程解决二十四点的两种思路

【编程心得系列*24点】 写在前面:编程心得系列不谈具体问题的代码,只谈解决思路。 这是一个关于二十四点的软件。属于典型的先有目的再有初衷的软件。 在此之前我倒是写过一个解数独的软件。但那个的核心代码部分毕竟是抄袭的。这次是觉得对自己更有信…

计算机二十四点游戏怎么玩,扑克牌二十四点怎么玩?扑克牌二十四点游戏规则介绍...

扑克牌二十四点是在国际上很流行的一种扑克游戏玩法,因为游戏计算性较强,较为考验的玩家的心算能力,所以很受扑克玩家的喜爱,那么扑克牌二十四点到底是怎么玩的呢?扑克牌二十四点的游戏规则又是什么呢?下面…

CCF计算机软件能力认证试题练习:201903-2 二十四点

二十四点 来源:CCF 标签: 参考资料: 相似题目: 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运…

asdasdas

asdasdasdsadassad 阅读全文: http://gitbook.cn/gitchat/activity/5d634f8c5cbc425420e0e72f 您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

dsada

图2.2 www.sina.com网站系统采用的基本上就是图2.2所示的架构,不同地区的人们在访问www.sina.com站点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器,湖北…

Asdasd

这里写阿阿萨德斯达四大自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义…

dsa-基础

算法与数据结构 0.概念数据结构复杂度时间复杂度空间复杂度 1. 线性表顺序表(数组)链表单链表双链表循环链表静态链表 顺序表/链表栈顺序栈链式栈 队列顺序循环队列链表队列双端队列 2. 递归递归与栈阶乘例子 3. 矩阵对称矩阵三角矩阵稀疏矩阵 4. 字符串 0.概念 数据结构 逻辑…

dsadas

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

DSDA 简介

参考link:千呼万唤,5G双卡双通到底有多重要?__财经头条 (sina.com.cn)

Java 排序算法:折半插入排序

有关排序的基本内容可以查看以下链接: 折半插入排序_360百科折半插入排序,折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。https://baike.so.com/doc/7028767-7251672.h…

Java排序算法——猴子排序(Bogo Sort)

此排序和之前介绍的三种排序没有任何关系,只是单纯在整理排序算法突然想到曾经看到过关于此排序的描述,现在总结一下。 之前三种排序的传送门开一下: 冒泡排序: Java排序算法——冒泡排序(Bubble Sort)ht…

java排序算法精讲

排序算法 概要一、冒泡排序概念实现步骤 代码 二、选择排序概念实现步骤 代码 三、插入排序概念实现步骤 代码 四、快速排序概念实现步骤 代码 五、归并排序概念实现步骤 代码 六、堆排序概念实现步骤 代码 总结以二维表表现出各个排序的关系 概要 Java是一种面向对象的编程语言…

Java排序算法(一):冒泡排序

冒泡排序 一、原理二、排序步骤三、实现代码四、复杂度分析 一、原理 冒泡排序是相邻的元素两两比较,把小的元素往前调或者把大的元素往后调,实现最大(小)值排列在一端。 注:相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法 …

十大经典排序算法(Java实现)

排序算法的重要性不言而喻,为了加深对这十种算法的理解,固写此文。 目录 1、冒泡排序(Bubble Sort)2、选择排序(Selection Sort)3、插入排序(Insertion Sort)4、希尔排序&#xff0…

Java排序算法——插入排序(Insertion Sort)

之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法——冒泡排序(Bubble Sort)https://blog.csdn.net/babbfqb93/article/details/…