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

小游戏介绍

猜数字小游戏会根据不同的设置选项,进入到不同难度的游戏模式。找到规律后就会发现不是盲目随便猜的,详细玩法见下面的介绍。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 秒
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355