编程语言
首页 > 编程语言> > 《Python编程:从入门到实践》外星人入侵项目课后练习12-5

《Python编程:从入门到实践》外星人入侵项目课后练习12-5

作者:互联网

最近在看 《python编程:从入门到实践》,书中的项目实践部分有一些课后练习,为了巩固自己学的东西,我选择了一些自己感兴趣的习题进行编程,目前只看到项目1部分,项目2还没开始,以后继续更新代码,因为自己是新手,欢迎大家对我编码过程中的不足和错误进行指正。

12-5:侧面射击
这个题目所需创建的py文件如下所示,题中没有要求显示外星人的操作,所以只需要一张飞船的照片(我提前将飞船顺时针旋转90度),放在image文件夹中即可。旋转之后的飞船

文件夹

下面是各个模块对应的代码块:
首先是基本游戏的一些基本设置,比如游戏屏幕的长宽、背景的颜色、子弹的速度、子弹的长宽、子弹的颜色以及子弹移动的速度等。

settings.py

class Settings():
    def __init__(self):
        # 定义屏幕的宽度和高度
        self.screen_width = 1900
        self.screen_height = 1000
        self.bg_color = (230, 230, 230)  # 设置背景色,浅灰色
        self.ship_speed_factor = 1.5

        self.bullet_speed_factor = 1
        self.bullet_width = 15
        self.bullet_height = 3
        self.bullet_color = 60, 60, 60
        self.bullets_allowed = 3

接下来是飞船的一些基本属性,包括如何导入飞船图片、飞船的初始位置、以及游戏开始后位置如何更新、飞船如何显示等。

ship.py

import pygame

class Ship():
    def __init__(self,ai_settings,screen):
        self.screen = screen
        self.image = pygame.image.load('C:/Users/Xin/PycharmProjects/alien_invasion/image/ship.bmp')
        self.ai_settings = ai_settings

        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centery = self.screen_rect.centery
        self.center = float(self.rect.centery)
        self.moving_right = False
        self.moving_left = False

    def biltme(self):
        self.screen.blit(self.image, self.rect)

    def update(self):
        ''' 根据移动标志调整飞船位置'''
        if self.moving_right:
            self.center +=self.ai_settings.ship_speed_factor
        if self.moving_left:
            self.center -= self.ai_settings.ship_speed_factor

        self.rect.centery = self.center

接下来是子弹的一些基本属性,包括如何产生子弹、子弹位置初始化、子弹位置如何更新、子弹的显示。

bullet.py

#创建子弹类,定义子弹的位置、如何变化以及显示子弹

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    def __init__(self,ai_settings,screen,ship):
        super().__init__()
        self.screen = screen
        #在(0,0)处创建一个表示子弹的矩形,然后再设置位置
        self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
        self.rect.centery = ship.rect.centery
        self.rect.right = ship.rect.right

        # 存储用小数表示的子弹的位置
        self.x = float(self.rect.x)

        self.color = ai_settings.bullet_color
        self.speed_factor = ai_settings.bullet_speed_factor

    def update(self):
        self.x += self.speed_factor
        self.rect.x = self.x

    def draw_bullet(self):
        pygame.draw.rect(self.screen,self.color,self.rect)

接下来是用到的主要函数,实时响应鼠标和键盘的操作从而更新飞船、子弹的位置,并显示对应的位置,或者结束游戏。

game_functions.py

'''
包含一系列函数,管理飞船、子弹的位置更新等等
'''

import sys
import pygame
from moving_up_down.bullet import Bullet


def check_events(ai_settings,screen,ship,bullets):
    '''
    响应按键和鼠标事件
    :return: 
    '''
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,ai_settings,screen,ship,bullets)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)

def update_screen(ai_settings,screen,ship,bullets):
    """
    更新屏幕上的图像,并切换到新屏幕上
    :param ai_settings: 
    :param ship: 
    :return: 
    """
    screen.fill(ai_settings.bg_color)  # 将背景色填满整个屏幕
    for bullet in bullets.sprites():
        #返回一个包含bullets中所有精灵的列表
        bullet.draw_bullet()
    ship.biltme()

    # 让最近绘制的屏幕可见
    pygame.display.flip()

def check_keydown_events(event,ai_settings,screen,ship,bullets):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        ship.moving_left = True
    elif event.key == pygame.K_SPACE:
        fire_bullet(ai_settings,screen,ship,bullets)
    elif event.key == pygame.K_q:
        sys.exit()

def fire_bullet(ai_settings,screen,ship,bullets):
    if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings, screen, ship)
        bullets.add(new_bullet)

def check_keyup_events(event,ship):
    if event.key == pygame.K_LEFT:
        ship.moving_left = False
    elif event.key == pygame.K_RIGHT:
        ship.moving_right = False

def update_bullets(bullets,ai_settings):
    #更新子弹位置
    bullets.update()
    for bullet in bullets.copy():
        # 删除屏幕之外的子弹
        if bullet.rect.left > ai_settings.screen_width:
            bullets.remove(bullet)

最后是主文件,创建一系列需要用到的对象,开始游戏。

alien_invasion.py

'''
主文件
创建一系列、整个游戏都需用到的对象

'''
import pygame
from pygame.sprite import Group
from moving_up_down.settings import Settings
from moving_up_down import game_functions as f
from moving_up_down.ship import Ship


def run_game():
    #初始化游戏并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) # 设置游戏显示窗口
    pygame.display.set_caption("Alien Invasion")

    # 创建一艘飞船
    ship = Ship(ai_settings,screen)
    bullets = Group()

    # #开始游戏主循环
    while True:
        # 监视鼠标和键盘事件,根据事件进行相应的操作
        f.check_events(ai_settings, screen, ship, bullets)
        # 更新位置
        ship.update()
        f.update_bullets(bullets,ai_settings)

        # 每次循环都重新绘制屏幕
        f.update_screen(ai_settings, screen, ship, bullets)

run_game()

《Python编程:从入门到实践》外星人入侵项目课后练习12-5

标签:12,settings,Python,self,ai,pygame,课后练习,ship,screen
来源: https://blog.csdn.net/qq_37784961/article/details/110567721