当前位置:   article > 正文

Python飞机大战(完整版)_飞机大战编程python完整代码

飞机大战编程python完整代码

简介:一共分为2个py文件,分别是主类、和精灵类

飞机大战图片地址:链接: https://pan.baidu.com/s/18T6n9JFIDxBqYX9CnHi7ZQ  密码: tqbr

注释:项目启动后如果报libpng warning: iCCP: known incorrect sRGB profile无须处理,不会影响项目和代码,视觉洁癖可以直接百度搜索这个错误提示,网上有解决办法

ps:因为图片是png格式,而libpng-1.6以上版本增强了ICC profiles检查,所以才会警告

plane_main.py(启动主类) 

  1. import pygame
  2. import plane_sprites
  3. class PlanGame(object):
  4. """飞机大战-主体类"""
  5. def __init__(self):
  6. """
  7. 初始化
  8. """
  9. pygame.init()
  10. # 创建窗口
  11. self.screen = pygame.display.set_mode(plane_sprites.SCREEN_RECT.size)
  12. # 创建游戏时钟对象
  13. self.clock = pygame.time.Clock()
  14. # 创建精灵组
  15. self.__create_sprites()
  16. # 定时器 - 创建敌机 1s (USEREVENT是一个常量,可以通过+1来改变此常量)
  17. pygame.time.set_timer(pygame.USEREVENT, 1000)
  18. # 定时器 - 主机子弹 0.5s
  19. pygame.time.set_timer(pygame.USEREVENT + 1, 500)
  20. def start_game(self):
  21. """
  22. 启动游戏
  23. :return:
  24. """
  25. while True:
  26. # 执行循环中游戏时钟的频率
  27. self.clock.tick(plane_sprites.FRAME_PER_SEC)
  28. # 事件监听
  29. self.__event__handler()
  30. # 碰撞检测
  31. self.__check_collide()
  32. # 更新/绘制精灵族
  33. self.__update_sprites()
  34. # 更新显示
  35. pygame.display.update()
  36. def __create_sprites(self):
  37. """
  38. 创建/绘制精灵族
  39. :return:
  40. """
  41. # 创建背景精灵和精灵组
  42. bg_one = plane_sprites.BackGround(False)
  43. bg_two = plane_sprites.BackGround(True)
  44. self.back_group = pygame.sprite.Group(bg_one, bg_two)
  45. # 创建敌机精灵组
  46. self.enemy_group = pygame.sprite.Group()
  47. # 创建主机精灵组
  48. self.me = plane_sprites.Me()
  49. self.me_group = pygame.sprite.Group(self.me)
  50. # 创建敌机子弹摧毁精灵组
  51. self.destroy_group = pygame.sprite.Group()
  52. def __event__handler(self):
  53. """
  54. 事件监听
  55. :return:
  56. """
  57. for e in pygame.event.get():
  58. # 点击关闭游戏窗口
  59. if e.type == pygame.QUIT:
  60. # 退出pygame
  61. pygame.quit()
  62. # 终止程序
  63. exit()
  64. elif e.type == pygame.USEREVENT:
  65. # 添加敌机精灵到精灵组中
  66. self.enemy = plane_sprites.Enemy()
  67. self.enemy_group.add(self.enemy)
  68. elif e.type == pygame.USEREVENT + 1:
  69. self.me.me_bullet()
  70. # 获取所有按键的元组
  71. keys_pressed = pygame.key.get_pressed()
  72. # 主机左右移动
  73. if keys_pressed[pygame.K_RIGHT]:
  74. self.me_group.update(True, False)
  75. elif keys_pressed[pygame.K_LEFT]:
  76. self.me_group.update(True, True)
  77. def __check_collide(self):
  78. """
  79. 碰撞检测
  80. :return:
  81. """
  82. # 主机被毁
  83. if self.me.state == 4:
  84. # 游戏结束
  85. self.__game_over()
  86. # 检测子弹与敌机碰撞(敌机先不销毁,注意!顺序必须是敌机在前,否则下面for循环拿不到explode_index)
  87. d_group = pygame.sprite.groupcollide(self.enemy_group, self.me.bullet_group, False, True)
  88. # 将碰撞敌机精灵添加到敌机子弹摧毁精灵组
  89. self.destroy_group.add(d_group)
  90. for enemy in self.destroy_group:
  91. # 爆炸状态为0 代表未摧毁,此处改为1待摧毁
  92. if enemy.enemy_explode_index == 0:
  93. enemy.enemy_explode_index = 1
  94. # 摧毁完毕后删除精灵
  95. elif enemy.enemy_explode_index == 5:
  96. self.destroy_group.remove_internal(enemy)
  97. self.enemy_group.remove_internal(enemy)
  98. # 检测主机与敌机碰撞
  99. d_me = pygame.sprite.spritecollide(self.me, self.enemy_group, True)
  100. if len(d_me) > 0:
  101. # 主机爆炸
  102. self.me.state = 3
  103. def __update_sprites(self):
  104. """
  105. 更新/绘制精灵组
  106. :return:
  107. """
  108. # 背景精灵组更新
  109. self.back_group.update()
  110. self.back_group.draw(self.screen)
  111. # 敌机精灵组更新
  112. self.enemy_group.update()
  113. self.enemy_group.draw(self.screen)
  114. # 主机精灵组更新
  115. self.me_group.update()
  116. self.me_group.draw(self.screen)
  117. # 子弹精灵组更新
  118. self.me.bullet_group.update()
  119. self.me.bullet_group.draw(self.screen)
  120. @staticmethod
  121. def __game_over():
  122. """
  123. 游戏结束
  124. :return:
  125. """
  126. pygame.quit()
  127. exit()
  128. if __name__ == '__main__':
  129. # 创建游戏对象
  130. game = PlanGame()
  131. # 启动游戏
  132. game.start_game()

