用优雅的python语言实现简单的猜数字游戏,并给出一定的提示,附加一些小亮点,增加游戏体验。
代码如下:
import random
import time #时间模块
#在命令行中输入:time.time() time 是个模块,我们要调用模块里面的方法
#我们会得到一个秒数,是从(英国时间)1970年1月1日的零点开始到现在一共经过的秒数
import sys #sys是系统
#print(sys.argv) #此条语句可以输出系统中的命令行中的参数,#argv,用来取命令行的参数
guess_limit = int(sys.argv[1]) #下标从0开始,取到的是字符型,要变成int类型的
#在用命令行的形式输出结果:1.cmd打开黑窗口,进入到对应位置(存放python代码的要运行的那个文件位置)输出: python 文件名.py [其他的参数列表,用空格隔开]
#guess_limit是最大猜测次数
scores = [] #用于保存战绩
game_count = 0 #游戏的轮数
while (1):
game_count = game_count+1 #每执行一次轮数加一
number = random.randint(1,10) #在1到10之间随机产生一个数(1和10都包含在内)
is_right = False #用于判断是否猜对,默认是错
begin_time = time.time()
print("请在1到10之间猜一个数字")
for i in range(guess_limit):
guess_number = int(input()) #用户输入所猜的数字
if(number == guess_number):
is_right = True
break; #猜对了游戏就结束,循环终止
else:
print("不对哦",end=',')
if(number > int(guess_number)):
print("猜小了",end=',')
else:
print("猜大了",end=',')
if(i < guess_limit-1): #猜测次数没有到就可以继续猜
print("重新猜一下叭...")
#对猜测结果进行处理
if(is_right == True):
print("猜对了,你真聪明")
else:
print("猜测机会已经用完啦...")
end_time = time.time()
used_time = end_time - begin_time #在游戏开始和结束处都记录时间,两者的时间差就是游戏所用的时间
used_time = round(used_time,2) #时间后面有很多位,用round方法只使其只保留两位小数
print(f"本局游戏共用了{int(used_time)}秒")
#保存战绩
scores.append((game_count,is_right,used_time)) #元组
best_score = min(scores,key=lambda x:x[2] if x[1] else 9999) #最好的成绩
#取scores中的最小值,默认是对scores中第一个数据进行比较,也就是game_count,但是我们并不是取轮数的最小值,而是取时间的最小值,所以我们要设立key等于时间,求时间的最小值
#key=lambda x: x[2]解释
#lambda匿名函数
# 等价于
# def 函数(x):
# return x[2]
#x[2]是指列表或者字符串这样的第三个元素,因为下标从0开始
#在这里key=lambda x:x[2]我们可以理解为给把scores当成数组,取个名字为x,然后我们需要的时间是其中的第三个值,这里的下标是从0开始的,那么used_time对应的就是x[2],此处的if于下面某处代码类似,见下解
#当游戏成功的时候来判断是否存在最好成绩才是合理的,这里要用一个if来对比较的used_time进行筛选。当游戏失败就用used_time和9999比较(也可以是一个其他很大的数,python中数可以一直大下去,在这里取9999)
print("\n=============历史战绩=================\n")
for _game_count, _is_right, _used_time in scores: #把scores里面的三个值拿出来,分别赋值给_game_count,_is_right,_used_time这三个变量
# if(_is_right): #普通的if语,对复杂的可以这样处理,对与简单的直接进行赋值的就可以使用下面一种
# label = '成功✌' #根据_is_right的值给label赋值,最后输出label
# else:
# label = '失败❌'
#if的第二种方法
label = '挑战成功' if(_is_right) else '挑战失败'
best_label = 'MVP' if(_game_count == best_score[0] and best_score[1]) else '' #在最好的成绩那一轮中加一个MVP标志
print(f"第{_game_count}轮,{label},用时{_used_time}秒 {best_label} ")
print("\n======================================")
#是否游戏判断
stop = input("按下y重新开一局,按其他键结束游戏(直接回车也可终止游戏)...")
if(stop != 'y'):
print("欢迎下次来玩...")
break
else:
print("\n--------------------------------------------\n")
print("新一轮游戏开始咯",end ='\n') #默认就是会回车,所以end='\n'可以不写
效果如图所示:
在这里比一般的程序多输入了一个参数3,这个参数会被接收,因为我们要用到这个参数,所以当我们不输入这个参数时有bug,如下:
argv可以获取我们输入的参数,在本程序中我们获取输入的第二个参数,当作我们的允许每轮游戏猜测的次数。代码中有解释喔~