练习14-1:按P键开始新游戏 鉴于游戏《外星人入侵》使用键盘来控制飞船,最好也能够让玩家通过按键来开始游戏。请添加在玩家按P键时开始游戏的代码。也许这样做会有所帮助:将_check_play_button()的一些代码提取出来,放到一个名为_start_game()的方法中,并在_check_play_button()和_check_keydown_events()中调用这个方法。
练习14-2:射击练习 创建一个矩形,让它在屏幕右边缘以固定的速度上下移动。然后,在屏幕左边缘创建一艘飞船,玩家可上下移动它来射击前述矩形标靶。添加一个用于开始游戏的Play按钮,在玩家三次未击中目标时结束游戏,并重新显示Play 按钮,让玩家能够单击该按钮来重新开始游戏。
答:效果图如下:
代码如下:
1.button.py
import pygame.font
class Botton:
def __init__(self, ai_game, msg):
"""初始化按钮的属性。"""
self.screen = ai_game.screen
self.screen_rect = self.screen.get_rect()
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (237, 195, 194)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None, 48)
# 创建按钮的rect对象,并使其居中
self.rect = pygame.Rect(0, 0, self.width, self.height)
self.rect.center = self.screen_rect.center
# 按钮的标签只需创建一次
self._prep_msg(msg)
def _prep_msg(self, msg):
"""将msg渲染为图像,并使其在按钮上居中。"""
self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本。
"""调用screen.fill()来绘制表示按钮的矩形"""
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
2.game_stats.py
class GameStats:
"""跟踪游戏的统计信息"""
def __init__(self, ai_game):
"""初始化统计信息"""
self.settings = ai_game.settings
self.reset_stats()
# 游戏刚启动时处于非活动状态
self.game_active = False
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.furongs_left = self.settings.furong_limit
3.kung_fu.py调整
1)增加代码:
from button import Botton
from time import sleep
2)类 __init__() 添加代码:
# 创建Play按钮
self.play_button = Botton(self, "Play")
3)添加或修改其他类代码:
def _check_events(self):
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_pos = pygame.mouse.get_pos()
self._check_play_button(mouse_pos)
def _check_play_button(self, mouse_pos):
"""在玩家单击Play按钮时开始新游戏。"""
button_clicked = self.play_button.rect.collidepoint(mouse_pos)
if button_clicked and not self.stats.game_active:
self._start_game()
def _start_game(self):
# 重置游戏统计信息。
self.stats.reset_stats()
self.stats.game_active = True
# 清空余下的白展堂和攻击。
self.zhantangs.empty()
self.attack.empty()
# 创建一群新的大侠并让郭芙蓉居中
self._create_daxia()
self.furong.center_furong()
# 隐藏鼠标光标
pygame.mouse.set_visible(False)
def _check_keydown_events(self, event):
if event.key == pygame.K_UP:
self.furong.moving_top = True
elif event.key == pygame.K_DOWN:
self.furong.moving_bottom = True
elif event.key == pygame.K_SPACE:
self._fire_attack()
elif event.key == pygame.K_p:
"""响应按键P来开始游戏"""
if not self.stats.game_active:
self._start_game()
def _update_screen(self):
self.screen.fill(self.settings.bg_color)
self.furong.blitme()
for attack in self.attack.sprites():
attack.draw_attack()
self.zhantangs.draw(self.screen)
# 如果活动处于非活动状态,就绘制Play按钮
if not self.stats.game_active:
self.play_button.draw_button()
pygame.display.flip()
def _furong_hit(self):
"""响应郭芙蓉被白展堂撞到"""
if self.stats.furongs_left > 0:
# 将 furong_left 减 1
self.stats.furongs_left -= 1
# 清空余下的白展堂和攻击
self.zhantangs.empty()
self.attack.empty()
# 创建一群新的大侠,并将郭芙蓉放在屏幕左边的中央
self._create_daxia()
self.furong.center_furong()
# 暂停
sleep(0.5)
else:
self.stats.game_active = False
pygame.mouse.set_visible(True)
PS:开始时,笔者编写了P键开始游戏的代码后点击P键一直无反应,很是苦恼,折腾很久后突然福至心灵!发现是输入法的问题!开启中文输入模式时点击P键无效,需要调整成英文输入模式才能开启游戏,望各网友遇到相似情况时能通过本文得到解决~