python 项目1 外星人入侵2 2021-02-23

import sys

import pygame

from settings import Settings

from ship import Ship

from bullet import Bullet

class AlienInvasion:

    def __init__(self):

        # 初始化游戏并创建游戏资源

        pygame.init()

        self.settings = Settings()

        self.screen = pygame.display.set_mode(

            (self.settings.screen_width, self.settings.screen_height))

        # 游戏窗口标题

        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self)

        self.bullets = pygame.sprite.Group()

    def run_game(self):

        # 开始游戏的主循环

        while True:

            # 监视键盘和鼠标事件

            self._check_events()

            self.ship.update()

            self._update_bullets()

            self._update_screen()

    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)

    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

        elif event.key == pygame.K_q:  # 可以按Q结束游戏

            sys.exit()

        elif event.key == pygame.K_SPACE:

            self._fire_bullet()

    def _check_keyup_events(self, event):

        # 松开

        if event.key == pygame.K_RIGHT:

            self.ship.moving_right = False

        elif event.key == pygame.K_LEFT:

            self.ship.moving_left = False

    def _fire_bullet(self):

        # 创建一颗子弹,并放到编组bullets中

        if len(self.bullets) < self.settings.bullet_allowed:

            new_bullet = Bullet(self)  # 创建一个Bullet实例并赋给new_bullet

            self.bullets.add(new_bullet)  # 添加到编组中

    def _update_bullets(self):

        # 更新子弹的位置并删除消失的子弹

        self.bullets.update()

        # 删除消失的子弹

        for bullet in self.bullets.copy():

            if bullet.rect.bottom <= 0:

                self.bullets.remove(bullet)

    def _update_screen(self):

        # 更新屏幕上的图像,并切换到新屏幕

        # 每次循环都重绘屏幕

        self.screen.fill(self.settings.bg_color)

        self.ship.blitme()

        for bullet in self.bullets.sprites():

            bullet.draw_bullet()

        # 让最近绘制的屏幕可见

        pygame.display.flip()

if __name__ == "__main__":

    # 创建游戏实例并允许游戏

    ai = AlienInvasion()

    ai.run_game()


setting:

class Settings:

    # 存储游戏中所有设置的类

    def __init__(self):

        # 初始化游戏设置

        # 屏幕设置

        # 游戏窗口:宽1200,高800像素

        self.screen_width = 1200

        self.screen_height = 800

        # 设置背景颜色

        self.bg_color = (230, 230, 230)

        # 飞船设置

        self.ship_speed = 1.5

        # 子弹设置

        self.bullet_speed = 1.0

        self.bullet_width = 3

        self.bullet_height = 15

        self.bullet_color = (60, 60, 60)

        self.bullet_allowed = 3


子弹:

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

    def __init__(self, ai_game):

        # 在飞船当前位置创建一个子弹对象

        super().__init__()

        self.screen = ai_game.screen

        self.settings = ai_game.settings

        self.color = self.settings.bullet_color

        # 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置

        self.rect = pygame.Rect(

            0, 0, self.settings.bullet_width, self.settings.bullet_height)

        self.rect.midtop = ai_game.ship.rect.midtop

        # 存储用小数表示的子弹位置

        self.y = float(self.rect.y)

    def update(self):

        # 向上移动子弹

        # 更新表示子弹位置的小数值

        self.y -= self.settings.bullet_speed

        # 更新表示子弹的rect位置

        self.rect.y = self.y

    def draw_bullet(self):

        # 在屏幕上绘制子弹

        pygame.draw.rect(self.screen, self.color, self.rect)


你可能感兴趣的:(python 项目1 外星人入侵2 2021-02-23)