小学僧自学一周Python就做出了这款雷霆战机,简直人比人气死人

x33g5p2x  于2021-12-09 转载在 Python  
字(10.8k)|赞(0)|评价(0)|浏览(403)

雷霆战机大家都玩过吧,就这种的

表弟学了一周Python就做出了雷霆战机这种游戏,看起来确实不错啊,下次得教教他爬虫~

今天就实现一下雷霆战机的运作把,开始整活!

一、准备工作

使用的软件版本:

  • Python3.6
  • pycharm2019 专业版

你们用其它的也可以,没有软件的话我放在最后面了

这两个模块安装一下

  • pygame
  • random

安装模块如果不会的话,看我以前发的文章:如何安装python模块, python模块安装失败的原因以及解决办法

我们要准备这些东西
1、字体文件


2、背景音乐文件


3、背景图片

可以自己设计,自己准备,名字改成一样的就好了。
当然,你也可以改成其他名字,但是代码里的名字你也得改,就挺麻烦的。

但是我呢也给大家都准备好了,直接保存就好了↓↓↓

Python/pycharm安装包及安装教程、源代码及要用的文件

网盘提取码:qwer

二、代码展示

算了我直接放代码吧,有点长,你们肯定坚持不下去看,我都放注释里去讲,这样你们才看的下去。

  1. #导入模块
  2. import pygame, os
  3. import time
  4. import random
  5. from pygame.sprite import Sprite
  6. from pygame.sprite import Group
  7. def fire_music():
  8. pass
  9. # 设置开火音乐
  10. # effect = pygame.mixer.Sound('sounds/fire.wav')
  11. # pygame.mixer.Sound.play(effect)
  12. class Boss(Sprite):
  13. def __init__(self,boss_img_name):
  14. super().__init__()
  15. # 加载BOSS图片
  16. self.image = pygame.image.load('图片/'+boss_img_name+'.png').convert_alpha()
  17. # 转换BOSS大小
  18. # self.image = pygame.transform.scale(self.image, (1, 12))
  19. # 生成BOSS矩形框架
  20. self.rect = self.image.get_rect()
  21. self.blood = 1000
  22. # boss左右移动的速度
  23. self.speed = 3.5
  24. def move(self):
  25. if self.rect.centerx>=512:
  26. self.speed =-self.speed
  27. if self.rect.centerx<=0:
  28. self.speed = -self.speed
  29. self.rect.centerx +=self.speed
  30. class Enemy(Sprite):
  31. def __init__(self,screen):
  32. # 必须设置继承精灵 不然在使用精灵函数时会报错
  33. super().__init__()
  34. # 获取屏幕对象
  35. self.screen = screen
  36. # 随机 生成5个编号
  37. alien_num = random.randint(1,5)
  38. # 随机 加载五个飞机中的某个
  39. self.image = pygame.image.load('图片/alien_' + str(alien_num) + '.png')
  40. # picture = pygame.transform.scale(picture, (1280, 720))
  41. self.image = pygame.transform.scale(self.image,(62,62))
  42. # 获取飞机的 rect
  43. self.rect = self.image.get_rect()
  44. # 击落本机获得的分数
  45. self.score = 10
  46. # 加载子弹的图片
  47. self.bullet_img = pygame.image.load("图片/alien_bullet.png").convert_alpha()
  48. self.bullet_img = pygame.transform.scale(self.bullet_img, (12, 12))
  49. # 以下为可以调节子弹尺寸的代码
  50. # picture = pygame.transform.scale(picture, (1280, 720))
  51. #飞机的移动速度
  52. self.speed = random.randint(3,5)
  53. #生成子弹精灵组合
  54. self.bullets = Group()
  55. # 敌机射击频率
  56. self.shoot_frequency = 0
  57. # 飞机出现
  58. def move(self):
  59. self.rect.top += 5
  60. #暂时不用射击
  61. # self.shoot()
  62. # self.moveBullet()
  63. # 发射子弹
  64. def shoot(self):
  65. if self.shoot_frequency % 200 == 0:
  66. bullet = Enemy_Bullet(self.bullet_img, self.rect.midbottom)
  67. self.bullets.add(bullet)
  68. self.shoot_frequency += 1
  69. if self.shoot_frequency > 200:
  70. self.shoot_frequency = 1
  71. # 删除子弹
  72. def moveBullet(self):
  73. for bullet in self.bullets:
  74. bullet.move()
  75. if bullet.rect.bottom < 0:
  76. self.bullets.remove(bullet)
  77. # 绘制子弹
  78. def drawBullets(self, scr):
  79. self.bullets.draw(scr)
  80. class Enemy_Bullet(pygame.sprite.Sprite):
  81. def __init__(self, init_pos):
  82. pygame.sprite.Sprite.__init__(self)
  83. self.image = pygame.image.load("图片/alien_bullet.png").convert_alpha()
  84. self.image = pygame.transform.scale(self.image, (12, 12))
  85. self.rect = self.image.get_rect()
  86. # 敌机子弹初始位置设置
  87. self.rect.midbottom = init_pos
  88. self.rect.centery +=36
  89. self.speed = 8
  90. def move(self):
  91. self.rect.top += self.speed
  92. class MyHero(Sprite):
  93. _rate = 100 # 每帧停留的毫秒数
  94. def __init__(self,screen,size = 1):
  95. super().__init__()
  96. # 获取屏幕对象
  97. self.screen = screen
  98. # 获取整张图片
  99. self.image_big = pygame.image.load('图片/hero.png').convert_alpha()
  100. # subsurface 形成大图的子表面框架
  101. # 获取飞机正面图片
  102. self.image = self.image_big.subsurface(pygame.Rect(120, 0, 318 - 240, 87))
  103. # 获取飞机正面矩形框架尺寸
  104. self.rect = self.image.get_rect()
  105. # 获取屏幕对象矩形
  106. self.screen_rect = screen.get_rect()
  107. # 获取屏幕正中x坐标
  108. self.rect.centerx = self.screen_rect.centerx
  109. # 获取屏幕底部y坐标
  110. self.rect.centery = self.screen_rect.bottom - self.rect.height
  111. # 设置飞机初始位置
  112. self.centerX = float(self.rect.centerx)
  113. self.centerY = float(self.rect.centery)
  114. # 飞机尾焰
  115. self.air = None
  116. # 设置飞机尾焰位置
  117. self.air_rect = pygame.Rect(self.centerX - 20,self.centerY+int((self.rect.height+72)/2)-10-36,40,72)
  118. #玩家所有发射子弹的集合
  119. self.bullets = Group()
  120. self.bullet_image = pygame.image.load('图片/bullet_1.png').convert_alpha()
  121. # 子弹射击
  122. def shoot(self):
  123. # 产生一颗子弹实例
  124. bullet = Bullet(self.bullet_image,self.rect.midtop)
  125. # 在group子弹精灵集合中加入子弹
  126. self.bullets.add(bullet)
  127. # 子弹删除
  128. def moveBullet(self):
  129. # 逐个检查子弹精灵集合 到达屏幕顶端的子弹删除
  130. for bullet in self.bullets:
  131. bullet.move()
  132. if bullet.rect.bottom < 0:
  133. self.bullets.remove(bullet)
  134. # 子弹显示
  135. def drawBullets(self, scr):
  136. # 将精灵集合中的子弹绘制到屏幕上
  137. self.bullets.draw(scr)
  138. # 向上飞时,增加喷射火焰
  139. def set_air(self, case):
  140. if case == 'up':
  141. air = pygame.image.load('图片/air.png').convert_alpha()
  142. img = air.subsurface(pygame.Rect(80, 0, 50, 87))
  143. self.air = img
  144. elif case == 'remove':
  145. self.air = None
  146. # 根据移动方向获取飞机移动状态的图片
  147. def set_image(self, case):
  148. if case=='left':
  149. rect = pygame.Rect(195,0,318-248,87)
  150. image = self.image_big.subsurface(rect)
  151. elif case =='right':
  152. rect = pygame.Rect(195,0,318-248,87)
  153. image = pygame.transform.flip(self.image_big.subsurface(rect), True, False)
  154. elif case == 'up' or case == 'down':
  155. rect = pygame.Rect(120, 0, 318 - 240, 87)
  156. image = self.image_big.subsurface(rect)
  157. self.image = image
  158. class Bullet(pygame.sprite.Sprite):
  159. def __init__(self, bullet_img, init_pos):
  160. pygame.sprite.Sprite.__init__(self)
  161. self.image = bullet_img
  162. self.rect = bullet_img.get_rect()
  163. self.rect.midbottom = init_pos
  164. self.speed = 25
  165. def move(self):
  166. self.rect.top -= self.speed
  167. # 初始化pygame
  168. pygame.init()
  169. # pygame.mixer.init()
  170. # pygame.mixer_music.load('sounds/enviro.mp3') # 加载播放音乐
  171. # pygame.mixer.music.play(-1) #-1 为循环播放
  172. # 设置游戏主题
  173. pygame.display.set_caption('雷电飞机')
  174. # 初始化屏幕大小
  175. screen = pygame.display.set_mode((512,768))
  176. # 设置游戏背景图片
  177. # 游戏刚开始时的背景图
  178. bg_img0 = pygame.image.load('图片/start_bg.jpg').convert()
  179. # 加载游戏开始图标
  180. start_img = pygame.image.load('图片/start.png').convert_alpha()
  181. start_rect = start_img.get_rect()
  182. start_rect.centerx = 262
  183. start_rect.centery = 455
  184. # 游戏进行中的背景图
  185. bg_img1 = pygame.image.load('图片/map1.jpg').convert()
  186. bg_img2 = bg_img1.copy()
  187. # 游戏结束时的背景图
  188. bg_img3 = pygame.image.load('图片/map3.jpg').convert()
  189. # 加载游戏结束图标
  190. gameover_img = pygame.image.load('图片/gameover.png').convert_alpha()
  191. # 加载游戏成功图标
  192. gamesuccess = pygame.image.load('图片/success.png').convert_alpha()
  193. # 加载重玩图标
  194. restart_img = pygame.image.load('图片/restart.png').convert_alpha()
  195. restart_rect = restart_img.get_rect()
  196. restart_rect.centerx = 249
  197. restart_rect.centery = 420
  198. # 背景图片初始位置
  199. pos_y1 = -768
  200. pos_y2 = 0
  201. # 实例化BOSS
  202. boss = Boss('boss_1')
  203. bosses = Group()
  204. bosses.add(boss)
  205. # 测试主角图片
  206. # air = pygame.image.load('图片/air.png').convert_alpha()
  207. # img = air.subsurface(pygame.Rect(80, 0, 50, 87))
  208. # image_big = pygame.image.load('图片/hero.png').convert_alpha()
  209. # image = image_big.subsurface(pygame.Rect(195,0,318-248,87))
  210. # 生成我方飞机
  211. student_plane = MyHero(screen)
  212. # 生成敌方飞机
  213. # 生成敌机group
  214. enemies = Group()
  215. # 生成敌机子弹
  216. enemy_bullets = Group()
  217. max_enemies = 9 # 设置敌机数量总数为9
  218. # 敌机随机出现的节奏 下方randint参数 为43,55
  219. ran1,ran2 = 30,40
  220. # 生成计时频率变量
  221. sec = 0
  222. # 生成分数
  223. score = 0
  224. # 设置系统字体
  225. my_font = pygame.font.Font('fonts/msyh.ttf', 18)
  226. # 游戏主循环
  227. # 设置游戏状态 开始 结束
  228. game = 'wait'
  229. while True:
  230. # 游戏在等待状态
  231. if game =='wait':
  232. # 最小游戏框架一个都不能省略
  233. for event in pygame.event.get():
  234. if event.type == pygame.QUIT:
  235. pygame.quit()
  236. # 检测鼠标是否按下 重新开始按钮
  237. if event.type == pygame.MOUSEBUTTONDOWN:
  238. # 检测鼠标点击位置是否与重启rect重叠
  239. if start_rect.collidepoint(event.pos):
  240. student_plane.__init__(screen)
  241. game = 'ing'
  242. # 游戏结束游戏画面暂停
  243. screen.blit(bg_img0, (0, 0))
  244. screen.blit(start_img, start_rect)
  245. # 测试尾焰位置
  246. pygame.display.flip()
  247. time.sleep(0.05)
  248. # 游戏进行状态
  249. elif game == 'ing':
  250. # 设置这3行 监听事件 并且内部设定了延迟防止游戏卡死
  251. # 屏幕滚动-----------------------------------------------------
  252. screen.blit(bg_img1, (0, pos_y1))
  253. screen.blit(bg_img2, (0, pos_y2))
  254. # 测试尾焰位置
  255. # screen.blit(img, (100, 100))
  256. pos_y1 += 1
  257. pos_y2 += 1
  258. # 屏幕背景滚动完毕后重置位置
  259. if pos_y1 >= 0:
  260. pos_y1 = -768
  261. if pos_y2 >= 768:
  262. pos_y2 = 0
  263. for event in pygame.event.get():
  264. if event.type == pygame.QUIT:
  265. pygame.quit()
  266. # 监听键盘事件
  267. # 按键弹起取消飞机向上尾焰 矫正飞机姿势
  268. if event.type == pygame.KEYUP:
  269. student_plane.set_image('down')
  270. student_plane.air = None
  271. # 发射子弹
  272. if event.type == pygame.KEYDOWN:
  273. if event.key == pygame.K_SPACE and len(student_plane.bullets) <6: # 检查子弹集合的数量限制子弹最大数量
  274. fire_music()
  275. # 产生一颗子弹实例
  276. # 在group子弹精灵集合中加入子弹
  277. student_plane.shoot()
  278. # 将精灵集合中的子弹绘制到屏幕上
  279. student_plane.drawBullets(screen)
  280. # 逐个检查子弹精灵集合 到达屏幕顶端的子弹删除
  281. student_plane.moveBullet()
  282. keys = pygame.key.get_pressed()
  283. if keys[pygame.K_a]:
  284. # 设置飞机状态图片
  285. student_plane.set_image('left')
  286. if student_plane.rect.centerx>=40:
  287. student_plane.rect.centerx -=8.5
  288. elif keys[pygame.K_d]:
  289. # 设置飞机状态图片
  290. student_plane.set_image('right')
  291. if student_plane.rect.centerx <= 478:
  292. student_plane.rect.centerx +=8.5
  293. elif keys[pygame.K_w]:
  294. #设置飞机状态图片
  295. student_plane.set_image('up')
  296. student_plane.set_air('up')
  297. if student_plane.rect.centery >= 45:
  298. student_plane.rect.centery -=8.5
  299. elif keys[pygame.K_s]:
  300. # 设置飞机状态图片
  301. student_plane.set_image('down')
  302. if student_plane.rect.centery <= 727:
  303. student_plane.rect.centery +=8.5
  304. # 显示飞机
  305. screen.blit(student_plane.image,student_plane.rect)
  306. if student_plane.air != None:
  307. screen.blit(student_plane.air, (student_plane.rect.centerx-30, student_plane.rect.centery+33))
  308. # 敌机 ---------------------------------------------------------------------------------------
  309. # 敌机移动
  310. # 控制时间节奏 sec变量
  311. sec +=1
  312. #随机控制生成敌机的节奏
  313. rhy = random.randint(ran1,ran2)
  314. # 敌机最多数量
  315. if sec%rhy ==0 and len(enemies) < max_enemies or sec ==1: # 设置敌机数量总数为9
  316. # 生成一只敌机
  317. enemy = Enemy(screen)
  318. enemy.rect.centerx=random.randint(0,512)
  319. # 生成上述敌机的子弹
  320. enemy_bullet = Enemy_Bullet((enemy.rect.centerx,enemy.rect.centery))
  321. # 敌机group 和 敌机子弹group加载敌机和子弹
  322. enemies.add(enemy)
  323. enemy_bullets.add(enemy_bullet)
  324. # 敌机出现 和 敌机子弹出现
  325. enemies.draw(screen)
  326. enemy_bullets.draw(screen)
  327. # 迭代敌机集合
  328. for enemy in enemies:
  329. # 让每个对象移动起来
  330. enemy.move()
  331. # 敌机超出屏幕边界后 自动删除敌机
  332. collision_over1 = pygame.sprite.collide_rect(student_plane, enemy)
  333. if collision_over1:
  334. # 为了重启游戏时 防止有旧子弹和飞机存在
  335. enemies.remove(enemy)
  336. game = 'over'
  337. if enemy.rect.bottom >768:
  338. enemies.remove(enemy)
  339. for enemy_bullet in enemy_bullets:
  340. # 让每个对象移动起来
  341. enemy_bullet.move()
  342. collision_over2 = pygame.sprite.collide_rect(student_plane, enemy_bullet)
  343. if collision_over2:
  344. # 为了重启游戏时 防止有旧子弹和飞机存在
  345. enemy_bullets.remove(enemy_bullet)
  346. game = 'over'
  347. # 敌机子弹超出屏幕边界后 自动删除敌机
  348. if enemy_bullet.rect.bottom >768:
  349. enemy_bullets.remove(enemy_bullet)
  350. # -----------------------Boss --------------------------
  351. if score >=140:
  352. # 小敌机出现的节奏
  353. ran1,ran2 = 15,25
  354. max_enemies = 17
  355. screen.blit(boss.image,boss.rect)
  356. boss.move()
  357. for my_bullet in student_plane.bullets:
  358. hit_boss = pygame.sprite.collide_rect(boss,my_bullet)
  359. if hit_boss:
  360. boss.blood -=1.2
  361. score+=1
  362. if boss.blood <=0:
  363. game = 'success'
  364. # 处理碰撞 ---------------------------碰撞检测--------------------------------------------------
  365. #   参数:
  366. #   group1:精灵组1。
  367. #   group2:精灵组2。
  368. #   dokill1:发生碰撞时,是否销毁精灵组1中的发生碰撞的精灵。
  369. #   dokill2:发生碰撞时,是否销毁精灵组2中的发生碰撞的精灵。
  370. collisions = pygame.sprite.groupcollide(student_plane.bullets, enemies, True, True)
  371. if collisions:
  372. score+=10
  373. # -----------游戏结束------------
  374. # 分数和奖励的显示-------------------------------------------------------------------------
  375. surface1 = my_font.render(u"当前得分:%s"%(score),True,[255,0,0])
  376. screen.blit(surface1,[20,20])
  377. # 更新画面
  378. pygame.display.flip()
  379. # 设置帧数和延迟
  380. time.sleep(0.05)
  381. #游戏结束状态
  382. elif game == 'over':
  383. score = 0
  384. # 最小游戏框架一个都不能省略
  385. for event in pygame.event.get():
  386. if event.type == pygame.QUIT:
  387. pygame.quit()
  388. # 检测鼠标是否按下 重新开始按钮
  389. if event.type == pygame.MOUSEBUTTONDOWN:
  390. # 检测鼠标点击位置是否与重启rect重叠
  391. if restart_rect.collidepoint(event.pos):
  392. student_plane.__init__(screen)
  393. game = 'ing'
  394. # 游戏结束游戏画面暂停
  395. screen.blit(bg_img1, (0, pos_y1))
  396. screen.blit(bg_img2, (0, pos_y2))
  397. screen.blit(gameover_img, (163, 310))
  398. screen.blit(restart_img, restart_rect)
  399. # 测试尾焰位置
  400. # screen.blit(img, (100, 100))
  401. pos_y1 += 0
  402. pos_y2 += 0
  403. pygame.display.flip()
  404. time.sleep(0.05)
  405. # surface2 = my_font.render("Game Over" , True, [255, 0, 0])
  406. # screen.blit(surface1, [250, 350])
  407. elif game == 'success':
  408. score = 0
  409. boss.blood = 1000
  410. # 最小游戏框架一个都不能省略
  411. for event in pygame.event.get():
  412. if event.type == pygame.QUIT:
  413. pygame.quit()
  414. # 检测鼠标是否按下 重新开始按钮
  415. if event.type == pygame.MOUSEBUTTONDOWN:
  416. # 检测鼠标点击位置是否与重启rect重叠
  417. if restart_rect.collidepoint(event.pos):
  418. student_plane.__init__(screen)
  419. game = 'ing'
  420. # 游戏结束游戏画面暂停
  421. screen.blit(bg_img1, (0, pos_y1))
  422. screen.blit(bg_img2, (0, pos_y2))
  423. screen.blit(gamesuccess, (170, 220))
  424. screen.blit(restart_img, restart_rect)
  425. # 测试尾焰位置
  426. # screen.blit(img, (100, 100))
  427. pos_y1 += 0
  428. pos_y2 += 0
  429. pygame.display.flip()
  430. time.sleep(0.05)

三、效果展示

我们来看看运行效果,玩的有点菜

兄弟们,看完记得点个赞呗~

相关文章