24点小游戏--我的python学到什么火候了?
不知道有多少童鞋知道这个玩意??{:1_918:}小时候,经常玩的游戏,一副扑克去花,随机抽4张,通过加减乘除运算成24,规则简单,但特考验口算能力……
后来发现,许多计算器,也有这个小玩意,没事,玩玩,还别有一番风趣!
这几天,偶然想起这个小游戏,遂想想用python实现一下,检验一下自己python火候学到了几分?磨磨蹭蹭写了2天,算是基本上写完了……里面估计还有bug,请发现的朋友不吝指教,先言谢谢!
新手一枚,想问大佬们,我这Python学到什么程度了?
分享一下,正学Python的童鞋可以练练……
献丑了,献丑了,献丑了……:Dweeqw
win10环境下pycharm测试......
以下是源代码,从pycharm中ctrl+c,ctrl+v过来的,附件中放了rar格式源文件:
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:#验证输入长度
returnFalse
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('*******************************')
orange2478 发表于 2021-4-2 21:46
这题目是不是要自己先验算过一次才出题呀?
如果可以组成24点的才出题,不能组成的就PASS掉重新随机
能不能也是一种判断,不能就n或N,电脑就判断,如果能,你答了n,它就出示正确答案… JuncoJet 发表于 2021-4-2 09:36
验证部分直接eval不香?
分几种,分2种验证输入,按数学优先级:先括号,再乘除后加减;不按优先级,从左往右依次算… 验证部分直接eval不香? 刚开始学习Python,借鉴借鉴 自学的c++路过 向大佬学习 学Java路过 应该是我的眼中,已经是专家了。反正我就是刚入门。
正在学,试试 zeeo0_0 发表于 2021-4-2 09:40
自学的c++路过
用c代码更多,一个eval省好多事…
页:
[1]
2