今天玩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表展示:
调整后:
今天的文章到此就结束了,希望我的文章对大家有帮助!