侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python经典趣味24点游戏程序设计

Python  /  管理员 发布于 7年前   145

一、游戏玩法介绍:

24点游戏是儿时玩的主要益智类游戏之一,玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24。例如,2,3,4,6,通过( ( ( 4 + 6 ) - 2 ) * 3 ) = 24,最快算出24者剩。

二、设计思路:

由于设计到了表达式,很自然的想到了是否可以使用表达式树来设计程序。本程序的确使用了表达式树,也是程序最关键的环节。简要概括为:先列出所有表达式的可能性,然后运用表达式树计算表达式的值。程序中大量的运用了递归,各个递归式不是很复杂,大家耐心看看,应该是能看懂的

表达式树:

表达式树的所有叶子节点均为操作数(operand),其他节点为运算符(operator)。由于本例中都是二元运算,所以表达式树是二叉树。下图就是一个表达式树

具体步骤:

1、遍历所有表达式的可能情况

遍历分为两部分,一部分遍历出操作数的所有可能,然后是运算符的所有可能。全排列的计算采用了递归的思想

#返回一个列表的全排列的列表集合def list_result(l):  if len(l) == 1:    return [l]  all_result = []  for index,item in enumerate(l):    r = list_result(l[0:index] + l[index+1:])    map(lambda x : x.append(item),r)    all_result.extend(r)  return all_result

2、根据传入的表达式的值,构造表达式树

由于表达式树的特点,所有操作数均为叶子节点,操作符为非叶子节点,而一个表达式(例如( ( ( 6 + 4 ) - 2 ) * 3 ) = 24) 只有3个运算符,即一颗表达式树只有3个非叶子节点。所以树的形状只有两种可能,就直接写死了

 

#树节点class Node:  def __init__(self, val):    self.val = val    self.left = None    self.right = None
def one_expression_tree(operators, operands):  root_node = Node(operators[0])  operator1 = Node(operators[1])  operator2 = Node(operators[2])  operand0 = Node(operands[0])  operand1 = Node(operands[1])  operand2 = Node(operands[2])  operand3 = Node(operands[3])  root_node.left = operator1  root_node.right =operand0  operator1.left = operator2  operator1.right = operand1  operator2.left = operand2  operator2.right = operand3  return root_nodedef two_expression_tree(operators, operands):  root_node = Node(operators[0])  operator1 = Node(operators[1])  operator2 = Node(operators[2])  operand0 = Node(operands[0])  operand1 = Node(operands[1])  operand2 = Node(operands[2])  operand3 = Node(operands[3])  root_node.left = operator1  root_node.right =operator2  operator1.left = operand0  operator1.right = operand1  operator2.left = operand2  operator2.right = operand3  return root_node

3、计算表达式树的值

也运用了递归

#根据两个数和一个符号,计算值def cal(a, b, operator):  return operator == '+' and float(a) + float(b) or operator == '-' and float(a) - float(b) or operator == '*' and float(a) * float(b) or operator == '÷' and float(a)/float(b)def cal_tree(node):  if node.left is None:    return node.val  return cal(cal_tree(node.left), cal_tree(node.right), node.val)

4、输出所有可能的表达式

还是运用了递归

def print_expression_tree(root):  print_node(root)  print ' = 24'def print_node(node):  if node is None :    return  if node.left is None and node.right is None:    print node.val,  else:    print '(',    print_node(node.left)    print node.val,    print_node(node.right)    print ')',    #print ' ( %s %s %s ) ' % (print_node(node.left), node.val, print_node(node.right)),

5、输出结果

三、所有源码

#coding:utf-8from __future__ import divisionfrom Node import Nodedef calculate(nums):  nums_possible = list_result(nums)  operators_possible = list_result(['+','-','*','÷'])  goods_noods = []  for nums in nums_possible:    for op in operators_possible:      node = one_expression_tree(op, nums)      if cal_tree(node) == 24:        goods_noods.append(node)      node = two_expression_tree(op, nums)      if cal_tree(node) == 24:        goods_noods.append(node)  map(lambda node: print_expression_tree(node), goods_noods)def cal_tree(node):  if node.left is None:    return node.val  return cal(cal_tree(node.left), cal_tree(node.right), node.val)#根据两个数和一个符号,计算值def cal(a, b, operator):  return operator == '+' and float(a) + float(b) or operator == '-' and float(a) - float(b) or operator == '*' and float(a) * float(b) or operator == '÷' and float(a)/float(b)def one_expression_tree(operators, operands):  root_node = Node(operators[0])  operator1 = Node(operators[1])  operator2 = Node(operators[2])  operand0 = Node(operands[0])  operand1 = Node(operands[1])  operand2 = Node(operands[2])  operand3 = Node(operands[3])  root_node.left = operator1  root_node.right =operand0  operator1.left = operator2  operator1.right = operand1  operator2.left = operand2  operator2.right = operand3  return root_nodedef two_expression_tree(operators, operands):  root_node = Node(operators[0])  operator1 = Node(operators[1])  operator2 = Node(operators[2])  operand0 = Node(operands[0])  operand1 = Node(operands[1])  operand2 = Node(operands[2])  operand3 = Node(operands[3])  root_node.left = operator1  root_node.right =operator2  operator1.left = operand0  operator1.right = operand1  operator2.left = operand2  operator2.right = operand3  return root_node#返回一个列表的全排列的列表集合def list_result(l):  if len(l) == 1:    return [l]  all_result = []  for index,item in enumerate(l):    r = list_result(l[0:index] + l[index+1:])    map(lambda x : x.append(item),r)    all_result.extend(r)  return all_resultdef print_expression_tree(root):  print_node(root)  print ' = 24'def print_node(node):  if node is None :    return  if node.left is None and node.right is None:    print node.val,  else:    print '(',    print_node(node.left)    print node.val,    print_node(node.right)    print ')',if __name__ == '__main__':  calculate([2,3,4,6])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    seek引发的python文件读写的问题及解决
    下一条:
    python函数的万能参数传参详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客