前不久因为疫情的原因在家几个月,闲着无聊便开始学习python编程入门了python这门语言,在学习到面向对象的时候,最后的案例是开发一个飞机大战的项目游戏

因此试着开发了一下还不错,故献上源代码和所需要的图片素材,想要试试开发的朋友可以直接下载到IDE上运行即可。

配置要求

  1. 安装 python的游戏包 pygame 包
  2. python版本为3.0以上(安装介绍:https://www.cnblogs.com/wqb123/articles/12433427.html

文件要求

  1. 先新建一个文件夹命名:py_飞机大战
  2. 命名2个文件:plane_main.py(主控程序文件) 和plane_sprites.py(辅助工具文件)

代码如下:

(plane_main.py文件)

  1 import pygame
  2 from plane_sprites import *
  3 
  4 
  5 class PlaneGame(object):
  6     """飞机大战主游戏"""
  7 
  8     def __init__(self):
  9         print("游戏初始化..")
 10 
 11         # 1.创建游戏窗口
 12         self.screen = pygame.display.set_mode(SCREEN_RECT.size)
 13         # 2.创建游戏的时钟
 14         self.clock = pygame.time.Clock()
 15         # 3.调用私有方法,精灵和精灵组的创建
 16         self.__create_sprites()
 17         # 4.设置定时器--创建敌机出现 1s
 18         pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
 19 
 20     def __create_sprites(self):
 21         """创建精灵和精灵组"""
 22         # 1.创建背景精灵和精灵组
 23         bg1 = Background()
 24         bg2 = Background(True)
 25         bg2.rect.y = -bg2.rect.height
 26         self.back_group = pygame.sprite.Group(bg1, bg2)
 27         # 2.创建敌机精灵组
 28         self.enemy_group = pygame.sprite.Group()
 29         # 3.创建英雄精灵组
 30         self.hero = Hero()
 31         self.hero_group = pygame.sprite.Group(self.hero)
 32 
 33     def start_game(self):
 34         print("游戏开始...")
 35         while True:
 36             # 1.设置刷新帧率
 37             self.clock.tick(FRAME_PER_SEC)
 38             # 2.事件监听
 39             self.__event_handle()
 40             # 3.碰撞检测
 41             self.__check_collide()
 42             # 4.更新精灵组
 43             self.__update_sprites()
 44             # 5.更新屏幕显示
 45             pygame.display.update()
 46 
 47     def __event_handle(self):
 48         """事件监听"""
 49 
 50         for event in pygame.event.get():
 51             # 监听游戏是否退出
 52             if event.type == pygame.QUIT:
 53                 PlaneGame.__game_over()
 54             # 监听敌机的出现
 55             elif event.type == CREATE_ENEMY_EVENT:
 56                 print("敌机出场...")
 57                 # 创建敌机精灵
 58                 enemy = Enemy()
 59                 self.enemy_group.add(Enemy())
 60             # 让英雄发射子弹
 61             elif event.type == Hero_FIRE_EVENT:
 62                 self.hero.fire()
 63         # 获取用户按键
 64         keys_pressed = pygame.key.get_pressed()
 65         if keys_pressed[pygame.K_RIGHT]:
 66             self.hero.speed = 2
 67         elif keys_pressed[pygame.K_LEFT]:
 68             self.hero.speed = -2
 69         else:
 70             self.hero.speed = 0
 71 
 72     def __check_collide(self):
 73         """碰撞检测"""
 74         # 1.设置子弹摧毁敌机
 75         pygame.sprite.groupcollide(self.hero.bullets,
 76                                    self.enemy_group, True, True)
 77         # 2.敌机摧毁英雄
 78         enemies = pygame.sprite.spritecollide(self.hero,
 79                                               self.enemy_group, True)
 80         # 2.1判断列表是否有内容
 81         if len(enemies) > 0:
 82             # 让英雄牺牲
 83             self.hero.kill()
 84             # 结束游戏
 85             PlaneGame.__game_over()
 86 
 87     def __update_sprites(self):
 88         """更新精灵组"""
 89         # 1.背景更新渲染显示
 90         self.back_group.update()
 91         self.back_group.draw(self.screen)
 92         # 2.敌机渲染更新显示
 93         self.enemy_group.update()
 94         self.enemy_group.draw(self.screen)
 95         # 3.英雄渲染更新显示
 96         self.hero_group.update()
 97         self.hero_group.draw(self.screen)
 98         # 4.子弹渲染更新显示
 99         self.hero.bullets.update()
100         self.hero.bullets.draw(self.screen)
101 
102     @staticmethod
103     def __game_over():
104         """游戏结束"""
105         print("游戏结束")
106         pygame.quit()
107         exit()
108 
109 if __name__ == \'__main__\':
110         # 创建游戏对象
111         game = PlaneGame()
112         # 开始游戏
113         game.start_game()

(plane_sprites.py文件)

import random
import pygame
# 游戏屏幕的尺寸
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 游戏的刷新帧率
FRAME_PER_SEC = 60
# 敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 英雄发射子弹事件
Hero_FIRE_EVENT = pygame.USEREVENT + 1


class GameSprite(pygame.sprite.Sprite):
    """游戏精灵基类"""
    def __init__(self, image_name, speed=1):
        # 调用父类的初始方法
        super().__init__()
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        # 记录速度
        self.speed = speed

    def update(self, *args):
        # 默认在垂直方向移动
        self.rect.y += self.speed


class Background(GameSprite):
    """游戏背景精灵"""

    def __init__(self, is_alt=False):

        # 1.调用父类方法实现精灵的创建(image/rect/speed)
        image_name = "./images/background.png"
        super().__init__(image_name)
        # 2.判断是否交替图片,如果是,将图片设置到屏幕顶部
        if is_alt:
            self.rect.y = -self.rect.height

    def update(self, *args):

        # 1.调用父类方法实现
        super().update()
        # 2.判断是否移出屏幕,如移出,将图像设置到屏幕上方
        if self.rect.y >= SCREEN_RECT.height:
            self.rect.y = -self.rect.height


class Enemy(GameSprite):
    """敌机精灵"""
    def __init__(self):
        # 1.调用父类方法创建敌机精灵,并指定敌机图像
        super().__init__("./images/enemy1.png")
        # 2.设置敌机的随机速度(初始) 1~3
        self.speed = random.randint(1, 3)
        # 3.设置敌机的随机位置(初始)水平方向
        self.rect.bottom = 0
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self, *args):
        # 1.调用父类让敌机在垂直方向移动
        super().update()
        # 2.判断是否飞出屏幕,如果是,需将敌机删除
        if self.rect.y >= SCREEN_RECT.height:
            print("敌机飞出屏幕...")
        # 3.将精灵从所有组中删除
            self.kill()

    def __del__(self):
        print("敌机挂了 %s" % self.rect)


