2.3 实现开始游戏的功能
当显示图1所示的游戏启动界面后,根据提示点击“确定”按键,则可以开始游戏。也就是要完成键盘监听的功能,当游戏程序监听到玩家点击了“确定”按键后,开始游戏。
在《Python游戏编程入门注-第4章2》中介绍了通过按键ID和通过按键名两种方法监听玩家按键。在本游戏程序中,使用的是另外一种方法-按键状态来监听玩家按键。
2.3.1 获取按键状态
在while True循环中,通过如图1所示代码获取按键状态。
图1 获取按键状态的代码
其中,pygame.key模块中的get_pressed()函数的作用是获取键盘中所有按键的状态,该函数的返回值是一个布尔类型数据的序列,这些布尔数据表示键盘中所有按键的状态,True表示按下,False表示没有按下。
2.3.2 判断按键是否被按下
在获取了按键信息后,通过如图2所示的代码判断按键是否被按下。
图2 判断按键是否被按下的代码
其中,第28-30行代码判断“Esc”按键是否被按下,当该按键被按下时,keys[K_ESCAPE]的值是True,此时退出pygame以及游戏程序;第32-28行代码判断“回车”按键是否被按下,如果该按键被按下时,keys[K_RETURN]的值是True,第33行代码判断是否是在游戏未开始的时候按下的“回车”按键,如果是,则把游戏开始的表示game_over设置为False,表示游戏已开始;游戏分数score设置为0;seconds表示游戏总时间,因为游戏时间为10秒,所以将其设置为11;第38行是修改自第37行代码,time.clock()函数在Python3.8及以上版本已不再使用,取而代之的是time.perf_counter()函数,该函数的作用是获取当前时间,即游戏开始时间,并将其保存在变量clock_start中。
注意1 需要导入time库。
注意2 变量seconds和clock_start需要在while True循环之外定义,初始值均为0。
相关链接1 time.perf_counter()是python中用于测量高精度性能计数器的函数。它返回一个浮点数,表示从某个未指定的起点开始经过的时间(通常是系统启动后的时间)。这个时间以秒为单位,具有非常高的精度,适合用于测量短时间内的执行时间。使用time.perf_counter()统计程序执行时间非常简单,只需要在代码的开始和结束时分别调用time.perf_counter(),然后计算两者之间的差值即可。
2.4 实现按键状态显示
图2中可以看到,游戏开始之后,如果玩家按下了某个按键,会在游戏界面的右上角显示“<key>”表示按键被按下。实现以上功能的步骤是判断是否有按键被按下,如果有,则在右上角显示“<key>”。
2.4.1 判断是否有按键被按下
在while True循环中,通过如图3所示的代码判断是否有按键被按下。
图3 判断是否有按键被按下的代码
其中,第24-27行代码为之前提到的pygame框架代码,第28-31行代码通过对event.type进行判断,当该值是KEYDOWN时表示有按键被按下,则按键按下标志key_flag的值设置为True;当该值是KEYUP时表示有按键被松开,则按键按下标志key_flag的值设置为False。
注意3 按键按下标志key_flag在while True循环之外定义,初始值设置为False。
2.4.2 显示“<key>”
当有按键被按下后,在while True循环中通过图4所示代码显示“<key>”。
图4 显示“<key>”的代码
2.5 实现游戏功能
游戏的主要功能就是判断用户的按键与指定按键是否相同,如果相同则随机指定并显示下有一个按键,继续判断用户的按键直到游戏时间结束。判断用户的按键及随机产生指定按键的代码如图5所示。
图5 判断用户的按键及随机产生指定按键的代码
从图5中可以看出,首先判断游戏运行时间current是否在指定的时间seconds范围内,如果在范围内,则说明游戏时间还未结束。第49行代码通过time.perf_counter()函数获取当前时间,之后再减去游戏起始时间clock_start得到游戏运行时间current;第50-51行判断如果游戏时间已经超出指定时间,则表示游戏已经结束,将game_over设置为True;第52-55行判断如果游戏还未结束,则继续判断玩家是否正确点击了指定的按键,也就是keys[corrent_answer]是否是True,如果是True则说明玩家点击按键正确,接下来第54行随机产生下一个字母(97-122表示’a’-’z’),最后分数score加1。
注意4 需要导入random库。
2.6 显示倒计时
在游戏进行中,会显示倒计时,如《Python游戏编程入门》注-第4章3》中图2所示。显示倒计时的代码如图6所示。
图6 显示倒计时的代码
其中,game_over是游戏结束的标志,如果游戏没有结束,该标志的值是False,此时通过自定义函数print_text()显示倒计时,seconds是游戏规定的总时间,current是游戏已消耗时间。