要求在游戏《外星人入侵》中设置不同的难度等级,并增加让玩家选择起始难度等级的功能。
我认为练习的要求可以拆解为以下几点:
1,设置几个不同的难度等级可供玩家选择。
2,玩家只能在游戏处于停止状态的情况下选择难度等级,游戏进行中不能更改。
3,游戏开始后选择难度等级之后,如果游戏失败进入停止状态,在点击"Play"按钮后,游戏的节奏仍然是该难度等级下的初始状态。
4,存在一个默认的难度等级。玩家如果运行游戏后直接点击Play"按钮,游戏以此默认的难度等级开始进行。
个人认为这其实是有一定难度的,主要在于要设置游戏存在一个默认的难度等级,而一旦玩家选择了其他的难度等级之后,设若游戏失败了重新开始游戏时又还能够以玩家选择的这个难度等级继续进行游戏。(如果做不到这两点,则个人认为游戏是不够智能的)
我的思路是使用条件测试语句来解决问题。
首先在Settings类中的__init__初始参数中增加如下几个难度判断符号。
#默认游戏难度为normal
self.easy = False
self.normal = True
self.hard = False
然后再在Settings类中增加如下4个方法,它包含一个根据游戏难度判断符号来调用游戏参数的方法,以及三个可供选择的不同等级的游戏参数。
def initialize_dynamic_settings(self):
"""设置游戏不同等级难度"""
if self.easy:
self._easy_settings()
elif self.normal:
self._normal_settings()
elif self.hard:
self._hard_settings()
def _easy_settings(self):
"""easy游戏难度的设置"""
self.ship_speed = 0.6
self.bullet_color = (0, 0, 255)
self.bullet_speed = 2
self.alien_speed = 0.15
self.fleet_drop_speed = 10
def _normal_settings(self):
"""normal游戏难度的设置"""
self.ship_speed = 0.8
self.bullet_color = (0, 0, 0)
self.bullet_speed = 2
self.alien_speed = 0.2
self.fleet_drop_speed = 15
def _hard_settings(self):
"""hard游戏难度的设置"""
self.ship_speed = 1
self.bullet_color = (255, 0, 0)
self.bullet_speed = 2
self.alien_speed = 0.25
self.fleet_drop_speed = 20
然后删掉Settings类中__init__初始参数对于initialize_dynamic_settings方法的调用,因为对于改方法的调用可以放在游戏Play按钮中进行。
接着就是增加游戏主AlienInvasion类对于游戏难度参数的调用方式。
首先在_start_game方法中调用initialize_dynamic_settings方法,可以放在rest_stats之后。增加后的_start_game方法如下:
def _start_game(self):
"""开始运行游戏"""
#重置游戏统计信息。
self.stats.rest_stats()
self.settings.initialize_dynamic_settings()
self.stats.game_active = True
#清空余下的外星人和子弹。
self.aliens.empty()
self.bullets.empty()
#创建一群新的外星人,并让飞船居中。
self._create_fleet()
self.ship.center_ship()
#隐藏鼠标光标。
pygame.mouse.set_visible(False)
然后再在响应按键的_check_keydown_events方法中增加调整settings中的游戏难度判断符号的值的方法,增加后后_check_keydown_events方法如下:
def _check_keydown_events(self, event):
"""响应按键。"""
#按左右键控制飞船移动
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
#按q键退出游戏
elif event.key == pygame.K_q:
sys.exit()
#按空格键控制飞船发射子弹
elif event.key == pygame.K_SPACE:
self._fire_bullet()
#按在游戏停止的情况下,按p键开始游戏
elif event.key == pygame.K_p and not self.stats.game_active:
self._start_game()
#在游戏停止的情况下,按e、n、h键调整游戏的难度
elif event.key == pygame.K_e and not self.stats.game_active:
self.settings.easy = True
self.settings.normal = False
self.settings.hard = False
elif event.key == pygame.K_n and not self.stats.game_active:
self.settings.easy = False
self.settings.normal = True
self.settings.hard = False
elif event.key == pygame.K_h and not self.stats.game_active:
self.settings.easy = False
self.settings.normal = False
self.settings.hard = True
需要注意的是,我将settings.initialize_dynamic_settings方法的调用放在了_start_game中而不是_check_play_button方法中。
这样,就实现了练习要求的功能。