Python学习案例1——算24点游戏计算程序

本文介绍了Python学习案例——算24点游戏计算程序的实现,包括游戏简介、算法思路、递归函数和类的实现方式,并展示了不同实现的运行结果,最后探讨了计算所有组合的成功概率。
摘要由CSDN通过智能技术生成

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+'*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值