飞机大战代码以及## 代码注释
飞机大战
介绍一下精灵和精灵组类
介绍一下相关的派生精灵子类
介绍一下飞机大战文件的相关事项
介绍一下PlaneGame类
介绍一下背景类
介绍一下敌机类
介绍英雄类如下
英雄边界类
碰撞检测方法如下
代码如图:
引入模块
#精灵子类
import pygame
import random #导入random模块
SCREEN_RECT = pygame.Rect(0,0,480,700) #屏幕大小的常量,前两个0表示初始位置,480,700表示屏幕的宽度和高度
FRAME_PER_SEC = 60 #刷新帧率的常量
CREATE_ENEMY_EVENT = pygame.USEREVENT #设置敌机的定时器常量
HERO_FIRE_EVENT = pygame.USEREVENT+1 #英雄发射子弹事件
class GameSprite(pygame.sprite.Sprite): #定义GameSprite继承自pygame.sprite.Sprite , 后者存储图像数据image和位置rect
"""飞机大战精灵"""
def __init__(self,image_name,speed=1):
super().__init__()#子类的父类不是object基类,因此需要调用初始化方法
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
self.rect.y += self.speed
class Background(GameSprite):
"""游戏背景精灵"""
def __init__(self,is_alt=False):
super().__init__("D:\python学习程序\pythonProject\Back.png") #加载图片
if is_alt:
self.rect.y = -self.rect.height
def update(self):
super().update() #调用父类的方法实现,也就是上面的update
if self.rect.y >= SCREEN_RECT.height:
self.rect.y = -self.rect.height
class Enemy(GameSprite):
"""敌机精灵"""
def __init__(self):
super().__init__("D:\python学习程序\pythonProject\enemy1.png")
self.speed = random.randint(1,3) #numpy库中的random.randint(a, b, n)表示随机生成n个大于等于a,小于b的整数
self.rect.bottom = 0 #底部导航
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0,max_x) #让飞机实现在屏幕的任意上方随机位置出现
def update(self):
super().update() #调用父类方法,保持垂直方向的飞行
if self.rect.y >= SCREEN_RECT.height: #判断是否飞出屏幕,如果是,需要从精灵组中删除敌机
self.kill() #将敌机从精灵组中删除
class Hero(GameSprite):
"""英雄精灵"""
def __init__(self):
super().__init__("D:\python学习程序\pythonProject\me1.png",0)
self.rect.centerx = SCREEN_RECT.centerx #英雄初始化位置 centerx是X轴的中心位置
self.rect.bottom = SCREEN_RECT.bottom - 120 #bottom 是底部,bottom=y+height
self.bullets = pygame.sprite.Group() #创建子弹精灵组
def update(self):
self.rect.x += self.speed
if self.rect.x < 0: #控制英雄不能离开屏幕左侧
self.rect.x = 0
elif self.rect.right > SCREEN_RECT.right: #控制英雄不能离开屏幕右侧
self.rect.right = SCREEN_RECT.right
def fire(self):
for i in (0,1,2):
bullet = Bullet() #创建子弹精灵
bullet.rect.bottom = self.rect.y - i * 20 #子弹的基础位置 一次性发射三枚子弹
bullet.rect.centerx = self.rect.centerx #子弹的基础位置
self.bullets.add(bullet) #将子弹精灵添加到子弹精灵组
class Bullet(GameSprite):
"""子弹精灵"""
def __init__(self):
super().__init__("D:\python学习程序\pythonProject\/bullet1.png",-2)
def update(self):
super().update()
if self.rect.bottom < 0: #判断子弹是否飞出屏幕
self.kill() #将子弹精灵从精灵组中删除
运行模块
from plane_sprites import *
class PlaneGame(object):
"""游戏大战主程序"""
pygame.init() #pygame初始化
def __init__(self):
print("游戏初始化")
self.screen = pygame.display.set_mode(SCREEN_RECT.size) #创建游戏窗口
self.clock = pygame.time.Clock() #创建游戏时钟
self.__create_sprites() #调用私有方法,精灵和精灵组的创建
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000) #添加定时器 前者是发生的事件,后者是间隔事件,单位为毫秒值
pygame.time.set_timer(HERO_FIRE_EVENT, 500)
def __create_sprites(self): #创建精灵和精灵组的工作 创建背景精灵和精灵组
bg1 = Background() #背景
bg2 = Background(True)
self.back_group = pygame.sprite.Group(bg1, bg2) #创建背景精灵组
self.enemy_group = pygame.sprite.Group() #创建敌机精灵组
self.hero = Hero() #创建英雄精灵
self.hero_group = pygame.sprite.Group(self.hero) #创建英雄精灵组
def start_game(self): #开始游戏循环
print("游戏开始")
while True: #指定循环体内的代码执行的频率
self.clock.tick(FRAME_PER_SEC) #设置刷新帧率
self.__event_handler() #事件监听
self.__check_collide() #碰撞检测
self.__update_sprites() #更新绘制精灵组
pygame.display.update() #更新显示
def __event_handler(self): #事件监听的方法
for event in pygame.event.get(): #监听,捕捉用户的操作
if event.type == pygame.QUIT: #如果按下退出键
PlaneGame.__game_over() #游戏结束
elif event.type == CREATE_ENEMY_EVENT: #如果事件为创建敌机
enemy = Enemy() #创建敌机精灵
self.enemy_group.add(enemy) #向敌机精灵组中加入敌机精灵
elif event.type == HERO_FIRE_EVENT: #如果事件为创建英雄的子弹
self.hero.fire() #开火!
keys_pressd = pygame.key.get_pressed() #监听,捕捉按健的操作
if keys_pressd[pygame.K_RIGHT]: #如果按下→键
self.hero.speed = 2
elif keys_pressd[pygame.K_LEFT]: #如果按下←键
self.hero.speed = -2
else:
self.hero.speed = 0
def __check_collide(self): #碰撞检测的方法
pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True) #子弹摧毁敌机
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True) #敌机摧毁英雄战机
if len(enemies) > 0:
self.hero.kill() #将英雄精灵从精灵组中删除
PlaneGame.__game_over()
def __update_sprites(self): #更新精灵组的方法
self.back_group.update() #刷新屏幕
self.back_group.draw(self.screen)
self.enemy_group.update() #让组中的所有精灵更新位置
self.enemy_group.draw(self.screen) #将精灵绘制到屏幕上
self.hero_group.update() #更新英雄精灵组
self.hero_group.draw(self.screen)
self.hero.bullets.update()
self.hero.bullets.draw(self.screen)
@staticmethod
def __game_over(): #游戏结束
print("游戏结束")
pygame.quit() #关闭所有模块, 游戏退出,此处关闭的只是以上的一个for循环而已
exit() #退出系统
if __name__ == '__main__':
game = PlaneGame() #创建游戏对象
game.start_game() #启动游戏