class Hero(GameSprite):
    """英雄精灵"""
    def __init__(self):
        super().__init__("./images/me1.png", 0)
        # 设置初始位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120
        # 每隔 0.5s 发射一次子弹
        pygame.time.set_timer(Hero_FIRE_EVENT, 500)
        # 1.创建子弹的精灵组
        self.bullets = pygame.sprite.Group()

    def update(self, *args):
        # 英雄飞机在水平方向运动
        self.rect.x += self.speed
        # 判断屏幕边界
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right

    def fire(self):
        print("发射子弹...")
        # 实现一次发射三枚子弹
        for i in (1, 2, 3):
            # 1.创建子弹精灵
            bullet = Bullet()
            # 2.设置子弹精灵位置
            bullet.rect.bottom = self.rect.y - i * 20
            bullet.rect.centerx = self.rect.centerx
            # 3.将子弹精灵添加到精灵组
            self.bullets.add(bullet)


class Bullet(GameSprite):
    """子弹精灵"""
    def __init__(self):
        super().__init__("./images/bullet1.png", -2)

    def update(self, *args):
        super().update()
        # 判断是否飞出屏幕,飞出删除
        if self.rect.bottom < 0:
            self.kill()

涉及的素材图

1.背景

2.敌机

3.主飞机

4.子弹

 

运行图

 

 

 

可以试着运行玩一下效果,感受一下用python完成一次面向对象的小案例把~

 

版权声明:本文为wqb123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wqb123/articles/12871490.html