python简单游戏程序设计_经典趣味24点游戏程序设计(python)

一、游戏玩法介绍:

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

二、设计思路:

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

表达式树:

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

472792-20160106144951700-790483128.png

具体步骤:

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

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

#返回一个列表的全排列的列表集合

deflist_result(l):if len(l) == 1:return[l]

all_result=[]for index,item inenumerate(l):

r= list_result(l[0:index] + l[index+1:])

map(lambdax : x.append(item),r)

all_result.extend(r)return all_result

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

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

472792-20160106144951700-790483128.png

 

472792-20160106145456012-1059344784.png

#树节点

classNode:def __init__(self, val):

self.val=val

self.left=None

self.right= None

defone_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=operand3returnroot_nodedeftwo_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=operand3return root_node

3、计算表达式树的值

也运用了递归

#根据两个数和一个符号,计算值

defcal(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)defcal_tree(node):if node.left isNone:returnnode.valreturn cal(cal_tree(node.left), cal_tree(node.right), node.val)

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

还是运用了递归

defprint_expression_tree(root):

print_node(root)print '= 24'

defprint_node(node):if node isNone :return

if node.left is None and node.right isNone:printnode.val,else:print '(',

print_node(node.left)printnode.val,

print_node(node.right)print ')',#print ' ( %s %s %s ) ' % (print_node(node.left), node.val, print_node(node.right)),

5、输出结果

472792-20160106151414512-470089973.png

三、所有源码

ContractedBlock.gif

ExpandedBlockStart.gif

#coding:utf-8

from __future__ importdivisionfrom Node importNodedefcalculate(nums):

nums_possible=list_result(nums)

operators_possible= list_result(['+','-','*','÷'])

goods_noods=[]for nums innums_possible:for op inoperators_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(lambdanode: print_expression_tree(node), goods_noods)defcal_tree(node):if node.left isNone:returnnode.valreturncal(cal_tree(node.left), cal_tree(node.right), node.val)#根据两个数和一个符号,计算值

defcal(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)defone_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=operand3returnroot_nodedeftwo_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=operand3returnroot_node#返回一个列表的全排列的列表集合

deflist_result(l):if len(l) == 1:return[l]

all_result=[]for index,item inenumerate(l):

r= list_result(l[0:index] + l[index+1:])

map(lambdax : x.append(item),r)

all_result.extend(r)returnall_resultdefprint_expression_tree(root):

print_node(root)print '= 24'

defprint_node(node):if node isNone :return

if node.left is None and node.right isNone:printnode.val,else:print '(',

print_node(node.left)printnode.val,

print_node(node.right)print ')',if __name__ == '__main__':

calculate([2,3,4,6])

View Code

英雄年代手游正版官方网站:英雄年代手游:端游经典指尖微操,1:1复刻经典 - 英雄年代手游正版官方网站掌上重温端游经典,英雄年代手游正版官方网站为您呈现原汁原味的1:1复刻玩法。快来感受指尖微操的游戏乐趣!icon-default.png?t=N7T8https://m.rxsy99.com/qwa.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 24点游戏是一种常见的益智游戏,它的目标是通过组合四个运算符(加减乘除)和四个数字(1-9),使得计算结果为24。为了更好地提高用户体验,我们采用Python编程语言设计了一个图形界面来实现这个游戏。 首先,我们使用Python的GUI库,如Tkinter或PyQt,来创建游戏的主窗口。在主窗口中,我们会添加一些用户交互元素,比如按钮、输入框和标签来显示题目和结果。 接下来,我们需要设计一个算法来生成随机的游戏题目。我们可以通过随机选择四个数字和三个运算符来构建一个表达式。然后,我们可以使用递归的方式穷举所有可能的运算符组合,并计算表达式的结果。如果结果等于24,那么就将这个表达式作为一个合法的题目。 在图形界面中,我们可以使用按钮来启动游戏并生成题目。当用户点击按钮时,程序会生成一个新的题目,并在标签中显示出来。用户可以在输入框中输入自己的答案,并点击提交按钮来检查答案的正确性。 在用户提交答案后,程序会将用户的答案和正确答案进行比较,并在标签中显示出结果。如果答案正确,可以弹出一个对话框来显示恭喜信息;如果答案错误,可以弹出一个对话框来显示正确答案。 此外,在界面中我们还可以加入一些附加功能来增加游戏趣味性。比如,我们可以设置一个计时器来记录用户完成题目所花费的时间,或者添加一个帮助按钮来显示游戏规则和提示。 总体而言,通过Python的图形界面设计,我们可以更好地实现24点游戏,并提供更友好、便捷的用户体验。用户可以随时开始新的游戏,挑战自己的计算能力,并享受益智游戏带来的乐趣。 ### 回答2: 24点是一种纸牌游戏,目标是通过组合四张牌中的数字和运算符,使得结果等于24。在Python中设计24点游戏的图形界面,可以使用Tkinter库来实现。以下是一个简单的设计方案。 首先,我们需要创建一个窗口,可以使用Tkinter库中的Tk()函数来实现。接下来,我们可以设置窗口的标题和大小,以及窗口中的布局。 在窗口中,我们可以添加一些标签来显示游戏规则和玩家的得分。例如,创建一个“游戏规则”标签来说明24点游戏的规则。另外,可以创建一个“得分”标签用于显示玩家的得分。 接下来,我们可以在窗口中添加一些按钮来实现游戏的功能。例如,可以创建四个按钮来选择四张牌。当玩家点击按钮时,可以从一副牌中随机抽取一张,并将其显示在按钮上。 此外,我们可以添加一个“计算”按钮来计算玩家选择的四张牌是否可以组合成24。当玩家点击“计算”按钮时,可以调用一个函数来进行计算,判断玩家的答案是否正确,并更新玩家的得分。 最后,我们可以在窗口中添加一个“重新开始”按钮,以便玩家重新开始游戏。当玩家点击“重新开始”按钮时,可以调用一个函数来重新随机生成四张牌,并重置玩家的得分。 通过以上的设计,我们可以实现一个简单24点游戏的图形界面。玩家可以通过选择牌和运算符,来组合出一个等于24的答案,并得到相应的得分。 ### 回答3: 24点游戏是一种数学游戏,目的是通过组合四张纸牌的数字,使用加、减、乘、除等运算符得出结果为24的表达式。图形界面设计是为了使游戏更加易于操作和美观。 在Python中,可以使用Tkinter这个库来设计24点游戏的图形界面。首先,我们需要创建一个窗口,可以使用Tkinter的Tk()函数来实现。接下来,我们可以在窗口中添加一些按钮、文本框等控件来实现用户输入和显示游戏结果。 游戏的流程如下:首先,我们需要生成四张纸牌的数字,并在游戏界面展示出来。然后,用户可以通过点击按钮选择运算符和数字,将其拖动到一个运算区域,并形成一个表达式。当用户选择好运算符和数字后,可以点击一个计算按钮,程序将根据用户选择的表达式来计算结果,并在游戏界面中显示出来。 如果计算结果等于24,游戏结束,弹出一个提示框告诉用户答对了。如果计算结果不等于24,则提示用户答错了,并在游戏界面中清空运算区域,以便用户重新选择。 为了增加游戏的可玩性,可以在游戏界面中添加一些辅助功能,比如帮助按钮,用于显示游戏规则和提示用户如何玩游戏。 设计24点游戏图形界面时,除了以上的基本功能,还可以根据自己的喜好和创意来增加一些附加功能,比如添加音效、美化界面等。总之,Python的Tkinter库提供了丰富的图形界面设计功能,可以很方便地实现24点游戏的图形界面设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值