美文网首页
python3实现猜数字小游戏:根据设置参数进行猜数字游戏

python3实现猜数字小游戏:根据设置参数进行猜数字游戏

作者: AmanWang | 来源:发表于2020-09-07 16:04 被阅读0次

    小游戏介绍

    猜数字小游戏会根据不同的设置选项,进入到不同难度的游戏模式。找到规律后就会发现不是盲目随便猜的,详细玩法见下面的介绍。python3环境下代码可以直接可用。

    源码

    import random
    import time
    
    # 自定义判断是否为数字
    def is_number(s):
        try:
            float(s)
            return True
        except ValueError:
            return False
    
    # 猜数字小游戏主功能函数
    def guessNumber():
        print('''
        *******************************************************************************
         数字猜猜猜玩法介绍:
         1、程序开始后会生成一个数字,根据设置,可为整数或小数,每轮游戏中该数字保持不变
         2、输入你猜测的这个数是多少,如果输错会让你继续输入,直到猜对(如果设置了最多次
            数限制,达到限制后会自动退出本轮游戏)
         3、可以设置是否提示目标数字所在的区间
         4、如果连续3次输入的不是数字,会强制退出本轮游戏。
         5、一轮游戏结束后如果选择继续玩游戏则重新开始一轮,如果选择不继续玩游戏则退出游戏
         6、如果设置的开始数小于结尾数,则会对换两个数的位置
        *******************************************************************************
        ''')
    
        # 设置游戏参数(起始和结尾数后续改为游戏难易程度,根据不同的难易程度自动生成随机开始和结尾数)
        print('******请先设置游戏参数******')
    
        # 难度选择,0-目标数字在0-100之间,1-目标数字在-10000-10000之间,2-目标数字在-100000-100000之间,3-开始和结束数字随机,其他-目标数字在0-1000之间
        print('难易程度说明:0-目标数字在0-1000之间,1-目标数字在-10000-10000之间,2-目标数字在-100000-100000之间,3-开始和结束数字随机,其他-目标数字在0-500之间')
        easyOrHard = input('请选择难易程度:')
        if easyOrHard == '0':
            startNum = 0
            endNum = 999 + random.random()
        elif easyOrHard == '1':
            startNum = -10000 + random.random()
            endNum = 9999 + random.random()
        elif easyOrHard == '2':
            startNum = -100000 + random.random()
            endNum = 99999 + random.random()
        elif easyOrHard == '3':
            startNum = random.uniform(-100000000, 0)
            endNum = random.uniform(0.1, 100000000)
        else:
            startNum = 0
            endNum = 499 + random.random()
    
        limitCount = input('设置最多尝试次数(正整数n-限制n次,其他-不限制):')
        withDecimal = input('设置是否带小数(1-带小数,其他-不带小数):')
        decimals = input('设置小数的最大位数(必须为整数且大于等于1,否则默认为1,并且该参数只是限制小数的最大位数,不一定是小数的实际位数):')
        isTellMaxAndMin = input('设置是否显示目标数所处的区间(0-不显示,其他-显示):')
        isNeedHelp = input('是否需要提示(y-需要,其他-不需要):')
        if not is_number(limitCount) or int(float(limitCount)) < 1:
            limitCount = 0
        limitCount = int(float(limitCount))
        if not is_number(decimals) or int(float(decimals)) < 1:
            decimals = 1
        decimals = int(float(decimals))
    
        try:
            # 游戏开关
            is_start_now = input('参数设置完成,是否现在开始游戏?[y-开始,q-退出,其他-稍后开始],请选择:').lower()
            while (is_start_now != 'y'):
                if is_start_now == 'q':
                    print('已退出游戏')
                    return False
                is_start_now = input('是否现在开始游戏?[y-开始,q-退出,其他-稍后开始],请选择:').lower()
    
            # 游戏开始,并开始计时
            gameWheel = 1
            wheelsCostTimeDict = {}
            while is_start_now == 'y':
                if gameWheel > 1:
                    isResetGameParams = input('是否重新设置游戏参数(y-重新设置,其他-不重新设置),请选择:')
                    if isResetGameParams == 'y':
                        print(
                            '难易程度说明:0-目标数字在0-1000之间,1-目标数字在-10000-10000之间,2-目标数字在-100000-100000之间,3-开始和结束数字随机,其他-目标数字在0-500之间')
                        easyOrHard = input('请选择难易程度:')
                        if easyOrHard == '0':
                            startNum = random.random()
                            endNum = 999 + random.random()
                        elif easyOrHard == '1':
                            startNum = -10000 + random.random()
                            endNum = 9999 + random.random()
                        elif easyOrHard == '2':
                            startNum = -100000 + random.random()
                            endNum = 99999 + random.random()
                        elif easyOrHard == '3':
                            startNum = random.uniform(-100000000, 0)
                            endNum = random.uniform(0.1, 100000000)
                        else:
                            startNum = random.random()
                            endNum = 499 + random.random()
                        limitCount = input('设置最多尝试次数(正整数n-限制n次,其他-不限制):')
                        withDecimal = input('设置是否带小数(1-带小数,其他-不带小数):')
                        decimals = input('设置小数的最大位数(必须为整数且大于等于1,否则默认为1,并且该参数只是限制小数的最大位数,不一定是小数的实际位数):')
                        isTellMaxAndMin = input('设置是否显示目标数所处的区间(0-不显示,其他-显示):')
                        isNeedHelp = input('是否需要提示(y-需要,其他-不需要):')
                        if not is_number(limitCount) or int(float(limitCount)) < 1:
                            limitCount = 0
                        limitCount = int(float(limitCount))
                        if not is_number(decimals) or int(float(decimals)) < 1:
                            decimals = 1
                        decimals = int(float(decimals))
                # 生成目标数字
                if startNum > endNum:
                    startNum, endNum = endNum, startNum
                if str(withDecimal) != '1':
                    startNum, endNum = int(startNum), int(endNum)
                    randomNum = random.randint(startNum, endNum)
                    randomNumType = '整数'
                else:
                    startNum, endNum = float(startNum), float(endNum)
                    startNum_decimal_len, endNum_str_decimal_len = len(str(startNum).split('.')[1]), len(
                        str(endNum).split('.')[1])
                    decimal_len_max = max(startNum_decimal_len, endNum_str_decimal_len)
                    if decimal_len_max > decimals:
                        decimal_len_max = decimals
                    randomNum = round(random.uniform(startNum, endNum), decimal_len_max)
                    startNum = round(startNum, decimal_len_max)
                    endNum = round(endNum, decimal_len_max)
                    randomNumType = '小数'
    
                # 开始游戏
                if limitCount > 0:
                    limitCountInfo = '你只有 %d 次机会!' % (limitCount,)
                else:
                    limitCountInfo = '不限制次数'
                if str(isTellMaxAndMin) == '0':
                    print('第 %d 局游戏开始,目标数字已生成,%s' % (gameWheel, limitCountInfo))
                else:
                    print('第 %d 局游戏开始,目标数字已生成,大小介于[%s, %s]之间,%s' % (gameWheel, str(startNum), str(endNum), limitCountInfo))
                count = 0
                countError = 0
                start = time.time()
                while 1:
                    try:
                        if str(withDecimal) != '1':
                            yourNum = int(float(input('请输入你认为正确的数字:')))
                        else:
                            yourNum = float(input('请输入你认为正确的数字:'))
                        count += 1
                    except:
                        countError += 1
                        if countError < 3:
                            print('输入的不是数字!')
                            continue
                        else:
                            print('连续3次输入非数字,本轮游戏终止!')
                            wheelsCostTimeDict[gameWheel] = -1
                            gameWheel += 1
                            break
                    countError = 0
                    if limitCount > 0:
                        biggerMsg = '大了,你的数字比目标数字大【第 %d 次,剩余 %d 次机会】' % (count, limitCount - count)
                        smallerMsg = '小了,你的数字比目标数字小【第 %d 次,剩余 %d 次机会】' % (count, limitCount - count)
                    else:
                        biggerMsg = '大了,你的数字比目标数字大【第 %d 次】' % (count,)
                        smallerMsg = '小了,你的数字比目标数字小【第 %d 次】' % (count,)
                    if yourNum > randomNum:
                        print(biggerMsg)
                    elif yourNum < randomNum:
                        print(smallerMsg)
                    else:
                        end = time.time()
                        costAllSeconds = round(end - start, 3)
                        print('恭喜,你猜对了!目标数字为 %s,共猜 %d 次,用时 %d 小时 %d 分钟 %s 秒' % (
                        str(randomNum), count, costAllSeconds / 3600, (costAllSeconds % 3600) / 60,
                        '{:g}'.format(costAllSeconds % 60)))
                        wheelsCostTimeDict[gameWheel] = costAllSeconds
                        gameWheel += 1
                        break
    
                    if limitCount > 0 and count >= limitCount:
                        print('你尝试了 %d 次均未猜中,次数已达到限制,终止!【目标数字为 %s】' % (count, str(randomNum)))
                        wheelsCostTimeDict[gameWheel] = -2
                        gameWheel += 1
                        break
    
                    # 达到限制次数的一半或者不限制次数时已猜测超过10次,会连续询问3次是否需要提示
                    if randomNum > 0:
                        isPositiveNumber = '大于0的数'
                    else:
                        isPositiveNumber = '小于等于0的数'
                    if limitCount % 2 == 0:
                        halfLimitCount = int(limitCount / 2)
                    else:
                        halfLimitCount = int(limitCount / 2) + 1
                    if isNeedHelp == 'y' and ((limitCount == 0 and count in [10, 11, 12]) or (
                            limitCount > 0 and count in [halfLimitCount, halfLimitCount + 1, halfLimitCount + 2])):
                        randomNumInfo = input('你有3次提示机会,是否需要?(y/y1-第1个提示,y2-第2个提示,y3-第3个提示,y4-第4个提示,其他-不需要),请选择:').lower()
                        if randomNumInfo == 'y' or randomNumInfo == 'y1':
                            print('目标数字的位数为【%d】' % (len(str(abs(randomNum)))), )
                        elif randomNumInfo == 'y2':
                            print('目标数字是一个【%s】' % (randomNumType,))
                        elif randomNumInfo == 'y3':
                            print('目标数字是一个【%s】' % (isPositiveNumber,))
                        elif randomNumInfo == 'y4' and randomNumType == '小数':
                            print('目标数字小数部分的位数为【%d】' % (len(str(abs(randomNum)).split('.')[1]),))
                        elif randomNumInfo == 'y4' and randomNumType == '整数':
                            print('目标数字中的一个数为【%s】' % (random.choice(str(abs(randomNum))),))
    
                nextWheel = input('再玩一局?(q-退出游戏,其他-继续游戏),请选择:').lower()
                if nextWheel == 'q':
                    break
    
            wheelsCostTimeItems = wheelsCostTimeDict.items()
            successWheelCostTimeList = [v for k, v in wheelsCostTimeItems if v > 0]
            if successWheelCostTimeList:
                maxCostTime = max(successWheelCostTimeList)
                minCostTime = min(successWheelCostTimeList)
            else:
                maxCostTime = 0
                minCostTime = 0
            maxCostTimeWheelList = [k for k, v in wheelsCostTimeItems if v == maxCostTime]
            minCostTimeWheelList = [k for k, v in wheelsCostTimeItems if v == minCostTime]
    
            gameWheel = gameWheel - 1
    
            if minCostTime < 3600:
                minMsg = '%d 分钟 %s 秒' % (minCostTime / 60, '{:g}'.format(minCostTime % 60))
            else:
                minMsg = '%d 小时 %d 分钟 %s 秒' % (
                minCostTime / 3600, (minCostTime % 3600) / 60, '{:g}'.format(minCostTime % 60))
            if maxCostTime < 3600:
                maxMsg = '%d 分钟 %s 秒' % (maxCostTime / 60, '{:g}'.format(maxCostTime % 60))
            else:
                maxMsg = '%d 小时 %d 分钟 %s 秒' % (
                maxCostTime / 3600, (maxCostTime % 3600) / 60, '{:g}'.format(maxCostTime % 60))
    
            print('游戏已退出,战绩如下:')
            print('您总共玩了 %d 局,成功 %d 局,失败 %d 局' % (
            gameWheel, len(successWheelCostTimeList), gameWheel - len(successWheelCostTimeList)))
            if len(successWheelCostTimeList) > 1:
                print('成功局中第 %s 局用时最短,最短用时 %s' % (minCostTimeWheelList, minMsg))
                print('成功局中第 %s 局用时最长,最长用时 %s' % (maxCostTimeWheelList, maxMsg))
            if len(successWheelCostTimeList) == 1:
                print('第 %s 局成功,用时 %s' % (maxCostTimeWheelList, maxMsg))
            return True
        except Exception as e:
            print('遇到异常,退出游戏!')
            return e
    
    if __name__ == '__main__':
        guessNumber()
    

    体验结果示例

        *******************************************************************************
         数字猜猜猜玩法介绍:
         1、程序开始后会生成一个数字,根据设置,可为整数或小数,每轮游戏中该数字保持不变
         2、输入你猜测的这个数是多少,如果输错会让你继续输入,直到猜对(如果设置了最多次
            数限制,达到限制后会自动退出本轮游戏)
         3、可以设置是否提示目标数字所在的区间
         4、如果连续3次输入的不是数字,会强制退出本轮游戏。
         5、一轮游戏结束后如果选择继续玩游戏则重新开始一轮,如果选择不继续玩游戏则退出游戏
         6、如果设置的开始数小于结尾数,则会对换两个数的位置
        *******************************************************************************
        
    ******请先设置游戏参数******
    难易程度说明:0-目标数字在0-1000之间,1-目标数字在-10000-10000之间,2-目标数字在-100000-100000之间,3-开始和结束数字随机,其他-目标数字在0-500之间
    >请选择难易程度:0
    >设置最多尝试次数(正整数n-限制n次,其他-不限制):5
    >设置是否带小数(1-带小数,其他-不带小数):1
    >设置小数的最大位数(必须为整数且大于等于1,否则默认为1,并且该参数只是限制小数的最大位数,不一定是小数的实际位数):2
    >设置是否显示目标数所处的区间(0-不显示,其他-显示):1
    >是否需要提示(y-需要,其他-不需要):n
    >参数设置完成,是否现在开始游戏?[y-开始,q-退出,其他-稍后开始],请选择:y
    第 1 局游戏开始,目标数字已生成,大小介于[0.0, 999.57]之间,你只有 5 次机会!
    >请输入你认为正确的数字:500
    小了,你的数字比目标数字小【第 1 次,剩余 4 次机会】
    >请输入你认为正确的数字:700
    小了,你的数字比目标数字小【第 2 次,剩余 3 次机会】
    >请输入你认为正确的数字:900
    大了,你的数字比目标数字大【第 3 次,剩余 2 次机会】
    >请输入你认为正确的数字:800
    小了,你的数字比目标数字小【第 4 次,剩余 1 次机会】
    >请输入你认为正确的数字:750.91
    小了,你的数字比目标数字小【第 5 次,剩余 0 次机会】
    你尝试了 5 次均未猜中,次数已达到限制,终止!【目标数字为 871.98】
    >再玩一局?(q-退出游戏,其他-继续游戏),请选择:y
    >是否重新设置游戏参数(y-重新设置,其他-不重新设置),请选择:y
    难易程度说明:0-目标数字在0-1000之间,1-目标数字在-10000-10000之间,2-目标数字在-100000-100000之间,3-开始和结束数字随机,其他-目标数字在0-500之间
    >请选择难易程度:tt
    >设置最多尝试次数(正整数n-限制n次,其他-不限制):15
    >设置是否带小数(1-带小数,其他-不带小数):0
    >设置小数的最大位数(必须为整数且大于等于1,否则默认为1,并且该参数只是限制小数的最大位数,不一定是小数的实际位数):
    >设置是否显示目标数所处的区间(0-不显示,其他-显示):
    >是否需要提示(y-需要,其他-不需要):r
    第 2 局游戏开始,目标数字已生成,大小介于[0, 499]之间,你只有 15 次机会!
    >请输入你认为正确的数字:250
    大了,你的数字比目标数字大【第 1 次,剩余 14 次机会】
    >请输入你认为正确的数字:100
    小了,你的数字比目标数字小【第 2 次,剩余 13 次机会】
    >请输入你认为正确的数字:200
    小了,你的数字比目标数字小【第 3 次,剩余 12 次机会】
    >请输入你认为正确的数字:230
    大了,你的数字比目标数字大【第 4 次,剩余 11 次机会】
    >请输入你认为正确的数字:220
    大了,你的数字比目标数字大【第 5 次,剩余 10 次机会】
    >请输入你认为正确的数字:210
    小了,你的数字比目标数字小【第 6 次,剩余 9 次机会】
    >请输入你认为正确的数字:215
    小了,你的数字比目标数字小【第 7 次,剩余 8 次机会】
    >请输入你认为正确的数字:217
    小了,你的数字比目标数字小【第 8 次,剩余 7 次机会】
    >请输入你认为正确的数字:218
    小了,你的数字比目标数字小【第 9 次,剩余 6 次机会】
    >请输入你认为正确的数字:219
    恭喜,你猜对了!目标数字为 219,共猜 10 次,用时 0 小时 1 分钟 2.979 秒
    >再玩一局?(q-退出游戏,其他-继续游戏),请选择:q
    游戏已退出,战绩如下:
    您总共玩了 2 局,成功 1 局,失败 1 局
    第 [2] 局成功,用时 1 分钟 2.979 秒
    

    相关文章

      网友评论

          本文标题:python3实现猜数字小游戏:根据设置参数进行猜数字游戏

          本文链接:https://www.haomeiwen.com/subject/ruqlektx.html