24点是一种非常简单的游戏,可以锻炼我们的计算能力。
今天博主给大家带来的就是一个关于24点计算的程序,并不是很难,希望能给python学习者提供一些帮助。
首先我编写了一个输入数字后自动返回有解或无解的函数,且有解时返回所有解的集合。这个函数一之前的计算函数很像,只是使用了集合的设置(set()函数)和添加(add()函数)。
'''把给到的4个数进行暴力计算法算24.'''
def caculate_24(lists):
results = set()#用set()函数创建一个集合
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
results.add(math)#将解法加入集合
except ZeroDivisionError: #除以0
pass
if result != 0: #非无解
return results
else: #无解
return False
为方便后续的计算,还需编写一个将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
接着是用于给用户输入数字的对话框函数:
pyautogui 函数用于对话框(prompt输入文本,alert提示)
def get_number(number):
'''这个函数用来收取用户要计算的数字'''
active = True#检测用户输入的数字是否符合条件
while active != False:
c_number = pyautogui.prompt(f'请输入第{number}个数字:(1-13)')#对话框
if c_number == None:#用户点击“Cancel”或关闭窗口
sys.exit()#退出程序
try:
#检验输入数字是否符合要求
c_number = int(c_number)
if c_number < 1 or c_number > 13:
raise ValueError()
active = False
except:
pyautogui.alert('输入错误!请重新输入','错误提示')#错误消息
return c_number
最后是主程序:(首先导入函数,对话框函数我是在主程序中编写的,而其他是在子程序里,所以要导入)
pyperclip函数用于复制结果。
#导入函数
from Kinds_24 import kinds_24
from Game_24 import caculate_24
import pyautogui
import sys
import pyperclip
def get_number(number):
'''这个函数用来收取用户要计算的数字'''
active = True#检测用户输入的数字是否符合条件
while active != False:
c_number = pyautogui.prompt(f'请输入第{number}个数字:(1-13)')#对话框
if c_number == None:#用户点击“Cancel”或关闭窗口
sys.exit()#退出程序
try:
#检验输入数字是否符合要求
c_number = int(c_number)
if c_number < 1 or c_number > 13:
raise ValueError()
active = False
except:
pyautogui.alert('输入错误!请重新输入','错误提示')#错误消息
return c_number
while True:#主程序循环
results = set()#集合
times = 1
n24 = []
while times != 5:#获得四个数字
n1 = get_number(times)
n24.append(n1)#加入列表
times += 1
for i in kinds_24(n24):#24种排列
if caculate_24(i) != False:#有解
for a in caculate_24(i):
results.add(a)#加入集合,避免重复
if results != {}:#非无解
string = ''
for b in results:#显示每个解
string = string + b + '\n'
if pyautogui.alert(string,'计算结果','一键复制') == "一键复制":#是否要复制答案
pyperclip.copy(string)#复制
else:
pyautogui.alert('无解','计算结果')#无解
运行结果展示:
输入数字:
如果输入错误:
最后点击复制键即可:
希望我的文章能对大家有帮助,看完记得点赞哦~~