当前位置:   article > 正文

使用Python制作的小游戏---飞机大战_飞机大战python代码

飞机大战python代码

一. 使用的模块

1.pygame模块

二. 目的

1. 熟悉Python面向对象编程的方法和套路

三.程序源码分享--带注释

1.敌机模块

  1. import pygame, random
  2. # 定义一个常量(赋值后不能修改)常量一般使用大写字母
  3. WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
  4. # python中 崇尚的是一切靠自觉
  5. # 自定义敌机类
  6. class EnemyPlane(object):
  7. def __init__(self):
  8. #转换为字符串给字符串拼接的时候用
  9. self.num = str(random.randint(1, 7))
  10. # 加载素材库中的图片
  11. self.img = pygame.image.load("res/img-plane_" + self.num + ".png")
  12. # 获取敌机的图片矩形
  13. self.img_rect = self.img.get_rect()
  14. self.reset()
  15. # 设置敌机的位置和速度
  16. def reset(self):
  17. # 设置敌机的位置和速度,元组费别为宽和高
  18. self.img_rect[0] = random.randint(0, WINDOW_WIDTH - self.img_rect[2])
  19. self.img_rect[1] = -self.img_rect[3]
  20. # 速度
  21. self.speed = random.randint(1, 4)
  22. # 向下移动
  23. def move_down(self):
  24. #移动飞机
  25. self.img_rect.move_ip(0, self.speed)
  26. # 判断如果在屏幕消失后 位置重置
  27. if self.img_rect[1] >= WINDOW_HEIGHT:
  28. self.reset()

2. 地图模块

  1. import pygame, random
  2. # 定义一个常量(赋值后不能修改)常量一般使用大写字母
  3. WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
  4. # python中 崇尚的是一切靠自觉
  5. # 自定义一个地图类
  6. class GameMap(object):
  7. def __init__(self):
  8. self.num = str(random.randint(1, 5))
  9. # 图片
  10. self.img_1 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
  11. self.img_2 = pygame.image.load("res/img_bg_level_" + self.num + ".jpg")
  12. # 设置和记录图片的y轴
  13. self.img1_y = -WINDOW_HEIGHT
  14. self.img2_y = 0
  15. # 速度
  16. self.speed = 2
  17. # 向下移动
  18. def move_down(self):
  19. # 地图的y轴重置
  20. if self.img1_y >= 0:
  21. self.img1_y = -WINDOW_HEIGHT
  22. self.img2_y = 0
  23. self.img1_y += self.speed
  24. self.img2_y += self.speed

3. 得分模块

  1. import pygame, random
  2. # 自定义文字管理类
  3. class GameScore(object):
  4. # 记录分数
  5. __cls_score = 0
  6. def __init__(self, font_size):
  7. # 设置字体和大小
  8. self.font = pygame.font.SysFont("SimHei", font_size)
  9. # render(text(文本内容), antialias(抗锯齿), color(RGB)),返回文字对象
  10. self.text_obj = self.font.render("分数:0", 1, (255, 255, 255))
  11. # 设置显示的文字和字体颜色
  12. def set_text_obj(self):
  13. # 加5分
  14. GameScore.__cls_score += 5
  15. # 随机颜色值
  16. r = random.randint(0, 255)
  17. g = random.randint(0, 255)
  18. b = random.randint(0, 255)
  19. # 重新赋值
  20. self.text_obj = self.font.render("分数:%d" % GameScore.__cls_score, 1, (r, g, b))

