""""
飞机大战
"""
import pygame
import pygame.locals # 导入pygame本地策略# 窗体的状态返回值# 例如QUIT等
# from pygame.locals import *
import sys # 导入系统模块
import random
# 图片地址,不变
APP_ICON = "res/app.jpg" # 图标
IMG_BACKGROUND = "res/background.png" # 游戏背景
# IMG_ENMY = 'res/enemy1.png'
IMG_ENEMYS = ('res/enemy1.png', 'res/enemy2.png', 'res/enemy3_n1.png', 'res/enemy3_n2.png') # 敌机元组
IMG_PLAYER = 'res/me1.png' # 本机
IMG_BULLET = 'res/bullet2.png' # 子弹类
# 创建所有显示图形的父类Model
class Model:
window = None
def __init__(self, img_path, x, y):
self.img = pygame.image.load (img_path)
self.x = x
self.y = y
# 将模型window抽取到Model中
def display(self):
Model.window.blit ( self.img, (self.x, self.y) ) # 添加要显示再在窗体中的图片
# 背景类
class Background(Model):
def mov(self): # 背景移动
if self.y <= Game.WINDOW_HEIGHT:
self.y += 1 # TODO 纵坐标加一
else:
self.y = 0
def display(self):
Model.window.blit ( self.img, (self.x, self.y) ) # 添加要显示再在窗体中的图片
Model.window.blit ( self.img, (self.x, self.y-Game.WINDOW_HEIGHT) ) # 在图片的正上方再添加一个一样的图片,视觉效果上不断层
# 2.玩家类
class PlayerPlane(Model):
def __init__(self, img_path, x, y):
super().__init__(img_path, x, y) # 调用父类的构造函数
self.bullets = [] # 子弹列表
def display(self, enemys):
# TODO 显示敌机
super().display()
remove_bullets= []
for bullet in self.bullets:
bullet.move()
bullet.display() # 依次调用子弹的显示
if self.y < 0-11 :
remove_bullets.append(bullet) # 超出屏幕移进删除
else:
bullet_rect = pygame.locals.Rect( bullet.x, bullet.y, 5, 11 ) # TODO 画方框,粗略的碰撞检测
# TODO 使用子弹做外层循环,敌机做内层循环,以此来碰撞检测
for enemy in enemys:# 碰撞检测
enemy_rect = pygame.locals.Rect(enemy.x, enemy.y, 100, 200) # TODO 此处的框有问题,应该写个判断,根据敌机的不同来改变方框的大小
if pygame.Rect.colliderect(bullet_rect, enemy_rect): # 碰撞检测
enemy.img = pygame.image.load( IMG_ENEMYS[random.randint( 0, 3 )] ) # TODO 碰撞后就在敌机元组里随机
enemy.x = random.randint( 0, Game.WINDOW_WIDTH - 57 ) # 出现的位置
enemy.y = random.randint( -Game.WINDOW_HEIGHT, -43 )
remove_bullets.append(bullet) # TODO 如果子弹碰到敌机泽删除
break
for bullet in remove_bullets:
self.bullets.remove(bullet) # 依次释放子弹
# 3.敌机类
class EnemyPlane(Model):
def __init__(self):
self.img = pygame.image.load( IMG_ENEMYS[random.randint(0, 3)] ) # 随机出现敌机
self.x = random.randint( 0, Game.WINDOW_WIDTH - 57 )
self.y = random.randint( -Game.WINDOW_HEIGHT, -43 )
def move(self): # 敌机移动方法
if self.y <= Game.WINDOW_HEIGHT:
self.y += 4 # TODO 纵坐标加一
else:
# self.y = 0 - 43
self.img = pygame.image.load( IMG_ENEMYS[random.randint( 0, 3 )] )
self.x = random.randint( 0, Game.WINDOW_WIDTH - 57 ) # 每次返回都随机出现横纵变化
self.y = random.randint( -Game.WINDOW_HEIGHT, -43 )
# 4.子弹类
class Bullet(Model):
def move(self): # TODO 子弹移动方法
self.y -= 7 # 子弹速度
# 5.游戏类
class Game:
WINDOW_WIDTH = 480 # 窗体大小
WINDOW_HEIGHT = 700 # 不会改变,用此表示
# 1.主程序的入口
def run(self):
self.frame_init () # 4.执行初始化窗体
self.model_init () # 初始化背景
while True:
self.background.mov() # TODO 4.调用背景移动操作
self.background.display() # TODO 5.把移动后的图片加入窗体
"""
self.enmy.move()
self.enmy.display()
"""
for enemy in self.enemys:
enemy.move()
enemy.display()
self.player.display(self.enemys)
pygame.display.update () # 刷新窗体
self.event_init ()
# 3.初始化窗体
def frame_init(self):
# self.window = pygame.display.set_mode ((480, 640))
self.window = pygame.display.set_mode ((Game.WINDOW_WIDTH, Game.WINDOW_HEIGHT)) #
# self.window = pygame.display.set_mode ((536, 1162)) # 小周 扩大变量范围
Model.window = self.window
# 窗口大小
img = pygame.image.load (APP_ICON) # 1.加载图标文件作为图标对象
pygame.display.set_icon (img) # 2.设置窗体图标为图片
pygame.display.set_caption ("是我,你蝶打飞机") # 3.设置窗体的标题
def event_init(self): # 1.定义事件处理的方法
for event in pygame.event.get (): # 当前窗体的事件,返回的一个List[]
if event.type == pygame.locals.QUIT: # 检测是否
# if event.type == QUIT: # 检测是否,导包不同,调用不同
sys.exit()
if event.type == pygame.locals.MOUSEMOTION : # TODO 设置监听鼠标
pos = pygame.mouse.get_pos() # TODO 获取坐标(元组)
self.player.x = pos[0] - 51
self.player.y = pos[1] - 58
mouse_state = pygame.mouse.get_pressed() # 获得鼠标状态(元组)(左,中,右)
if mouse_state[0] == 1: # TODO 使用左键发射子弹
pos = pygame.mouse.get_pos()
self.player.bullets.append(Bullet(IMG_BULLET,pos[0]-1.9, pos[1] - 60))
def model_init(self):
self.background = Background (IMG_BACKGROUND, 0, 0) # TODO 使用大写来表示变量的抽取 # 元组
# self.background.display()
# self.enmy = EnemyPlane(IMG_ENMY, 200,200)
self.enemys = []
for _ in range(5):
self.enemys.append(EnemyPlane())
"""
self.enemys.append(EnemyPlane(IMG_ENMY, random.randint(0,Game.WINDOW_WIDTH-57), random.randint(-Game.WINDOW_HEIGHT,-43)))
"""
self.player = PlayerPlane(IMG_PLAYER, 200, 550)
# 2.设置测试类入口操作
if __name__ == "__main__": # 如果当前的程序等于__main__就运行
Game ().run ()
python基础之——飞机大战
最新推荐文章于 2022-07-03 08:13:03 发布