当前位置:   article > 正文

用python写(飞机大战小游戏)_pycharm写飞机大战

pycharm写飞机大战

w'cwc下面我们进入详细教程:

 

一、首先我们先建一个文件夹 planewars(名字随便取):

 然后用我们python中的pycharm打开这个文件,我们飞机大战的项目就在这进行

二、我们要写这个小游戏要用到pygame
        补充: Pygame是一个利用SDL库的写就的游戏库,Pygame就是Python中使用它的一个库。

 1.安装pygame模块

其安装命令如下:pip install pygame

我们直接在pycharm中打开 命令行(终端) 下载(我已下载)

 也可以用(cmd)来下载

 完成后尝试使用pygame模块

1、⦁    首先新建一个py文件pygame体验.py

 

⦁    然后编辑如下代码
 

  1. import pygame
  2. pygame.init()  # 初始化
  3. print("游戏代码....")
  4. pygame.quit() # 卸载模块,释放资源

如下: 可以点击我标记的那个网址看下pygame

 三、补充知识(使用rect 描述飞机大战英雄机的位置)

        1、Rect是用于存储矩形坐标的pygame对象,rect对象有一些虚拟属性,比如top,left,bottom,right这些是用来固定矩形的位置的,还有size,width,height,这些是描述矩形大小,宽高分别是多大。
center为矩形的中心点,其实就是关于横纵坐标的二元组,因此又有centerx,centery两个属性。此外,还有x,y。

Rect构造方法:
rect = pygame.Rect( left , top, width, height )
        2、下面创建plane_rect.py文件演示

  1. import pygame
  2. pygame.init()
  3. hero_rect = pygame.Rect(100, 200, 125, 300)
  4. # 100: 表示距离x轴原点的位置
  5. # 200: 表示距离y轴原点的位置
  6. # 125:矩形的宽度
  7. # 300:矩形的长度
  8. print("英雄机矩形的x={},y={}".format(hero_rect.x, hero_rect.y))
  9. print("英雄机矩形的宽width = {},高height = {}".format(hero_rect.width, hero_rect.height))
  10. print("英雄机矩形的中心 centerx={}".format(hero_rect.centerx))
  11. print("英雄机的低部 bottom={}".format(hero_rect.bottom))
  12. print("英雄机的左部 left = {}".format(hero_rect.left))
  13. print("英雄机的右部right = {}".format(hero_rect.right))
  14. print("英雄机大小".format(hero_rect.size))
  15. pygame.quit()

 3、下面就来实现创建游戏窗口和游戏循环

  1. import pygame
  2. pygame.init()
  3. # 1.创建游戏窗口
  4. pygame.display.set_mode((480,650)) # 元组中480表示宽度, 650表示高度
  5. # 游戏循环
  6. while True:
  7. pass
  8. pygame.quit()

我们写的游戏就在模板中添加代码

运行结果:

4、我们要用到的图片(你可以直接网上找)

(将你用的图片放在 img 里 )