4 .英雄飞机模块

  1. import pygame, plane_bullet
  2. # 定义一个常量(赋值后不能修改)常量一般使用大写字母
  3. WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
  4. # python中 崇尚的是一切靠自觉
  5. # 自定义一个英雄飞机类
  6. class HeroPlane(object):
  7. def __init__(self):
  8. # 赋值
  9. self.img = pygame.image.load("res/hero2.png")
  10. # 获取图片矩形
  11. self.img_rect = self.img.get_rect()
  12. # 设置飞机的初始位置
  13. self.img_rect.move_ip((WINDOW_WIDTH - self.img_rect[2])/2, WINDOW_HEIGHT - self.img_rect[3] - 50)
  14. # 飞机速度
  15. self.speed = 2
  16. # 子弹弹夹
  17. self.bullet_list = [plane_bullet.PlaneBullet() for i in range(6)]
  18. # 向上
  19. def move_up(self):
  20. # 边缘检测
  21. if self.img_rect[1] >= 0:
  22. self.img_rect.move_ip(0, -self.speed)
  23. # 向下
  24. def move_down(self):
  25. # 边缘检测
  26. if self.img_rect[1] <= WINDOW_HEIGHT - self.img_rect[3]:
  27. self.img_rect.move_ip(0, self.speed)
  28. # 向左
  29. def move_left(self):
  30. # 边缘检测
  31. if self.img_rect[0] >= 0:
  32. self.img_rect.move_ip(-self.speed, 0)
  33. # 向右
  34. def move_right(self):
  35. # 边缘检测
  36. if self.img_rect[0] <= WINDOW_WIDTH - self.img_rect[2]:
  37. self.img_rect.move_ip(self.speed, 0)
  38. # 发射子弹
  39. def shot(self):
  40. # 遍历所有的子弹
  41. for bullet in self.bullet_list:
  42. # 判断未发射的
  43. if not bullet.is_shot:
  44. # 设置子弹的位置
  45. bullet.img_rect[0] = self.img_rect[0] + (self.img_rect[2] - bullet.img_rect[2])/2
  46. bullet.img_rect[1] = self.img_rect[1] - bullet.img_rect[3]
  47. # 设置为发射状态
  48. bullet.is_shot = True
  49. # 一次只能发射一颗子弹
  50. break

5. 子弹模块

  1. import pygame
  2. # 自定义一个英雄飞机子弹类
  3. class PlaneBullet(object):
  4. def __init__(self):
  5. # 图片
  6. self.img = pygame.image.load("res/bullet_10.png")
  7. # 获取子弹的图片矩形
  8. self.img_rect = self.img.get_rect()
  9. # 子弹的状态
  10. self.is_shot = False
  11. # 速度
  12. self.speed = 4
  13. # 向上移动
  14. def move_up(self):
  15. self.img_rect.move_ip(0, -self.speed)
  16. # 注意改变子弹的状态
  17. if self.img_rect[1] <= -self.img_rect[3]:
  18. # 设置为未发射状态
  19. self.is_shot = False

