想起小时候玩的 24 点,还真是难忘。那时候两个人,或者四个人,有沉思、有爆发、也有放弃、或者不甘,还有装模作样、有说有笑,乐趣无穷啊。可惜,现在只有对着电脑写程序来满足一下了。。

下面这个这个是以前写的一个24点小游戏,那些变量名,程序的可读性,等等,有点,不说了,照搬,还原以前的我!


运行效果

(24点)
请输入a:5
请输入b:5
请输入c:5
请输入d:1
(5-(1/5))*5Process finished with exit code 0

设计思路

数学感觉一下,容易证明 24 点的计算式可以用以下两种方式囊括(其中 ⊕ 表示加减乘除这四种运算符号):

  1. ((a⊕b)⊕c)⊕d
  2. (a⊕b)⊕(c⊕d)

现在,我们只需要把四个数全排列,再配以可能的运算符号便可以了。这里不用考虑括号的放置,因为上面那两个式子已经把括号固定了

完整代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-import itertools
three, three1 = None, Nonedef cal():global three, three1flag = 1print('(24点)')x = int(input('请输入a:')), int(input('请输入b:')), int(input('请输入c:')), int(input('请输入d:'))L = list(x)              ## tuple --> list ,即 [a,b,c,d]while (flag == 1):if L[0] <= 0 or L[1] <= 0 or L[2] <= 0 or L[3] <= 0:print('\n输入值不全是正数,请重新输入...')x = int(input('请输入a:')), int(input('请输入b:')), int(input('请输入c:')), int(input('请输入d:'))L = list(x)else:flag = 0L1 = itertools.permutations(L)          ## 全排列for i in L1:                            ## 下面是实现 ((a⊕b)⊕c)⊕d 的形式  a, b, c, d = ilist1 = [a + b, a - b, b - a, a * b, a / b, b / a]#list2 = [c + d, c - d, d - c, c * d, c / d, d / c]for result1 in list1:if result1 == 0:list2 = [result1 + c, result1 - c, c - result1, result1 * c, result1 / c]else:list2 = [result1 + c, result1 - c, c - result1, result1 * c, result1 / c, c / result1]for result2 in list2:if result2 == 0:list3 = [result2 + d, result2 - d, d - result2, result2 * d, result2 / d]else:list3 = [result2 + d, result2 - d, d - result2, result2 * d, result2 / d, d / result2]for result3 in list3:if abs(result3 - 24) < 1e-10: c1 = list1.index(result1)c2 = list2.index(result2)c3 = list3.index(result3)if c1 == 2 or c1 == 5:a, b = b, afirst = '(' + str(a) + four[c1] + str(b) + ')'if c2 == 2 or c2 == 5:first, c = c, firstsecond = '(' + str(first) + four[c2] + str(c) + ')'if c3 == 2 or c3 == 5:second, d = d, secondthree = str(second) + four[c3] + str(d)print(three + '\n')breakif abs(result3 - 24) < 1e-10:breakif abs(result3 - 24) < 1e-10:breakif abs(result3 - 24) < 1e-10:breakif three == None:                   ## 下面是实现 (a⊕b)⊕(c⊕d) 的形式 L1 = itertools.permutations(L) for i in L1:a, b, c, d = ilist1 = [a + b, a - b, a * b, a / b]list2 = [c + d, c - d, c * d, c / d]for result1 in list1:for result2 in list2:if result2 == 0:list3 = [result1 + result2, result1 - result2, result1 * result2]else:list3 = [result1 + result2, result1 - result2, result1 * result2, result1 / result2]for result3 in list3:if abs(result3 - 24) < 1e-10:c1 = list1.index(result1)c2 = list2.index(result2)c3 = list3.index(result3)three1 = '(' + str(a) + four1[c1] + str(b) + ')' + four1[c3] + '(' + str(c) + \four1[c2] + str(d) + ')'print(three1 + '\n')breakif abs(result3 - 24) < 1e-10:breakif abs(result3 - 24) < 1e-10:breakif abs(result3 - 24) < 1e-10:breakif three == None and three1 == None:print('无解...')if __name__ == '__main__':four = ['+', '-', '-', '*', '/', '/']four1 = ['+', '-', '*', '/']cal()

