python飞机大战笔记

  1. 代码模块
  •  主模块 通过调用其他函数运行游戏

  • 三个实体类定义模块 ship alien bullet

  • 函数功能模块 

  • 控制游戏运行和暂停模块

  • 游戏参数模块

 

2.ship alien bullet模块

(1)实体类模块定义了实体的属性初始化和行为, 都含有init()初始化函数和update()位置更新函数,其中pygame含image和screen的对象通过get_rect()可获得相关的rect对象进而获取图像和屏幕的center、centerx、centery、bottom、top、right、left的值例如

self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()

self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom

(2)alien 和ship 中含有blitme函数可将图片绘制在屏幕上

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

bullet中则含有

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

可将子弹生成于屏幕中,两者的不同在于外星人和飞船是使用现有的图片,子弹则是自动生成的矩形,所以绘制方法有差别

(3)alien和bullet类继承Sprite(精灵),通过使用精灵可在游戏中对相关的元素编组并可以同时进行操作所有相关元素,子弹和外星人有多个,所以需要使用精灵统一管理,元素编组如下:

 bullets = Group()
 aliens = Group()

知识点补充:

精灵组

当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事,那么有没有什么容器可以将这些精灵放在一起统一管理呢?答案就是精灵组。

pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。

使用pygame.sprite.Group()函数可以创建一个精灵组:

group = pygame.sprite.Group()
group.add(sprite_one)

精灵组也有update和draw函数:

group.update()
group.draw()

转载于https://www.cnblogs.com/msxh/p/5013555.html

 

3.函数功能模块

内含多个功能函数用于游戏功能的控制,如检测并响应玩家操作、生成子弹

(1)check_events()检测鼠标和键盘事件

def check_events(ai_settings,ship,screen,bullets):
    for event in pygame.event.get():
        #检测窗口关闭
        if event.type == pygame.QUIT:
            sys.exit()
        #检测按键按下
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,ai_settings,ship,screen,bullets)
        #检测按键松开
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ai_settings,ship,screen,bullets)

(2)外星人函数

外星人生成函数

def create_alien(ai_settings, screen, aliens, alien_number, row_number ):
    alien = Alien(ai_settings, screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 *alien.rect.height * row_number
    aliens.add(alien)

create_alien()创建单个外星人将其添加到编组中

#创造外星人集群
def create_fleet(ai_settings, screen, aliens, ship):
    alien = Alien(ai_settings, screen)
    number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
    number_rows = get_nummber_rows(ai_settings, ship.rect.height, alien.rect.height)
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
           create_alien(ai_settings, screen, aliens, alien_number, row_number)
create_fleet()创建外星人集群,get_number_aliens_x和get_nummber_rows都是自编函数分别用于计算外星人集群横向和纵向排布数量,然后使用双循环添加外星人

 

检测外星人运动函数

def check_fleet_edges(ai_settings, aliens):
    # 外星人到达边缘采取的措施
    for alien in aliens.sprites():
        if alien.check_edges():
            #将整群外星人向下移并改变他们的水平方向
            change_fleet_direction(ai_settings, aliens)
            break
#将整群外星人向下移并改变他们的水平方向
def change_fleet_direction(ai_settings, aliens):
    for alien in aliens.sprites():
        alien.rect.y += ai_settings.fleet_drop_speed
    ai_settings.fleet_direction *= -1

aliens.sprites()表示对aliens编组的遍历

(3)碰撞检测函数

外星人与飞船的碰撞

if stats.ships_left > 0:
        stats.ships_left -= 1表示没发生一次碰撞ship_left-1,ship_left=0时游戏结束

响应被外星人碰撞
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
    if stats.ships_left > 0:
        stats.ships_left -= 1

        aliens.empty()
        bullets.empty()
        #创建新的外星人群
        create_fleet(ai_settings, screen, aliens, ship)
        #将飞船居中
        ship.center_ship()

        # 暂停
        sleep(0.5)
    else:
        stats.game_active = False
#检测外星人是否到达底部
def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):
    screen_rect = screen.get_rect()
    for alien in aliens.sprites():
        if alien.rect.bottom >= screen_rect.bottom:
            ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
            break

 aliens.empty()对编组进行清空,stats.game_active = False控制游戏状态为中止

 

外星人与子弹碰撞时,其中pygame.sprite.groupcollide函数返回一个字典,两个实参为True删除发生碰撞的两者。

def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
    #检测外星人与子弹的碰撞,并将发生碰撞的两者删除
    collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
    if len(aliens) == 0:
        #清空屏幕中的子弹
        bullets.empty()
        #重新创建外星人集群
        create_fleet(ai_settings, screen, aliens, ship)

 子弹到达屏幕顶部需进行删除( bullets.remove(bullet)),调用以下函数,其中最后一行代码调用上述函数检测外星人与子弹碰撞,函数update_bullets控制了子弹的行为。bullets.copy()是对bullets的复制,aliens.sprites()则指精灵组中一个个的精灵。

#删除到头子弹
def update_bullets(ai_settings, screen, ship, aliens, bullets):
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)

(4)子弹生成(限制最大数量) 

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

(5)将各个实体绘制于屏幕上

screen.fill(ai_settings.bg_color)设置背景颜色

 for bullet in bullets.sprites():
        bullet.draw_bullet()
   ship.blitme()
   aliens.draw(screen)分别调用ship、alien、bullet的绘制函数进行绘制

#将实体显示在屏幕上
def update_screen(ai_settings,screen,ship,bullets,aliens):
    screen.fill(ai_settings.bg_color)

    for bullet in bullets.sprites():
        bullet.draw_bullet()
    ship.blitme()
    aliens.draw(screen)

    pygame.display.flip()

4.是指参数模块settings.py

所有用到的参数值都再次文件中设置,实例化后即可调用

class Settings():
    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (233,230,230)
        self.ship_speed_factor = 1.5
        self.ship_limit = 3

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

        self.alien_speed_factor = 1
        self.fleet_drop_speed = 30
        #1为向右,-1为向左移动
        self.fleet_direction = 1

5.游戏状态控制模块

self.game_active = True,游戏正常运行(结合主函数可知)

class GameStats():
    def __init__(self, ai_settings):
        self.ai_settings = ai_settings
        self.reset_stats()
        self.game_active = True

    def reset_stats(self):
        self.ships_left = self.ai_settings.ship_limit

6.主函数模块

import sys

import  pygame
from ship import Ship
from settings import Settings
import game_functions as gf
from pygame.sprite import Group
from Alien import Alien
from game_stats import GameStats

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("Alian Invasion")

    stats = GameStats(ai_settings)

    ship = Ship(screen,ai_settings)
    bullets = Group()
    aliens = Group()

    gf.create_fleet(ai_settings, screen, aliens, ship)

    while True:
        #检测输入指令
        gf.check_events(ai_settings,ship,screen,bullets)
        if stats.game_active:
            #控制飞船行为
            ship.update()
            #控制子弹行为
            gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
            #控制外星人行为
            gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
        #控制各实体在屏幕的显示
        gf.update_screen(ai_settings,screen,ship,bullets,aliens)


run_game()

if stats.game_active:检测游戏状态是否可执行,gf.update_aliens中的

ship_hit函数中用于检测外星人与飞船的碰撞,若发生超过限制次数的碰撞会导致
stats.game_active = False进而游戏终止(stats = GameStats(ai_settings)初始化与全局配置文件建立联系)

 

pygame.init()、run_game()一前一后必不可少,使用循环不断调用以上几个主要函数实现方可实现游戏的运行。

 

你可能感兴趣的:(python)