无闻无问 发表于 2021-4-2 09:28

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('*******************************')


无闻无问 发表于 2021-4-3 11:53

orange2478 发表于 2021-4-2 21:46
这题目是不是要自己先验算过一次才出题呀?
如果可以组成24点的才出题,不能组成的就PASS掉重新随机

能不能也是一种判断,不能就n或N,电脑就判断,如果能,你答了n,它就出示正确答案…

无闻无问 发表于 2021-4-2 12:36

JuncoJet 发表于 2021-4-2 09:36
验证部分直接eval不香?

分几种,分2种验证输入,按数学优先级:先括号,再乘除后加减;不按优先级,从左往右依次算…

JuncoJet 发表于 2021-4-2 09:36

验证部分直接eval不香?

兮若求 发表于 2021-4-2 09:37

刚开始学习Python,借鉴借鉴

zeeo0_0 发表于 2021-4-2 09:40

自学的c++路过

xiaolai1995 发表于 2021-4-2 09:45

向大佬学习

~望叔♂ 发表于 2021-4-2 09:45

学Java路过

不是童画 发表于 2021-4-2 09:58

应该是我的眼中,已经是专家了。反正我就是刚入门。

ywchn999 发表于 2021-4-2 10:12

正在学,试试

无闻无问 发表于 2021-4-2 12:40

zeeo0_0 发表于 2021-4-2 09:40
自学的c++路过

用c代码更多,一个eval省好多事…
页: [1] 2
查看完整版本: 24点小游戏--我的python学到什么火候了?