题目说明:

24点游戏是经典的纸牌益智游戏。

常见游戏规则:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1), 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。

解题思想:

  1. 生成4个符合要求的随机数
  2. 对4个随机数进行全排列
  3. 对‘+’、‘-’、‘×’、‘÷’进行全排列
  4. 通过拼凑的方式构造表达式
  5. 计算表达式,将满足运算结果为24的表达式打印出来

解题步骤:

1.生成4个符合要求的随机数

对于python来说,生成随机数一般都是通过导包来实现,在这里需要用到的包是random

random.randrange(stop)  
random.randrange(startstop[, step]) Return a randomly selected element from range(start, stop, step).
random.randint(ab) Return a random integer N such that a <= N <= b.

我所用到的是random.randint(ab)函数,使用它生成4个1-14的数字作为模拟抽取的卡牌

2.对4个随机数进行全排列

对随机数进行全排列可以使用python自带的包(itertools)或者自己写一个递归函数实现相同功能都可以,这里使用的是itertools进行随机数的全排列

itertools实现全排列

递归实现全排列:https://blog.csdn.net/zhoufen12345/article/details/53560099

详细代码:

def generateNumberList(numbers):result_list = []count = 0# set() 用于去除重复的排列,itertools.permutations()用于生成全排列的元组for each_tuple in set(itertools.permutations(numbers, len(numbers))):result_list.append(list(each_tuple))count += 1return result_list

3.对‘+’、‘-’、‘×’、‘÷’进行全排列

对4种运算符的全排列和数字的全排列几乎一样,但是因为是4个数字进行计算,所以只会用到3个运算符,所以在后期处理上只需要将最后一个运算符删除即可

详细代码:

def generateOperatorList(operators):result_list = []count = 0# set() 用于去除重复的排列,itertools.permutations()用于生成全排列的元组for each_tuple in set(itertools.permutations(operators, len(operators))):templist = list(each_tuple)templist.pop()result_list.append(templist)return result_list

4.通过拼凑的方式构造表达式

对生成的数字全排列列表和预算符全排列列表只需要交替的插入即可构造一个只有数字和“+、-、×、÷”的运算表达式,但这样构造的表达式不够多样,存在很多不满足运算结果等于24的情况,所以应当引入括号运算,保证运算的多样性。

在加入括号后可以尽可能多的产生满足计算结果等于24的表达式,但是也会出现很多相同的表达式

例如:

4+4+8+8=24

(4+4)+8+8=24

4+(4+8)+8=24

所以为了避免出现这样的情况,应当设置合适的条件来添加括号。如果一个表达式不是按照顺序计算的,那么在这个表达式中加入括号将有可能改变表达式最后的运算结果,为了避免加入括号后不能改变运算结果的情况,所以应当先判断改表达式在不添加括号的情况下结果是否等于24,否在添加括号

例如:

9+2×6+3=24

9+(2×6)+3=24

5.计算表达式,将满足运算结果为24的表达式打印出来

计算表达式可以通过两两计算得到结果再进行两两计算,但在python中提供了一种更加简单和快捷的计算表达式结果的方法

eval(expressionglobals=Nonelocals=None)

The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.

eval函数的详细使用方法

在使用eval函数进行计算表达式时,有时会遇到表达式除数为0的情况,在python中这样的表达式是不合法的,程序会抛出异常导致整个代码的运行终止,为了避免这种情况,应当在有计算表达式的代码出添加异常处理机制,当程序抛出除数为0的异常时即使处理,使得整个代码能够继续运行完

详细代码(构造表达式+计算表达式):

def insertParentheses(number_list, operator_list):count = 0expression_list = []for each_number_list in number_list:for each_operator_list in operator_list:expression1 = str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) \+ each_operator_list[1] + str(each_number_list[2]) + each_operator_list[2] + \str(each_number_list[3])try:result = eval(expression1)except:result = 0if result == 24:expression_list.append(expression1 + '=' + str(result))count += 1else:expression2 = '(' + str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) + ')' \+ each_operator_list[1] + str(each_number_list[2]) + each_operator_list[2] + \str(each_number_list[3])try:result = eval(expression2)except:result = 0if result == 24:expression_list.append(expression2 + '=' + str(result))count += 1else:expression3 = str(each_number_list[0]) + each_operator_list[0] + '(' + str(each_number_list[1]) \+ each_operator_list[1] + str(each_number_list[2]) + ')' + each_operator_list[2] + \str(each_number_list[3])try:result = eval(expression3)except:result = 0if result == 24:expression_list.append(expression3 + '=' + str(result))count += 1else:expression4 = str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) \+ each_operator_list[1] + '(' + str(each_number_list[2]) + each_operator_list[2] \+ str(each_number_list[3]) + ')'try:result = eval(expression4)except:result = 0if result == 24:expression_list.append(expression4 + '=' + str(result))count += 1for each in expression_list:print(each)print('一共有%d个表达式' % count)