注意点与总结点

  1. 全排列,生成器

  2. 除数不能为0

  3. 浮点数0.1在计算机中就无法精确表示,因为十进制的0.1换算成二进制是一个无限循环小数

改进之处

  1. 变量命名
  2. 参数变量与方法的分离不当,比如 four 和 four1 变量,应该写进函数里面,控制变量的最小范围!
  3. 可以把上面的 cal 函数分为三个子函数来写,会方便一点
  4. 里面的字符串拼接可以改用format
  5. 判断输入的值,可用正则表达式来判断输入是否非法,输入非法则重新输入

练习

  1. 改进之处 那里的完善
  2. 分两种模式,一种为自己输入4个数字求解,一种为计算机给出4个数,让我们算。可以一直玩下去,除非我们选择退出
  3. 第一种模式中,把可能的 24 点运算全部罗列出来
  4. 除了上面代码所用的最传统的方法,还可以用Python自带库或者二叉树等等完成

Python 编写24点游戏相关推荐

  1. python编写24点游戏

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

  2. Python编写尼姆游戏

    Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...

  3. 用python编写乒乓球小游戏--Turtle功能的应用

    用python编写乒乓球小游戏–Turtle功能的应用 python有很多功能强大的代码库,Turtle是一款用于游戏开发的代码库.通过编写乒乓球小游戏可以了解这个库的基本的代码的使用 先创建游戏的背 ...

  4. python编写猜数字游戏

    一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...

  5. Python 编写石头剪刀布小游戏

    Python 编写石头剪刀布小游戏 一个简单的小游戏 程序只运行一次 每次出拳一次要运行一次,很麻烦,要让程序一直运行 长期玩游戏不利于身心健康,玩游戏要有度不是 免费玩了这么多次,要给项目创造一点收 ...

  6. Python版24点游戏

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

  7. Python编写带音效游戏——击球打玻璃块

    Python编写游戏的环境搭建和编写过程已在上篇"Python编写游戏--拼图游戏"中进行了介绍,在此基础上本篇再介绍键盘控制.背景图像设置和音效设置. 一.开发工具 Python ...

  8. python编写猜大小游戏_python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...

  9. 如何使用Python编写简单的游戏?

    14天阅读挑战赛 今天,我们将学习如何使用几个常见的Python模块在Python中编写一些简单的游戏. 我们为什么要使用Python? Python是一种著名的编程语言.Python非常易于理解和编 ...

  10. python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现...

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

最新文章

  1. 单链表-删除并释放以L为表头指针的单链表的所有结点(双指针法)
  2. u-boot分析之启动简介(一)
  3. Uva 11922 Splay
  4. C++11 POD类型
  5. 我的docker随笔13:docker源码编译进阶篇
  6. Linux0.11 kernel/exit.c中的free_page_tables()
  7. AWT_Swing_初始化(Java)
  8. Python 系统管理利器Fabric
  9. bootstrap页面布局
  10. OmegaXYZ知识图谱应用Github仓库(长期更新)
  11. Sofia-SIP辅助文档六 - Sofia-SIP中的SIP和SDP特性
  12. 使用SpringBoot做一个班级管理系统
  13. LaserJet 5000 及 5100 系列打印机出现 pcl xl error 怎么办
  14. android投屏 电视软件,高清电视投屏软件下载-高清电视投屏 安卓版v20200802-PC6安卓网...
  15. ChucK初步(1)
  16. wps批量将文档括号内的字符串修改颜色
  17. 系统架构师论文-论软件设计模式的应用
  18. 看完这五个问题后你真的了解C语言吗?(深度剖析C语言第二期)
  19. 学习同学们的博客经验
  20. 百余门店闭门谢客,韩妆如何败给了国潮?

热门文章

  1. PCB设计时应该考虑的几个问题
  2. Qt编写自定义控件65-光晕日历
  3. OOC-GCC 特性介绍
  4. 实现开通个人支付宝与微信扫码支付
  5. Java 实现十进制数转换为二进制
  6. 插入馈电的微带贴片天线
  7. ssms连接mysql_SQL Server安装以及使用SSMS连接数据库
  8. manjaro 亮度调节
  9. 基于Android的Word文档阅读器
  10. 关于 Burrows-Wheeler 变换和 Lempel-Ziv 解析的一些认识