前言:
现时各位老铁们对“python猜数字游戏代码异常处理”大概比较重视,大家都想要剖析一些“python猜数字游戏代码异常处理”的相关文章。那么小编也在网上收集了一些关于“python猜数字游戏代码异常处理””的相关内容,希望我们能喜欢,朋友们一起来学习一下吧!小游戏介绍
猜数字小游戏会根据不同的设置选项,进入到不同难度的游戏模式。
如,随机产生一个数字n,然后告诉你n所在的区间,每猜一次会告诉你,你输入的数字比n大还是比n小,直到猜对。根据不同的难度,可以设定是否带小数,小数包含几位,是否需要负数。听着可能觉得太难猜测了,但是实际上我试了几次后发现一般20次以内就可以猜对。
详细玩法见下面源码注释中的介绍。python3环境下代码可以直接执行。
源码
import randomimport 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 eif __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 秒
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。