运行截图:

因为在处理时没有考虑位置而引起的重复,此处默认位置不同也是不同的表达式,如果想要去掉这种重复还请自行解决

源代码下载:https://download.csdn.net/download/xust_kevin/10702176

24点游戏实现-详细步骤相关推荐

  1. 见缝插针小游戏制作详细步骤

    详细步骤 1:打开unity,创建一个2D项目,创建一个放代码的文件夹叫Script,创建一个放预制体的文件夹叫prefab.以后的代码都放在Script文件夹里.预制体都放在prefab文件夹里. ...

  2. 一文带你了解对游戏外挂的逆向分析的详细步骤。

    详细的逆向分析步骤,可以点击下面文字链接进行查看. 链接:游戏外挂样本逆向详细步骤

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

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

  4. 24点游戏详细截图介绍以及原型、Alpha、Beta对比

    原型设计 图片展示 功能与界面设计 1.登录注册 2.手机号验证 3.24点游戏 4.粉色系女生界面 Alpha 图片展示 功能与界面设计 1.24点游戏 2.背景音乐 3.可查看多种可能的答案 4. ...

  5. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  6. redis3.0.0 集群安装详细步骤

    2019独角兽企业重金招聘Python工程师标准>>> redis3.0.0 集群安装详细步骤 博客分类: 缓存 Redis集群部署文档(centos6系统) (要让集群正常工作至少 ...

  7. redis3.0.2 分布式集群安装详细步骤

    redis3.0.2 分布式集群安装详细步骤 --(centos5.8 X64系统) 版本历史 时间 版本 说明 编写者 2015-06-5 1.0 redis3.0.2 分布式集群安装详细步骤 cs ...

  8. CAS_SSO单点登录实例详细步骤(转)、Tomcat ssl(https) 配置

    CAS_SSO单点登录实例详细步骤(转).Tomcat ssl(https) 配置 博客分类: SSO&CAS&Identity Java.Tomcat 0, 从CAS官网下载最新版本 ...

  9. 【JAVA SERVLET 开发系列之二】创建WEBAPP详细步骤,通过SERVLET实现HTTP简单交互

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/java-servlet/853.html ...

最新文章

  1. 计算机专业建设思路和措施,计算机网络专业教学改革与建设思路措施
  2. oracle建库及plsql建表空间的用法
  3. C++Primer学习之一引用和指针
  4. 【Python】Python中的关键字
  5. tensorflow: deep_dream代码及原理分析
  6. 计算机网络相关词汇,计算机网络英语词汇
  7. 提供通达信level2逐笔还原逐笔成交ticks导出提取工具
  8. Java项目:企业固定资产管理系统(java+SpringBoot+VUE+maven+mysql)
  9. PS 色彩平衡之算法公式原理详解及 Python 实现
  10. 用python画一只加拿大电鳗
  11. qtxlsx读写 excel
  12. Nvidia GPU 最新计算能力表(CUDA Compute Capability)
  13. 服务器开机屏幕无显示问题
  14. 夜神模拟器链接不上ADB问题
  15. 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
  16. 麒麟系统挂载文件、麒麟系统挂载windows共享文件夹
  17. QTreeView使用总结1,一个简单示例
  18. 【算力网络】算力网络的技术创新——算网一体关键技术
  19. 实习笔记Day11(2022.8.19)
  20. chm文档打开空白问题解决方案

热门文章

  1. Linux的Ubuntu系统常用命令
  2. mysql查询数据会不会锁表_mysql select是否会锁表 ?
  3. 【Python】韦伯分布的拟合
  4. AHRS基础知识(旋转矩阵(四元数)、向量叉乘、哥氏定理、四元数运算法则)
  5. 微信美食菜谱小程序系统毕业设计毕设(5)任务书
  6. 测量学计算机,顾孝烈测量学第4版课后习题答案解析
  7. Vue-Element中结合后台的特定的数据给实现考勤表格
  8. 迅捷CAD编辑器如何将图片转换为CAD
  9. oracle 论坛网址
  10. android逆向01:修改apk的资源文件,smali插桩