作业:侧面射击之按键和按钮开启游戏方法

练习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键无效,需要调整成英文输入模式才能开启游戏,望各网友遇到相似情况时能通过本文得到解决~

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值