python 基础 飞机大战

飞机大战 Python

1. 代码的整体框架

飞机大战主要涉及飞机、子弹、敌机和他们之间的逻辑判断等问题。

本此实验变成主要借助pygame库的框架进行游戏的搭建,主要包括类的定义和游戏循环判断。

本游戏主要涉及飞机、子弹、敌机三类对象,需要创建相关类和对于的方法。

编程中共设计了Bullet、Player和Enemy三个类,并完成其移动等方法。

2. 使用到的类及函数

2.1 Bullet类

Bullet类主要完成飞机设计的任务,程序中不单独进行实例化,在Player类中的shoot函数中进行实例化。

class Bullet(pygame.sprite.Sprite):
    def __init__(self, bullet_img, init_pos):

        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.rect = self.image.get_rect()
        self.rect.midbottom = init_pos
        self.speed = 10

    def move(self):
        self.rect.top -= self.speed
  • 初始化参数
    • bullet_img: 子弹的图片
    • init_pos: 子弹的位置状态
  • move函数:按照设定的速度speed向上移动。

2.2 Player类

class Player(pygame.sprite.Sprite):
    def __init__(self, plane_img, player_rect, init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = []
        for i in range(len(player_rect)):
            self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())
        self.rect = player_rect[0]
        self.rect.topleft = init_pos
        self.bullets = pygame.sprite.Group()
        self.image_index = 0
        self.speed = 6
        self.is_hit = False

    def shoot(self, bullet_img):
        bullet = Bullet(bullet_img, self.rect.midbottom)
        self.bullets.add(bullet)

    def moveUp(self):
        if self.rect.top <= 0:
            self.rect.top = 0
        else:
            self.rect.top -= self.speed

    def moveDown(self):
        if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
            self.rect.top = SCREEN_HEIGHT - self.rect.height
        else:
            self.rect.top += self.speed

    def moveLeft(self):
        if self.rect.left <= 0:
            self.rect.left = 0
        else:
            self.rect.left -= self.speed

    def moveRight(self):
        if self.rect.left >= SCREEN_WIDTH - self.rect.width:
            self.rect.left = SCREEN_WIDTH - self.rect.width
        else:
            self.rect.left += self.speed
  • 初始化参数:
    • plane_img: 图片,包含多张形成动画效果;
    • player_rect:飞机的图片在图片中位置
    • init_pos:飞机初始的位置状态
  • 移动函数:按照设定的速度speed移动,但是飞机图片不得出画面。
    • moveUp:向上移动
    • moveDown:向下移动
    • moveLeft:向左移动
    • moveRight:向右移动

2.3 Enemy类

class Enemy(pygame.sprite.Sprite):
    def __init__(self, enemy_img, enemy_down_imgs, init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = enemy_img
        self.rect = self.image.get_rect()
        self.rect.topleft = init_pos
        self.down_imgs = enemy_down_imgs
        self.speed = 2
        self.down_index = 0

    def move(self):
        self.rect.top += self.speed
  • 初始化参数
    • enemy_img: 敌机的图片
    • enemy_down_imgs:敌机坠毁的图片
    • init_pos:敌机的位置状态
  • move函数:按照设定的速度speed向下移动。

2.4 startGame函数

游戏中完成类的设计后,需要完成对象的创建,飞机大战的逻辑主要包括以下部分:

  • 完成player、bullet和enemy实例化对象的创建;
  • 游戏开始时,玩家出现在游戏最下方的中间;
  • 飞机以一定的频率进行射击,发射子弹,向上移动;
  • 敌机以一定的频率随机从最上方,随机位置出现,向下移动
  • 子弹与敌机碰撞,敌机被移除,并得分;
  • 敌机与玩家相撞,玩家死亡
  • 玩家失败,游戏结束;
  • 显示得分和结束页面,并显示重新开始按钮。

3. 整理代码实现过程中遇到的问题

本游戏虽然能流程运行,但是游戏运行中后出现报错的情况。主要错误如下:

libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: cHRM chunk does not match sRGB

查询资料可知,该错误为警告,不影响程序的正确运行,可以使用以下代码进行忽略:

import warnings
warnings.filterwarnings('ignore')

4. 实验截图

4.1 飞机大杂运行截图

  • 左上角为得分
  • 键盘w s a d或上下左右控制飞机的移动
running.png

4.2 游戏结束截图

结束页面的内容以此为:

  • 显示得分;
  • 重新开始按钮,点击重新开始游戏
Gameover.png

主要参考资料:https://www.bilibili.com/video/av41149491

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容