四、下面是我们飞机大战的源码(有注释自己看)

  1. import random
  2. import pygame
  3. import time
  4. class HeroBullet():
  5. """
  6. 英雄精灵子弹的类
  7. """
  8. def __init__(self, x, y, screen):
  9. """
  10. :param x: x坐标
  11. :param y: y 坐标
  12. :param screen: 窗口对象
  13. """
  14. self.x = x
  15. self.y = y
  16. self.screen = screen
  17. self.pic = pygame.image.load("img/bullet.png")#图片是英雄机的子弹图片
  18. def draw(self):
  19. """用来画子弹"""
  20. self.screen.blit(self.pic, (self.x, self.y))
  21. self.move()
  22. def move(self):
  23. self.y -= 5
  24. class EnemyBullet():
  25. """敌机精灵子弹类"""
  26. def __init__(self, x, y, screen):
  27. self.x = x
  28. self.y = y
  29. self.screen = screen
  30. self.pic = pygame.image.load("img/bullet1.png")#图片是敌机的子弹图片
  31. def draw(self):
  32. """用来画子弹"""
  33. self.screen.blit(self.pic, (self.x, self.y))
  34. self.move()
  35. def move(self):
  36. self.y += 5
  37. pygame.init() # 游戏初始化
  38. # 使用变量screen 接收返回值,代表整个窗口对象
  39. screen = pygame.display.set_mode((480, 650)) # 元组中320表示宽度, 568表示高度
  40. # 修改游戏名称
  41. pygame.display.set_caption("飞机大战")
  42. # 修改游戏图标
  43. icon = pygame.image.load("img/icon72x72.png")#英雄机的图片
  44. pygame.display.set_icon(icon)
  45. # 加载背景图片
  46. bg_img = pygame.image.load("img/background.png")#游戏背景图
  47. # 加载英雄飞机
  48. hero_img1 = pygame.image.load("img/hero1.png")#英雄机尾气加速的图片
  49. hero_img2 = pygame.image.load("img/hero2.png")#英雄机尾气的图片
  50. # 加载英雄爆炸图片
  51. hero_bomb_list = ["img/hero_blowup_n1.png", "img/hero_blowup_n2.png", "img/hero_blowup_n3.png","img/hero_blowup_n4.png"]#英雄机逐渐被击毁的四张图片
  52. # 加载敌机精灵
  53. enemy_img = pygame.image.load("img/enemy1.png")#敌机图片
  54. # 加载敌机爆炸图片
  55. enemy_bomb_list = ["img/enemy1_down1.png", "img/enemy1_down2.png", "img/enemy1_down3.png",
  56. "img/enemy1_down4.png"]#敌机逐渐被击毁的四张图片
  57. heroIndexShift = 0
  58. # 定义英雄飞机的rect
  59. hero_rect = pygame.rect.Rect(190, 526, 100, 124)
  60. # 定义敌机精灵的rect
  61. enemy_rect = pygame.rect.Rect(206, 0, 50, 56) # x= 480//2-69//2
  62. # 敌机精灵的x,y轴坐标
  63. enemyPlaneX = enemy_rect.x
  64. enemyPlaneY = enemy_rect.y
  65. direct = '左' # 定义敌机初始移动方向
  66. # 创建游戏时钟
  67. clock = pygame.time.Clock()
  68. # 英雄精灵的x,y轴坐标
  69. heroPlaneX = hero_rect.x
  70. heroPlaneY = hero_rect.y
  71. pygame.key.set_repeat(20, 30) # 重复按键操作
  72. # 存放英雄机子弹的列表
  73. HeroBiulist = []
  74. # 存放敌机子弹列表
  75. EnemyBiulist = []
  76. enemy_is_bomb = False # 敌机爆炸条件
  77. enemy_bomb_index = 0 # 敌机爆炸图片索引
  78. hero_is_bomb = False # 英雄机爆炸条件
  79. hero_bomb_index = 0 # 英雄机爆炸图片索引
  80. while True: # 游戏循环 ->意味着游戏正式开始
  81. clock.tick(60) # 60表示每秒钟刷新60次
  82. # 将背景图片加载到窗口中,(0,0)表示背景图片放到原点位置
  83. screen.blit(bg_img, (0, 0))
  84. # 修改英雄飞机的y轴值
  85. hero_rect.y -= 1
  86. # 让英雄精灵飞机从底部飞进
  87. if hero_rect.bottom <= 0:
  88. hero_rect.y = 650
  89. # 将英雄的飞机绘制到窗口上
  90. if heroIndexShift == 0:
  91. screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
  92. heroIndexShift += 1
  93. else:
  94. screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
  95. heroIndexShift = 0
  96. # 获取所有的事件
  97. event_list = pygame.event.get()
  98. # 捕获窗口退出事件
  99. for event in event_list:
  100. if event.type == pygame.QUIT: # 加上这个模块就不卡了
  101. print("游戏结束了.......")
  102. pygame.quit() # 卸载模块
  103. exit(0) # 终止Python程序, exit(0)表示正常退出 exit(1)表示异常退出
  104. # 控制英雄精灵移动
  105. if event.type == pygame.KEYDOWN:
  106. if event.key == pygame.K_LEFT: # 向左移动
  107. heroPlaneX = heroPlaneX - 5 if heroPlaneX >= 5 else 0
  108. elif event.key == pygame.K_RIGHT: # 向右移动
  109. heroPlaneX = heroPlaneX + 5 if heroPlaneX <= 375 else 380
  110. elif event.key == pygame.K_DOWN: # 向下移动
  111. heroPlaneY = heroPlaneY + 5 if heroPlaneY <= 521 else 526
  112. elif event.key == pygame.K_UP: # 向上移动
  113. heroPlaneY = heroPlaneY - 5 if heroPlaneY >= 5 else 0
  114. elif event.key == pygame.K_SPACE: # 英雄机控制发射子弹
  115. hero_bullet = HeroBullet(heroPlaneX + 50 - 11, heroPlaneY - 22, screen)
  116. HeroBiulist.append(hero_bullet)
  117. # # 绘制敌机精灵
  118. # screen.blit(enemy_img, (enemyPlaneX, enemyPlaneY))
  119. # 控制敌机精灵移动
  120. if direct == "左":
  121. enemyPlaneX -= 5
  122. if enemyPlaneX <= 0:
  123. direct = "右"
  124. elif direct == "右":
  125. enemyPlaneX += 5
  126. if enemyPlaneX >= 480 - 69:
  127. direct = "左"
  128. # 画出英雄战机的子弹每一个子弹
  129. for bullet in HeroBiulist:
  130. bullet.draw() # 绘制子弹
  131. # 让子弹到最上边的时候消失
  132. HeroBiulist.remove(bullet) if bullet.y < 0 else ""
  133. hero_bullet_rect = pygame.rect.Rect(bullet.x, bullet.y, 10, 10) # 定义英雄子弹的rect
  134. flag = hero_bullet_rect.colliderect(enemy_rect) # 检测敌机和子弹的矩形是否相交
  135. if flag:
  136. print("敌机爆炸了......")
  137. enemy_is_bomb = True # 爆炸条件为真
  138. HeroBiulist.remove(bullet)
  139. # 绘制敌机爆炸的图片
  140. if enemy_is_bomb == False:
  141. # 如果没有检测到爆炸,就绘制没有爆炸敌机的图片
  142. screen.blit(enemy_img, (enemyPlaneX, enemyPlaneY))
  143. else: # 绘制敌机爆炸
  144. if enemy_bomb_index == len(enemy_bomb_list): # 当敌机爆炸图片的下表和图片总数相同时,说明爆炸图片已经绘制结束
  145. time.sleep(0.2)
  146. exit(0) # 结束程序
  147. enemy_bomb_img = pygame.image.load(enemy_bomb_list[enemy_bomb_index]) # 加载敌机爆炸图片
  148. screen.blit(enemy_bomb_img, (enemyPlaneX, enemyPlaneY)) # 绘制敌机爆炸图片
  149. enemy_bomb_index += 1
  150. time.sleep(0.2)
  151. # 画出敌机子弹
  152. # 产是生随机数
  153. x = random.randint(0, 100)
  154. if x == 5 or x == 78:
  155. # 实例化一个子弹
  156. enemy_bullet = EnemyBullet(enemyPlaneX + 69 // 2 - 9 // 2, enemyPlaneY + 89, screen)
  157. # 产生的每一个子弹放到一个列表里
  158. EnemyBiulist.append(enemy_bullet)
  159. for bullet in EnemyBiulist:
  160. bullet.draw() # 绘制子弹
  161. EnemyBiulist.remove(bullet) if bullet.y > 650 - 89 - 21 // 2 else "" # 让子弹到最下面的时候消失
  162. enemy_bullet_rect = pygame.rect.Rect(bullet.x, bullet.y, 9, 21) # 定义敌机子弹rect
  163. flag = enemy_bullet_rect.colliderect(hero_rect) # 英雄机爆炸的条件
  164. if flag:
  165. print("英雄爆炸了.....")
  166. hero_is_bomb = True # 爆炸条件为真
  167. EnemyBiulist.remove(bullet)# 当战机爆炸的时候,移除子弹
  168. if hero_is_bomb == False:
  169. # 将英雄的飞机绘制到窗口上
  170. if heroIndexShift == 0:
  171. screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
  172. heroIndexShift += 1
  173. else:
  174. screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
  175. heroIndexShift = 0
  176. else:
  177. if hero_bomb_index == len(hero_bomb_list):# 当爆炸图片加载结束后
  178. time.sleep(0.3)
  179. exit()
  180. # 加载英雄机爆炸图片
  181. hero_bomb_img = pygame.image.load(hero_bomb_list[hero_bomb_index])
  182. # 绘制英雄机爆炸的图片
  183. screen.blit(hero_bomb_img,(heroPlaneX,heroPlaneY))
  184. hero_bomb_index += 1
  185. time.sleep(0.2)
  186. pygame.display.update()

 运行结果:

                                                                                 就到这吧!

 

 

 

 

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

闽ICP备14008679号