为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下:
实现步骤:
①下载64位对应 python 版本的 pygame : pygame-1.9.6-cp38-cp38-win_amd64.whl
② 更新 pip : python -m pip install --upgrade pip
③ 安装 pygame : pip install pygame-1.9.6-cp38-cp38-win_amd64.whl
④ 实现代码如下:
import sys ?# 导入系统模块 import random ?# 随机数模块 import pygame ?# 导入pygame模块 import pygame.locals ?# 导入pygame本地策略 ICO_PATH = "images/app.ico" ?# APP_ICO APP_NAME = "飞机大战V1.0" ?# APP_NAME Enemy_IMGS = ("images/enemy1.png", "images/enemy2.png") ?# ENEMY_IMGS # TODO 定义一个公共类 class Model: ? ? window = None ?# 主窗体window对象 ? ? # 初始化函数 ? ? def __init__(self, img_path, x, y): ? ? ? ? self.img = pygame.image.load(img_path) ? ? ? ? self.x = x ? ? ? ? self.y = y ? ? # 将图片填充到背景中 ? ? def display(self): ? ? ? ? Model.window.blit(self.img, (self.x, self.y)) # TODO 背景 class Background(Model): ? ? # 背景移动 ? ? def move(self): ? ? ? ? if self.y <= Game.WINDOW_HEIGHT: ? ? ? ? ? ? self.y += 1 ? ? ? ? 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)) ?# 填充辅助背景 # TODO 玩家类 class PlayerPlane(Model): ? ? def __init__(self, img_path, x, y): ? ? ? ? super().__init__(img_path, x, y) ? ? ? ? # 子弹 ? ? ? ? self.bullets = [] ? ? def display(self, enemys): ? ? ? ? super().display() ? ? ? ? remove_bullets = [] ? ? ? ? for bullet in self.bullets: ? ? ? ? ? ? bullet.move() ? ? ? ? ? ? bullet.display() ? ? ? ? ? ? # 如果子弹小于消失于屏幕,删除子弹 ? ? ? ? ? ? if bullet.y < -11: ? ? ? ? ? ? ? ? remove_bullets.append(bullet) ? ? ? ? ? ? # 子弹的矩阵 ? ? ? ? ? ? bullet_rect = pygame.locals.Rect(bullet.x, bullet.y, 5, 11) ? ? ? ? ? ? # TODO 进行碰撞检测 ? ? ? ? ? ? for enemy in enemys: ? ? ? ? ? ? ? ? # 敌机的矩阵 ? ? ? ? ? ? ? ? enemy_rect = pygame.locals.Rect(enemy.x, enemy.y, 57, 43) ? ? ? ? ? ? ? ? # 如果碰撞 ? ? ? ? ? ? ? ? if pygame.Rect.colliderect(bullet_rect, enemy_rect): ? ? ? ? ? ? ? ? ? ? # 随机修改敌机的位置模拟敌机销毁并生成新敌机并删除子弹 ? ? ? ? ? ? ? ? ? ? enemy.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)]) ? ? ? ? ? ? ? ? ? ? enemy.x = random.randint(0, Game.WINDOW_WIDTH - 57) ? ? ? ? ? ? ? ? ? ? enemy.y = random.randint(-Game.WINDOW_WIDTH, -43) ? ? ? ? ? ? ? ? ? ? remove_bullets.append(bullet) ? ? ? ? ? ? ? ? ? ? break ? ? ? ? for bullet in remove_bullets: ? ? ? ? ? ? self.bullets.remove(bullet) # TODO 敌机类 class EnemyPlane(Model): ? ? def __init__(self): ? ? ? ? self.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)]) ? ? ? ? self.x = random.randint(0, Game.WINDOW_WIDTH - 57) ? ? ? ? self.y = random.randint(-Game.WINDOW_WIDTH, -43) ? ? def move(self): ? ? ? ? if self.y > Game.WINDOW_HEIGHT: ? ? ? ? ? ? self.y = -43 ?# 返回初始位置 ? ? ? ? else: ? ? ? ? ? ? self.y += 1 # TODO 子弹类 class Bullet(Model): ? ? def move(self): ? ? ? ? self.y -= 1 # TODO 游戏类 class Game: ? ? WINDOW_WIDTH = 410 ? ? WINDOW_HEIGHT = 614 ? ? # 初始化操作 ? ? def __init__(self): ? ? ? ? self.window = pygame.display.set_mode([Game.WINDOW_WIDTH, Game.WINDOW_HEIGHT]) ?# 窗口的设置 ? ? ? ? self.background = Background("images/background.png", 0, 0) ?# 窗体模型的设置 ? ? ? ? self.player = PlayerPlane("images/me1.png", 180, 400) ? ? ? ? self.enemyPlanes = [] ? ? ? ? for _ in range(5): ? ? ? ? ? ? self.enemyPlanes.append(EnemyPlane()) ? ? # 游戏的入口函数 ? ? def run(self): ? ? ? ? self.frame_init() ? ? ? ? while True: ? ? ? ? ? ? self.background.move() ?# 背景向上移动,模拟环境移动 ? ? ? ? ? ? self.background.display() ?# 将图片塞入到窗体中 ? ? ? ? ? ? self.player.display(self.enemyPlanes) ? ? ? ? ? ? for enemy in self.enemyPlanes: ? ? ? ? ? ? ? ? enemy.move() ? ? ? ? ? ? ? ? enemy.display() ? ? ? ? ? ? pygame.display.update() ?# 刷新窗体 ? ? ? ? ? ? self.event_init() ?# 监听事件 ? ? # 初始化窗口 ? ? def frame_init(self): ? ? ? ? Model.window = self.window ?# 将window对象赋值给Model公有类 ? ? ? ? ico = pygame.image.load(ICO_PATH) ?# 加载图片 ? ? ? ? pygame.display.set_icon(ico) ?# 设置icon ? ? ? ? pygame.display.set_caption(APP_NAME) ?# 设置app_name ? ? # 事件初始化方法 ? ? def event_init(self): ? ? ? ? for event in pygame.event.get(): ? ? ? ? ? ? # 关闭事件 ? ? ? ? ? ? if event.type == pygame.locals.QUIT: ? ? ? ? ? ? ? ? sys.exit() ? ? ? ? ? ? # 监听鼠标事件 ? ? ? ? ? ? if event.type == pygame.locals.MOUSEMOTION: ? ? ? ? ? ? ? ? pos = pygame.mouse.get_pos() ? ? ? ? ? ? ? ? self.player.x = pos[0] - 51 ? ? ? ? ? ? ? ? self.player.y = pos[1] - 63 ? ? ? ? focus_state = pygame.mouse.get_pressed() ? ? ? ? if focus_state[0] == 1: ? ? ? ? ? ? pos = pygame.mouse.get_pos() ? ? ? ? ? ? self.player.bullets.append(Bullet("images/bullet1.png", pos[0], pos[1] - 75)) if __name__ == "__main__": ? ? Game().run()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查看更多关于python实现简单飞机大战小游戏的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did17616