import random,time,sys,os
class game_24:
sour = [] # 保存产生的4个随机数 sourlist = [] # 保存所有数值组合 symbollist = [] # 保存所有符号列表 suanshi = [] # 保存组合后的算式 isorder = []#保存分先优先级的算式列表 noorder = [] # 保存不分先优先级的算式列表 # def __init__(self,sour,sourtlist,symbollist,suanshi,isorder,noorder): # self.sour=sour # self.sourlist=sourtlist # self.symbollist=symbollist # self.suanshi=suanshi # self.isorder=isorder # self.noorder=noorder # 先后顺序算 def isverify(self,inputstr):
result = 0
str1 = inputstr[:3] # 取前3个,0,1,2,第一步表达式 result = result + eval(str1) # 第一步结果 str2 = str(result) + inputstr[3:5] # 第一步的结果连接3,4两个字符组成第二步表达式 result = eval(str2) # 第二步结果 str3 = str(result) + inputstr[5:7] # 第二步的结果连接5,6两个字符组成第三步表达式 result = eval(str3) # 第三步结果 return result #执行 def start_verify(self): #一定要清空一下,防止二次调用,原来的值还在 self.sour.clear()
self.sourlist.clear()
self.symbollist.clear()
self.suanshi.clear()
self.isorder.clear()
self.noorder.clear() # 随机产生1-9间4个数 for i in range(0, 4):
self.sour.append(str(random.randint(1, 9))) # 转换成str方便后面eval #------------------------------------------------------ # 产生4个数的排列组合 for n1 in self.sour:
for n2 in self.sour:
for n3 in self.sour:
for n4 in self.sour:
templist = [] # 临时保存数值组合 templist.append(n1)
templist.append(n2)
templist.append(n3)
templist.append(n4) # 如果满足序列条件 if templist.count(n1) == self.sour.count(n1) and templist.count(n2) == self.sour.count(n2) and templist.count(
n3) == self.sour.count(n3) and templist.count(n4) == self.sour.count(n4): # 去重 if self.sourlist.count(templist) < 1:
self.sourlist.append(templist) # print(templist) #------------------------------------------------------------------- # 产生符号排列 #print('符号开始产生') symbol = '+-*/' for f1 in symbol:
for f2 in symbol:
for f3 in symbol:
tempsymbol = []
tempsymbol.append(f1)
tempsymbol.append(f2)
tempsymbol.append(f3) # 符号允许重复 self.symbollist.append(tempsymbol) # print(tempsymbol) #--------------------------------------------------------------------- # 排列与符合组合 #print('组合算式:') for numindex in self.sourlist:
for symindex in self.symbollist: # 保存一份,否则下方增加被破坏 tempsave = []
tempsave.extend(numindex)
tempsave.insert(1, symindex[0])
tempsave.insert(3, symindex[1])
tempsave.insert(5, symindex[2])
self.suanshi.append(tempsave) # print(tempsave) tempsave.clear #----------------------------------------------------------------------------------- # 验证是否满足等于24,是将表达式添加到对应列表,可加在54行处 for okindex in self.suanshi:
tempstr = ''.join(okindex)
if eval(tempstr) == 24:
self.isorder.append(tempstr) #print('按数学方法计算,结果为:\t', tempstr) elif self.isverify(tempstr)== 24:
self.noorder.append(tempstr) #print('不分先乘除后加减,按从左往右依次算:\t', tempstr) #打印正确结果(分优先级)。 def printisorder(self):
if len(self.isorder)>0:
for printisorder_index in self.isorder:
print(''.join(printisorder_index)) #打印正确结果(不分优先级)。 def printnoorder(self):
if len(self.noorder)>0:
for printnoorder_index in self.noorder:
print(''.join(printnoorder_index))
#*********************************************************************************** # 主程序开始 #*********************************************************************************** #验证用户输入合法性 def userInput_isOk(userInput_str,src_str):
isok_str=src_str + '()+-*/'#产生的算式连接符号 if len(userInput_str.strip()) <7:#验证输入长度 return False
for tempSour_index in userInput_str.strip():
if tempSour_index not in isok_str:
return False
return True
print('**************************************')
print(' ')
print(' 欢迎来玩24点游戏,来唤起你的童年趣事吧 ')
print(' 支持按数学上符号优先级算,即先乘除后加减!')
print('支持不按数学上符号优先级算,即从左往右依次算! ')
print(' 加+,减-,乘*,除/ ')
print(' 输入n或N确认4个数字不能组成24点…… ')
print(' 按Q或q键退出 ')
print(' ')
print('**************************************')
print(' ')
os.system('cls')
my_game = game_24()#加上(),否则无法初始化 while True:
my_game.start_verify()#加上(),否则无法初始化 src_num_text=','.join(my_game.sour)#保存产生的题目 print(' ')
print('============= 本轮出题 =================')
print(' 题 目:',src_num_text,' ') #打印题目 print('============= 出题结束 =================')
print(' ') #验证输入有效性 while True:
user_input = input('↓↓↓↓↓↓↓↓请输入你的结果,按回车键确认↓↓↓↓↓↓↓↓\n')
if user_input == 'q' or user_input == 'Q':
print('*******************************')
print(' ')
print('********游戏结束,欢迎再来********')
print(' ')
print('*******************************')
sys.exit(0)
elif user_input =='n' or user_input=='N':
break
elif userInput_isOk(user_input,''.join(my_game.sour)):
break
else:
print('输入有误,位数要对,只能输入题目内的数字和运算符号!')
if user_input=='n' or user_input=='N': #如果保存正确结果的两个列表都为空,说明无法组成24点 if len(my_game.noorder)<1 and len(my_game.isorder)<1:
print('^_^ 恭喜你答对啦!')
else:
print('不好意思,答错了……')
if len(my_game.isorder) !=0:
print('符号分优先级(先括号,再*/,后+-):')
my_game.printisorder()
if len(my_game.noorder) != 0:
print('符号不分优先级(从左往右依次算):')
my_game.printnoorder()
else:
if eval(user_input)==24:
print('^_^ 恭喜你答对啦!')
else:
isRight=False #分先乘除后加减验证 for result_index in my_game.isorder:
if user_input == ''.join(result_index):
print('^_^ 恭喜你答对啦(符号分优先级)!')
isRight = True
break # 不分先乘除后加减验证 for result_index2 in my_game.noorder:
if user_input == ''.join(result_index2):
print('^_^恭喜你答对啦!(符号不分优先级依次算)!')
isRight = True
break
if not isRight:
print('不好意思,答错了……')
print('符号分优先级别的有:')
my_game.printisorder()
print('符号不分优先级别的有:')
my_game.printnoorder()
print(' ')
print('~~~~~~~~~~~~~~~ 本轮结束 ~~~~~~~~~~~~~~')
print(' 3秒后开始下一轮 ')
print(' ')
print(' ')
time.sleep(3)#延时进入下一轮 print('*******************************')
print(' ')
print(' 游戏结束,欢迎再来 ')
print(' ')
print('*******************************')