吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3668|回复: 18
收起左侧

[Python 转载] 24点小游戏--我的python学到什么火候了?

[复制链接]
无闻无问 发表于 2021-4-2 09:28
  不知道有多少童鞋知道这个玩意??
  小时候,经常玩的游戏,一副扑克去花,随机抽4张,通过加减乘除运算成24,规则简单,但特考验口算能力……
  后来发现,许多计算器,也有这个小玩意,没事,玩玩,还别有一番风趣!
这几天,偶然想起这个小游戏,遂想想用python实现一下,检验一下自己python火候学到了几分?磨磨蹭蹭写了2天,算是基本上写完了……里面估计还有bug,请发现的朋友不吝指教,先言谢谢!

  新手一枚,想问大佬们,我这Python学到什么程度了?

  分享一下,正学Python的童鞋可以练练……
  献丑了,献丑了,献丑了……

  win10环境下pycharm测试......

1.jpg

2.jpg

3.jpg


以下是源代码,从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]  # 第一步的结果连接34两个字符组成第二步表达式
        result = eval(str2)  # 第二步结果
        str3 = str(result) + inputstr[5:7]  # 第二步的结果连接56两个字符组成第三步表达式
        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-94个数
        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('     输入nN确认4个数字不能组成24……     ')
print('            Qq键退出                ')
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('*******************************')


game24.rar

2.57 KB, 下载次数: 46, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
chsezxj + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 无闻无问 发表于 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
兮若求 发表于 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

用c代码更多,一个eval省好多事…
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表