24点游戏python解法

一. 游戏介绍

棋牌类益智游戏,要求四个数字运算结果等于二十四,一起来玩玩吧!这个游戏用扑克牌更容易来开展。拿一副牌,抽去大小王后(初练也可以把J/Q/K/大小王也拿去),剩下1~10这40张牌(以下用1代替A)。任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号,高级玩家也可用乘方开方与阶乘运算)把牌面上的数算成24。每张牌必须用且只能用一次。如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24

二,问题分析

对于此类问题,最先考虑到的是穷举算法,也就是在计算机的算力范围内,通过每个结果的穷举,最终得除整个问题集合。
首先,对于只有数字,那么它的全排列有4!= 24种可能的排列情况。
然后是在其中插入运算符,由于只有三个运算符,那么三个运算符全排列的话也是 43 = 64种表示方法,两者再任意组合,那么就有了1536种计算结果。再加上运算过程中的括号,分别有一个括号两个括号两种分类,其中一个括号能有5种方式,分别是(a+b)+c+d,a+(b+c)+d,a+b+(c+d),(a+b+c)+d,a+(b+c+d) 两个括号能有1种方式,(a+b)+ (c+d),故总的只有一种。因此加起来是六种方法,总的算出来有9216种结果,因此完全可以靠穷举来获得结果。

三,主要算法

主要的算法就是表达式的计算,最开始想利用逆波兰表达式通过入栈出栈进行计算得到表达式的结果,但是通过查找资料发现,python种有一个表达式的计算函数,可以直接实现字符串表达式的计算,比如eval(‘8+9+10+11’) = 38,所以就不需要通过复杂的入栈出栈的操作来计算表达式的值。

次要的算法就是构建全排列的数字和字符表达式集合,python种可以通过iteratools来实现全排列的构建和使用,也可以使用穷举的办法来实现全排列的构建。本次程序使用循环来实现排列的构建。

四,具体步骤

初始化操作:
数据结构初始化:

    func = []func2 = []game = []result = []result2 = []result3 = []result4 = []evaluate = []# 产生随机数# nums = [randint(1,13) for i in range(4)]# 运算符集合operations = ['+','-','*','/']

游戏初始化

def gameInit():nums = [randint(1, 13) for i in range(4)]# 防止得出的数没有结果while gameStart(nums) == []:nums = [randint(1, 13) for i in range(4)]return nums

1,数字全排列

以每一种的排列方式作为一个列表,然后将其输入一个新的列表,也就是每一种数字的排列作为一个数字列表,然后直接用数字列表来操作。

# 数字全排列可能出现的组合for i in range(4):for j in range(4) :for k in range(4):for l in range(4):if i != j and i != k and i != l and j != k and j != l and k != l:func.append([nums[i],nums[j],nums[k],nums[l]])

2.运算符排列

同样的原理,但是基于运算符能够重复,于是乎就不用去限定下表是否相等,直接排列存在func2[]列表种就行

# 运算符全排列可能出现的组合for i in range(4):for j in range(4):for k in range(4):func2.append([operations[i],operations[j],operations[k]])

3.数字排列与运算符排列的两者相互混合

# 两者以一定的规则组合for num in func:# print(type(num))for ope in func2:num1 = num.copy()num1.insert(1,ope[0])num1.insert(3,ope[1])num1.insert(5,ope[2])result.append(num1)

4.加入一对括号的的排列

 # 括两个数的括号与表达式的介结合for i in range(0,5,2):for res in result:rescopy = res.copy()rescopy.insert(i,'(')rescopy.insert(i+4,')')result2.append(rescopy)# 括三个数的括号与表达式结合for  i in range(0,3,2):for res in result:rescopy = res.copy()rescopy.insert(i,'(')rescopy.insert(i+6,')')result3.append(rescopy)

5.加入两个括号的排列

 # 两个括号系列for res in  result:rescopy = res.copy()rescopy.insert(0,'(')rescopy.insert(4,')')rescopy.insert(6,'(')rescopy.insert(10,')')result4.append(rescopy)

6.综合整合

 # 合并并转化成字符串result = result2 + result3 + result4for res in result:res = [str(i) for i in res]# print(str(res))evaluate.append(''.join(res))# 计算表达式结果for eva in evaluate:try:if eval(eva) == 24:game.append(eva)except:pass

7.游戏的构建

# 正式游戏
def gameing():point = 0life = 3nums = gameInit()print("给出的四张牌为:" + str(nums))games = gameStart(nums)while life > 0:start = time.time()   # 获取开始时间game = input("请在120秒内输入你的运算式:")end = time.time() - start   # 获取结束时间if end > 120:               # 限制时间print("您已超时!")life = life - 1continuegamecopy = gamegamecopy = gamecopy.replace('J','11')# print(gamecopy)gamecopy = gamecopy.replace('Q','12')# print(gamecopy)gamecopy = gamecopy.replace('k','13')# print(gamecopy)if gamecopy in games:print("正确,进入下一题!")point = point + 20    # 加分nums = gameInit()    # 获取新的组合games = gameStart(nums)else:print("结果不正确!")life = life - 1nums = gameInit()    # 获取新的组合games = gameStart(nums)print("游戏结束,你的分数为:" + str(point))name = input("请输入你的名字,以便我们存入高分榜单")with open('TopList.txt','a') as file:file.write(name + str(point) + '\n')