6. 主模块

  1. # coding=utf-8
  2. #导入的模块可以是安装的,也可以是自己编写的模块文件,import导入类似C语言头文件的写法
  3. import pygame, sys, game_map, hero_plane, enemy_plane, game_score
  4. # 定义一个常量(赋值后不能修改)常量一般使用大写字母
  5. WINDOW_WIDTH, WINDOW_HEIGHT = 512, 768
  6. # python中 崇尚的是一切靠自觉
  7. # 自定义一个游戏窗口管理类
  8. class GameWindow(object):
  9. # 构造方法,初始化数据成员
  10. def __init__(self):
  11. # pygame进行实例化
  12. pygame.init()
  13. # 加载背景音乐
  14. pygame.mixer.music.load("./res/bg2.ogg")
  15. # # 循环播放背景音乐
  16. pygame.mixer.music.play(-1)
  17. # 加载音效
  18. self.boom_sound = pygame.mixer.Sound("./res/baozha.ogg")
  19. # 创建游戏窗口-> 返回一个游戏窗口对象
  20. self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])
  21. # 设置游戏窗口的标题
  22. pygame.display.set_caption("飞机大战")
  23. # 加载本地资源图片 返回一个图片对象
  24. logo_image = pygame.image.load("res/app.ico")
  25. # 设置游戏窗口的logo
  26. pygame.display.set_icon(logo_image)
  27. # 地图对象
  28. self.map = game_map.GameMap()
  29. # 英雄飞机对象
  30. self.hero_plane = hero_plane.HeroPlane()
  31. # 多架敌机, 一次生成多架敌机
  32. self.enemy_list = [enemy_plane.EnemyPlane() for i in range(6)]
  33. # 游戏分数
  34. self.game_score = game_score.GameScore(35)
  35. # 运行游戏程序
  36. def run(self):
  37. while True:
  38. self.__action()
  39. self.__draw()
  40. self.__event()
  41. self.__update()
  42. self.__bullet_hit_enemy()
  43. self.__delay()
  44. def __delay(self):
  45. i = 100000
  46. while i > 0:
  47. i -= 1
  48. # 1.处理各种矩形坐标移动
  49. def __action(self):
  50. # 地图动画
  51. self.map.move_down()
  52. # 遍历子弹 叫子弹飞一会
  53. for bullet in self.hero_plane.bullet_list:
  54. # 判断如果已经发射
  55. if bullet.is_shot:
  56. bullet.move_up()
  57. # 敌机自由落体
  58. for enemy in self.enemy_list:
  59. enemy.move_down()
  60. # 2.根据矩形坐标,重新对元素进行绘制
  61. def __draw(self):
  62. # 添加地图图片
  63. self.window.blit(self.map.img_1, (0, self.map.img1_y))
  64. self.window.blit(self.map.img_2, (0, self.map.img2_y))
  65. # 飞机图片
  66. self.window.blit(self.hero_plane.img, (self.hero_plane.img_rect[0], self.hero_plane.img_rect[1]))
  67. # 添加子弹
  68. for bullet in self.hero_plane.bullet_list:
  69. # 判断如果已经发射的子弹
  70. if bullet.is_shot:
  71. self.window.blit(bullet.img, (bullet.img_rect[0], bullet.img_rect[1]))
  72. # 添加敌机
  73. for enemy in self.enemy_list:
  74. self.window.blit(enemy.img, (enemy.img_rect[0], enemy.img_rect[1]))
  75. # 添加文字
  76. self.window.blit(self.game_score.text_obj, (10, 10))
  77. # 3.处理窗口中的监听事件
  78. def __event(self):
  79. # 获取所有游戏窗口的中的事件监听-> 列表
  80. event_list = pygame.event.get()
  81. # 遍历所有的事件
  82. for event in event_list:
  83. # 判断如果是鼠标点击了
  84. if event.type == pygame.QUIT:
  85. self.game_over()
  86. # 监听esc键按下
  87. if event.type == pygame.KEYDOWN:
  88. # 判断是否按得是esc
  89. if event.key == pygame.K_ESCAPE:
  90. self.game_over()
  91. # 判断是否按得是空格
  92. if event.key == pygame.K_SPACE:
  93. self.hero_plane.shot()
  94. # 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCII
  95. pressed_keys = pygame.key.get_pressed()
  96. # 判断向上的按键是否在长按(1)
  97. if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
  98. self.hero_plane.move_up()
  99. # 判断向下的按键是否在长按(1)
  100. if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
  101. self.hero_plane.move_down()
  102. # 判断向左的按键是否在长按(1)
  103. if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
  104. self.hero_plane.move_left()
  105. # 判断向右的按键是否在长按(1)
  106. if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
  107. self.hero_plane.move_right()
  108. # 4.刷新窗口
  109. def __update(self):
  110. pygame.display.update()
  111. # 5.结束游戏
  112. def game_over(self):
  113. # 停止音效
  114. self.boom_sound.stop()
  115. # 停止背景音乐
  116. pygame.mixer.music.stop()
  117. # 退出游戏
  118. # 停止pygame 游戏引擎
  119. pygame.quit()
  120. # 退出程序
  121. sys.exit()
  122. # 6.碰撞检测(子弹和敌机碰撞)
  123. def __bullet_hit_enemy(self):
  124. # 判断
  125. # 遍历子弹
  126. for bullet in self.hero_plane.bullet_list:
  127. # 判断子弹发射
  128. if bullet.is_shot:
  129. # 遍历敌机
  130. for enemy in self.enemy_list:
  131. # 判断两个矩形是否相交,相交返回True,否则返回False
  132. flag = pygame.Rect.colliderect(bullet.img_rect, enemy.img_rect)
  133. if flag:
  134. # 子弹
  135. bullet.is_shot = False
  136. # 敌机
  137. enemy.reset()
  138. # 播放音效
  139. self.boom_sound.play()
  140. # 设置分数
  141. self.game_score.set_text_obj()
  142. # 主函数
  143. def main():
  144. # 创建一个游戏窗口对象
  145. game_window = GameWindow()
  146. # 执行游戏
  147. game_window.run()
  148. #指定程序的运行入口
  149. if __name__ == '__main__':
  150. main()c

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

闽ICP备14008679号