Python 小程序:计算24点

     今天玩24点的时候,突然希望想编写一个 计算24点的小程序,为python的初学者提供一些帮助。 

        24点是许多人都会玩的游戏。玩法在这里简单的介绍一下:选4个数字(1-13中任意),然后用加减乘除算出24。计算时,四个数字不能重复使用也不能少用。

        看似非常简单的24点游戏,为计算出24点,常常需要大量的计算,而这又具有一些规律性,符合编程的条件。因此,博主做了一个简单的24点小程序,在这里与大家分享一下,希望对大家有所帮助。

        首先,24点有1820种情况,需要编写一个函数来生成1820种情况。这里使用了循环嵌套的技巧,比较简单,在此不作赘述。

'''这个函数排列出1820种24点排列(1-13)'''
def numbers_1820():
    kinds = []  #这个列表用来储存1820种24点排列
    
    # 24点有4个数字,每个数字有十三种(1-13),记为n1,n2,n3和n4。
    for n1 in range(1,14):
        for n2 in range(1,14):
            for n3 in range(1,14):
                for n4 in range(1,14):
                    if n1 <= n2 <= n3 <= n4: #保证不重复,不遗漏
                        number_list = [n1,n2,n3,n4] #每一种4个数字的列表
                        kinds.append(number_list) #添加入最终列表
    return kinds

        为方便后续的计算,还需编写一个将4个数字排列成24种的函数(例如[1,2,3,4]要排列成[1,2,3,4],[1,2,4,3],[1,3,2,4]等)。

'''这个函数将24点的每一种(例如[1,2,3,4])进行24种排列'''
def kinds_24(kind):
    result= []
    all_result = []
    for a in range(0,4):
        for b in range(0,4):
            for c in range(0,4):
                for d in range(0,4):
                    if a != b and a != c and a != d and b != c \
                       and b != d and c != d: #4个数字不能有相同的
                        a1 = kind[a]
                        b1 = kind[b]
                        c1 = kind[c]
                        d1 = kind[d]
                        result = [a1,b1,c1,d1]
                        all_result.append(result)
    return all_result

        最后需要编写的函数是计算所给的24点。首先要在4个数字中插入3个符号(共4*4*4=64种),然后还要加上5种括号,进行计算已得到有解或无解的结果。 

'''把给到的4个数进行暴力计算法算24.'''
def caculate_24(lists):
    result = 0
    symbols = ['+','-','*','/'] #4个数中间会有3个符号
    a,b,c,d = lists #将4个数赋值给a,b,c,d。
    # 三个符号分别为s1,s2和s3。
    for s1 in range(0,4):
        for s2 in range(0,4):
            for s3 in range(0,4):
                #这里是5种括号。
                for k1 in range(1,6):
                    if k1 == 1:
                        math = f'({a}{symbols[s1]}({b}{symbols[s2]}{c})){symbols[s3]}{d}'#1
                    elif k1 == 2:
                        math = f'(({a}{symbols[s1]}{b}){symbols[s2]}{c}){symbols[s3]}{d}'#2
                    elif k1 == 3:
                        math = f'({a}{symbols[s1]}{b}){symbols[s2]}({c}{symbols[s3]}{d})'#3
                    elif k1 == 4:
                        math = f'{a}{symbols[s1]}({b}{symbols[s2]}({c}{symbols[s3]}{d}))'#4
                    elif k1 == 5:
                        math = f'{a}{symbols[s1]}(({b}{symbols[s2]}{c}){symbols[s3]}{d})'#5
                    try:
                        if 23.999999995 < float(eval(math)) < 24.000000005:#近似值
                            result += 1 #有解个数是result
                    except ZeroDivisionError: #除以0
                        pass
    if result != 0: #非无解
        return True
    else: #无解
        return False

         最后将几个函数和在一条主程序里面,以生成24点的有无解表。

        由于最后的需要操作Excel,需安装第三方模块xlwt,可打开Windows文件资源管理器,输入这个路径:C:\Users\ASUS\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell,打开WindowsPowershell,运行这条命令:pip install --user xlwt ,即可安装完成。

        以下是最后主程序的脚本:

# 导入函数
from Numbers_1820 import numbers_1820
from Kinds_24 import kinds_24
from Caculate_24 import caculate_24
import xlwt

result = []
list_1820 = numbers_1820() #首先获取24点的1820种排列

for i in list_1820:#遍历列表
    youjie = 0
    list_24 = kinds_24(i)#将1820种的每一种进行24种排列
    for a in list_24: #遍历24种情况
        # 开始计算
        if caculate_24(a) == True:#有解
            youjie += 1
    if youjie > 0:#有解
        result.append([i,'有解'])#加入最后的总列表
    else:#无解
        result.append([i,'无解'])#同理

'''将结果写入一个Excel表'''
wbk = xlwt.Workbook() #创建一个新Excel
sheet = wbk.add_sheet('24点有无解表') #增加一个sheet
h = 0
# 开始写入
for b in result:
    sheet.write(h,0,str(b[0]))
    sheet.write(h,1,b[1])
    h += 1
wbk.save('24点表.xlsx') #保存
print('Done.')#完成

注意:将子程序与主程序放置于同一个文件夹里。

最后的Excel表展示:

 调整后:

 今天的文章到此就结束了,希望我的文章对大家有帮助!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拖泥鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值