plane_sprites.py(精灵类) 

  1. import random
  2. import pygame.sprite
  3. # 窗口大小 480像素 * 700像素
  4. SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
  5. # 刷新的帧频
  6. FRAME_PER_SEC = 60
  7. class GameSprite(pygame.sprite.Sprite):
  8. """飞机大战-精灵类"""
  9. def __init__(self, image_url, speed=1):
  10. """
  11. 初始化
  12. :param image_url: 图片路径
  13. :param speed: 移动频率(默认1)
  14. """
  15. # 使用super调用父类初始化(继续类不是Object,则需要调用)
  16. super().__init__()
  17. # 绘制图片
  18. self.image = pygame.image.load(image_url)
  19. # 获取坐标、宽高
  20. self.rect = self.image.get_rect()
  21. # 移动频率
  22. self.speed = speed
  23. def update(self):
  24. """
  25. 更新精灵位置
  26. """
  27. self.rect.y += self.speed
  28. class BackGround(GameSprite):
  29. """飞机大战-背景类"""
  30. def __init__(self, is_alt):
  31. """
  32. 背景图片初始化
  33. """
  34. super().__init__("./images/background.png")
  35. # 定义图片y值
  36. if is_alt:
  37. self.rect.y = self.rect.height
  38. def update(self):
  39. """
  40. 更新图片位置
  41. """
  42. super().update()
  43. # 背景图片大于屏幕高度则赋值当前窗口高度的负数值
  44. if self.rect.y >= SCREEN_RECT.height:
  45. self.rect.y = -self.rect.height
  46. class Enemy(GameSprite):
  47. """飞机大战-敌机类"""
  48. def __init__(self):
  49. """
  50. 敌机初始化
  51. """
  52. super().__init__("./images/enemy1.png")
  53. # 指定敌机的随机速度
  54. self.speed = random.randint(1, 3)
  55. # 指定敌机的随机位置(窗口宽度-敌机宽度)
  56. self.rect.bottom = 0
  57. self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)
  58. # 敌机爆炸状态 0:未摧毁 1:待摧毁 1-4:摧毁中 5:已摧毁
  59. self.enemy_explode_index = 0
  60. def update(self):
  61. """
  62. 更新敌机位置
  63. """
  64. super().update()
  65. # 敌机大于当前窗口高度时从精灵组里删除敌机
  66. if self.rect.y > SCREEN_RECT.height:
  67. self.kill()
  68. # 已销毁敌机
  69. if self.enemy_explode_index == 5:
  70. return
  71. # 敌机爆炸
  72. if self.enemy_explode_index != 0:
  73. new_rect = self.rect
  74. super().__init__("./images/enemy1_down%d.png" % self.enemy_explode_index)
  75. self.enemy_explode_index += 1
  76. self.rect = new_rect
  77. class Me(GameSprite):
  78. """飞机大战-主机类"""
  79. def __init__(self):
  80. """
  81. 主机初始化
  82. """
  83. super().__init__("./images/me1.png", 0)
  84. # 指定主机的x轴中心位置
  85. self.rect.centerx = SCREEN_RECT.centerx
  86. # 指定主机的位置y轴位置(窗口宽度-敌机宽度-50)
  87. self.rect.y = SCREEN_RECT.height - self.rect.height - 50
  88. # 创建子弹精灵组
  89. self.bullet_group = pygame.sprite.Group()
  90. # 主机爆炸状态 1:喷气 2:不喷气 3:摧毁 4:已摧毁
  91. self.state = 1
  92. # 主机爆炸进度 1-4
  93. self.progress = 1
  94. def update(self, is_move=False, is_left=False):
  95. """
  96. 更新主机位置
  97. :param is_move: 是否移动
  98. :param is_left: 是否左移动
  99. :return:
  100. """
  101. # 获取上个精灵的位置
  102. new_rect = self.rect
  103. # 喷气和不喷气相互切换
  104. if self.state == 1:
  105. super().__init__("./images/me2.png")
  106. self.state = 2
  107. elif self.state == 2:
  108. super().__init__("./images/me1.png")
  109. self.state = 1
  110. # 主机被摧毁
  111. else:
  112. super().__init__("./images/me_destroy_%d.png" % self.progress)
  113. self.rect = new_rect
  114. # 主机已被摧毁
  115. if self.progress != 4:
  116. self.progress += 1
  117. else:
  118. self.state = 4
  119. return
  120. # 将上个精灵的位置赋值到新的精灵上
  121. self.rect = new_rect
  122. if not is_move:
  123. return
  124. # 左右移动
  125. if is_left and self.rect.x > 0:
  126. self.rect.x -= 2
  127. elif not is_left and self.rect.right < SCREEN_RECT.width:
  128. self.rect.x += 2
  129. def me_bullet(self):
  130. """
  131. 主机添加子弹
  132. :return:
  133. """
  134. for i in range(0, 3):
  135. # 添加子弹精灵到精灵组中
  136. bullet = Bullet()
  137. # 子弹x+y轴位置
  138. bullet.rect.y = self.rect.y - i * 20
  139. bullet.rect.x = self.rect.centerx
  140. # 将子弹精灵添加到精灵组中
  141. self.bullet_group.add(bullet)
  142. class Bullet(GameSprite):
  143. """飞机大战-子弹类"""
  144. def __init__(self):
  145. """
  146. 子弹初始化
  147. """
  148. super().__init__("./images/bullet2.png", -2)
  149. def update(self):
  150. """
  151. 发射子弹
  152. :return:
  153. """
  154. super().update()
  155. # 子弹y轴高度小于等于0时从精灵组里删除
  156. if self.rect.y <= 0:
  157. self.kill()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/105397?site
推荐阅读
相关标签
  

闽ICP备14008679号