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提供了很多功能强大的库解决实际问题,还需要对常用的库进行更多了解。认识到了自身存在的一些不足,在程序设计的结构上存在一些缺陷,使得程序的修改变得很困难,在以后的程序设计上应该对结构进行优化。

24点游戏(python)相关推荐

  1. 24点游戏python版

    24点游戏python版 问题描述与规则 24点游戏是经典的纸牌益智游戏.常见游戏规则:从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表 ...

  2. 24点游戏python编程代码和运行结果_编程实现24点游戏,我发现自己总是输是有原因的...

    你有玩过24点游戏吗? 两个人轮流从一副扑克牌(不包含鬼牌)中抽牌至有四张手牌为止,利用四张牌上的数字通过加减乘除运算先得出24点的玩家获胜. 一.24点游戏有解的概率 细想一下24点的规则可以发现, ...

  3. python游戏开发步骤_详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  4. 用python代替人脑运算24点游戏

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:老方玩编程 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  5. 详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  6. Python版24点游戏

    24点游戏是指随机选取4张扑克牌(不包括大小王),然后通过四则运算来构造表达式,如果表达式的值恰好等于24就赢一次.下面的代码定义了一个函数用来测试随机给定的4个数是否符合24点游戏规则,如果符合就输 ...

  7. 24点游戏的递归解法和Python实现

    24点游戏的递归解法和Python实现 目录 24点游戏的递归解法和Python实现 什么是24点游戏 递归思路 递归 24点问题的递归思路 Python代码实现 四则运算下无解的组合 总结 什么是2 ...

  8. python编写24点游戏

    1.题目要求 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决2 ...

  9. 基于Python制作的24点游戏生成器

    资源下载地址:https://download.csdn.net/download/sheziqiong/85796930 资源下载地址:https://download.csdn.net/downl ...

  10. Python快速计算24点游戏并获取表达式

    24 点游戏规则 有4个范围在 [1,9] 的数字,通过「加.减.乘.除」四则运算能够获得24,认为有解. 4个范围在 [1,9] 的数字能够产生495种可能,其中404中组合情况都是有解的,有解概率 ...

最新文章

  1. MySQL中truncate误操作后的数据恢复案例
  2. cefsharp 手机模式_微信“蓝光模式”保护眼睛
  3. 释疑の函数POPUP_TO_CONFIRM
  4. oracle open for using的用法,oracle OPEN FOR [USING] 语句
  5. 调查显示:被黑过的公司难以找到投资
  6. 面向对象程序设计上机练习五(类和对象)
  7. [转载] python indices_Python numpy.indices() 使用实例
  8. java 实例化xpath_Java XPath示例教程
  9. 团队博客 第三周 设计类图
  10. redis windows切割日志文件_开发者笔记:Windows下搭建简易单机Redis集群测试环境...
  11. 《软件评测师教程》读书心得 一
  12. atx20pin电源短接_ATX电源20针及24针接口定义
  13. 红警ol服务器维护中1003,红警OL频繁掉线怎们么办 网络断开连接解决办法
  14. 游戏的现实规则和非现实规则
  15. 浅谈Redis延迟测试方法
  16. 数学模型天气预测方法_预测即将到来的天气的新方法
  17. 0x0000050蓝屏srvsys_蓝屏代码0x00000050的原因及解决方法
  18. 如何查看本机JDK版本-windows系统
  19. 李宏毅_机器学习_作业1(详解)_COVID-19 Cases Prediction (Regression)
  20. SaaS化MR直播正式上线!保利威开启轻量化虚拟直播时代

热门文章

  1. 17岁少年攻击航司系统获刑,网络攻击猖獗如何破?
  2. DQN-FlappyBird项目学习
  3. WEBTIMER控件研究的心得:WebTimer的启示
  4. 网站备案必须有服务器吗,域名备案必须有服务器吗
  5. dumprep.exe遇到无效指令
  6. 线性规划中的对偶(Duality in linear programs)
  7. homepod换wifi网络_HomeKit的最佳入口——HomePod使用体验
  8. Memcached damo
  9. Android APP的沉浸式体验
  10. sdcc 存储类型关键字