五,游戏优化

1.全排列的产生的优化

利用itertools优化全排列的四个循环

import itertools
nums = [1,2,3,4]
alllist = []
for each_list in itertools.permutations(nums,4):str_list = [str(num) for num  in each_list]alllist.append(str_list)
print(alllist)

结果如下:

2.构造数字和运算符的混合表达式的优化

利用zip函数来实现两者的两两混合,其中定义的两个函数是用来获取所有的数字数列和操作符列表,可以在实际使用过程中替换。

def get_allNumList():return [['1','2','3','4'],['2','3','4','5']]def get_allOpeList():return [['+','-','*']]num_and_list_mixs = []
for str_list in get_allNumList():for op_list in get_allOpeList():op_list.append('')num_and_list_mix = zip(str_list,op_list)num_and_list_mixs.append(num_and_list_mix)print(num_and_list_mixs)

最终测试结果:

题目总结

解决一个算法问题的过程中,遵循以下规则:

  1. 分析算法问题
  2. 设计实际算法
  3. 算法优化

最后应该从多方面测试。

python24点游戏相关推荐

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

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

  2. python24点4张扑克_Python实现扑克24点小游戏 ,从此我就没输过

    24点游戏玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24. 我们用Python来完成24点游戏的程序设计!!从此站在赌神巅峰 我在拉斯维加斯等你 PS注意:很多人学 ...

  3. python24点计算器_Python实现24点游戏

    24点游戏是一款老少咸宜的益智游戏,游戏的玩法是给出任意四个数字,通过加减乘除四则运算,计算出24. 网上有很多24点游戏算法,找出解法并不难,但是难在如何合适地加括号和去除等价的重复表达式上. 1. ...

  4. Python游戏开发,pygame模块,Python实现打砖块小游戏

    前言: 本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 效果展示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdjcY4gn-16 ...

  5. Python游戏开发,pygame模块,Python实现过迷宫小游戏

    前言 今天为大家带来解闷用的过迷宫小游戏分享给大家好了.让我们愉快地开始吧~ 效果展示 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境 ...

  6. Python游戏开发,Python实现童年小游戏推箱子 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 上效果图 原理简 ...

  7. Python游戏开发,pygame模块,Python实现接水果和金币小游戏

    前言 利用python制作一个接水果和金币的小游戏,让我们愉快地开始吧~ 效果图 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安 ...

  8. Python游戏开发,pygame模块,Python实现恐龙跳一跳小游戏

    前言: 本期我们将仿制一个Chrome浏览器里隐藏多年的彩蛋小游戏,即"恐龙跳一跳"(当然一般都叫它T-Rex Rush). 让我们愉快地开始吧~ 效果图 在Chrome浏览器地址 ...

  9. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

最新文章

  1. Docker应用的四个关键设计因素
  2. 虚方法(virsual method)
  3. java 检测表情符号_一个能在字符串中识别出 Emoji 的简单工具 (支持JavaScript和Java)...
  4. php version 5.5.17-1~dotdeb.1,Ubuntu 12.04使用Dotdeb安装PHP5.4 / Nginx1.4/Redis2.6等新版本
  5. 【SpringCloud】服务网关 gateway 和 zuul
  6. Navicat Report Viewer 如何连接到 MySQL 数据库
  7. python批量更改图片尺寸(保持长度和高度的长短关系)
  8. java初级开发一系列的工具安装配置
  9. Windows Mobile 获得 MAC,IP,IMEI,IMSI
  10. Java设计模式之模板(template)方法模式
  11. Canvas API
  12. 解决octavia failed to run
  13. 2020年7月19日训练总结
  14. rabbitmq中交换机类型direct和topic的区别
  15. 一次ffmpeg -c copy 在avformat_write_header函数处报错:Could not find tag for codec rawvideo in stream #0的原因分析
  16. C++ 多态(动态多态)
  17. 4/20 Fizz Buzz(412)
  18. 10款最佳的Linux文件比较工具
  19. 杰理之麦克风(混响)无法调数字音量解决方法【篇】
  20. Telegram学习解析系列(一):认识一下Telegram的源码

热门文章

  1. WhbtomT(半路出家) 的每日英语 收集 (四)
  2. 数学计算机 分数乘法,分数乘法的计算方法
  3. 计算机图形学笔记 || 基本图形的扫描转换
  4. 盘古开源资讯:夯实产业基础,打造汽车电子芯片产业高地
  5. 计算机学生英语面试自我介绍ppt,【英语自我介绍ppt】_大学生英语自我介绍ppt...
  6. 1024程序员节前夕,Bug与Debug的随笔
  7. vxWorks6.6下基于vxBus的以太网驱动开发
  8. 备案提示 尊敬的ICP用户: 您的短信核验失败,请您重新验证
  9. 亚马逊获取买家信息,店铺申请,ERP系统,MWS迁移SPAPI,SPAPI注册,PII权限获取
  10. 金融伦理学(Financial Ethcs)笔记