Python学习案例1——算24点游戏计算程序
由于工作需要,最近开始学习Python语言。通过Python手册学习了语言基本知识后,按照学习其他语言的经验,必须编写一些小程序作为学习案例,才可能边学边练,更好理解和掌握Python。
游戏小程序趣味性较强,是不错的练手案例。最先想到的就是小时候玩过的算24点游戏,就把它作为我的第一个学习案例吧。
1、算24点游戏简介
二十四点是一种益智游戏,它要求人们将四个数字进行加减乘除四则混合运算(允许使用括号)求得二十四。小时候使用去除大小王的扑克,2人玩。每人从剩余扑克中取2张扑克凑在一起,两个人同时开始思考组成24的算法,先说出来者获胜。这个游戏还是很锻炼计算能力的。
2、算法
网上搜索比较,感觉把多元运算转化为两元运算的算法[1]比较容易实现,因此采用此算法。先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算
(1) 将4个整数放入数组中
(2) 在数组中取两个数字的排列,共有 P(4,2) 种排列。对每一个排列,对 – * / 每一个运算符,
(2.1.1) 根据此排列的两个数字和运算符,计算结果。
(2.1.2) 改表数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中。
(2.1.3) 对新的数组,重复步骤 2。
(2.1.4) 恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉可见这是一个递归过程。步骤 2 就是递归函数。当数组中只剩下一个数字的时候,这就是表达式的最终结果,此时递归结束。
3、实现1,递归函数实现
首先在一个代码文件里实现,搜索部分用递归函数实现,输入输出在主程序实现。代码如下。主程序与递归程序间数据传递使用全局变量实现。
''' 算24点游戏计算程序 用户输入4个1-13之间的整数,程序自动搜索+-*/全部可能计算出24的组合及数目。如果得不到结果,则提示失败。 ''' def K24Find( n , Lfindall=1) : ''' 递归搜索24点组合 n : 还需要递归搜索的数字总数 Lfindall : 找出全部组合的逻辑控制。1,找出全部;0,找出第一个。 ''' global Nsucc #成功算出24点的组合数目 global ListNum #待搜索的数字组合数组 global ListExpr #已经搜索得到的表达式字符串 if n == 1 : #递归完成一个搜索 if ListNum[0] == 24 : #发现一个成功搜索 Nsucc=Nsucc+1 print(Nsucc,',',ListExpr[0]) return else: if not Lfindall and Nsucc>0: #找到1个即可 return
for i in range(n): #查找 for j in range(i+1,n): #与其后面的查找进行计算 n1 = ListNum[i] n2 = ListNum[j] s1 = ListExpr[i] s2 = ListExpr[j] # n-->j ListNum[j]=ListNum[n-1] ListExpr[j]=ListExpr[n-1] # n1+n2 ListNum[i]=n1+n2 ListExpr[i]='('+s1+'+'+s2+')' K24Find(n-1,Lfindall) # n1-n2 ListNum[i]=n1-n2 ListExpr[i]='('+s1+'-'+s2+')' K24Find(n-1,Lfindall) # n2-n1 ListNum[i]=n2-n1 ListExpr[i]='('+s2+'-'+s1+')' K24Find(n-1,Lfindall) # n1*n2 ListNum[i]=n1*n2 ListExpr[i]='('+s1+'* |