美文网首页
python 基础 飞机大战

python 基础 飞机大战

作者: df45018ce377 | 来源:发表于2019-08-15 19:06 被阅读0次

    飞机大战 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

    相关文章

      网友评论

          本文标题:python 基础 飞机大战

          本文链接:https://www.haomeiwen.com/subject/htjtsctx.html