ToB企服应用市场:ToB评测及商务社交产业平台

标题: 飞机大战实战项目剖析(超具体版) [打印本页]

作者: 花瓣小跑    时间: 2024-8-2 22:53
标题: 飞机大战实战项目剖析(超具体版)
  1. # 导包
  2. import time
  3. import pygame
  4. import random
  5. # 初始化游戏
  6. pygame.init()
  7. # 显示窗口
  8. screen = pygame.display.set_mode((480, 650))
  9. # 修改游戏图标
  10. icon = pygame.image.load("img/icon.png")
  11. pygame.display.set_icon(icon)
  12. # 加载背景
  13. bg_img = pygame.image.load("img/background.png")
  14. # 加载战机
  15. hero_img1 = pygame.image.load("img/me1.png")
  16. hero_img2 = pygame.image.load("img/me2.png")
  17. # 定义战机
  18. hero_rect = pygame.rect.Rect(189, 524, 102, 126)
  19. heroPlaneX = hero_rect.x
  20. heroPlaneY = hero_rect.y
  21. pygame.key.set_repeat(20, 30)
  22. # 显示战机要用参数
  23. a = "单发"
  24. # 定义英雄子弹
  25. class HeroBullet:
  26.     def __init__(self, x, y, screen):
  27.         self.x = x
  28.         self.y = y
  29.         self.show = screen
  30.         self.pic = pygame.image.load("img/bullet1.png")
  31.     # 画子弹
  32.     def draw(self):
  33.         self.show.blit(self.pic,(self.x,self.y))
  34.         self.move()
  35.     # 子弹移动
  36.     def move(self):
  37.         self.y -= 5
  38. # 战机子弹列表
  39. hero_Bulletlist = []
  40. # 战机爆炸条件
  41. hero_bomb = False
  42. # 战机爆炸索引
  43. hero_bomb_index = 0
  44. # 战机爆炸图片
  45. hero_bomb_list = ["img/enemy1_down1.png",
  46.                   "img/enemy1_down2.png",
  47.                   "img/enemy1_down3.png",
  48.                   "img/enemy1_down4.png"]
  49. # 加载敌机
  50. di_img = pygame.image.load("img/enemy2.png")
  51. # 定义敌机
  52. di_rect = pygame.rect.Rect(189, 0, 69, 99)
  53. diPlaneX = di_rect.x
  54. diPlaneY = di_rect.y
  55. # 敌机移动要用的参数
  56. b = 'left'
  57. # 敌机子弹
  58. class DiBullet:
  59.     def __init__(self,x,y,screen):
  60.         self.x = x
  61.         self.y = y
  62.         self.show = screen
  63.         self.pic = pygame.image.load("img/bullet2.png")
  64.     # 画子弹
  65.     def draw(self):
  66.         self.show.blit(self.pic,(self.x,self.y))
  67.         self.move()
  68.     # 子弹移动
  69.     def move(self):
  70.         self.y += 5
  71. # 敌机子弹列表
  72. di_Bulletlist = []
  73. # 敌机爆炸条件
  74. is_bomb = False
  75. # 敌机爆炸索引
  76. di_bomb_index = 0
  77. # 敌机爆炸图片
  78. di_bomb_list = ["img/enemy1_down1.png",
  79.                 "img/enemy1_down2.png",
  80.                 "img/enemy1_down3.png",
  81.                 "img/enemy1_down4.png"]
  82. clock = pygame.time.Clock()
  83. while True:
  84.     clock.tick(120)
  85.     # 显示背景
  86.     screen.blit(bg_img, (0, 0))
  87.     # 战机底部飞入
  88.     heroPlaneY -= 1
  89.     if heroPlaneY <= 0:
  90.         heroPlaneY = 500
  91.     # 获取所有监听事件
  92.     event_list = pygame.event.get()
  93.     # 获取窗口退出事件
  94.     for event in event_list:
  95.         if event.type == pygame.QUIT:
  96.             print("游戏结束了")
  97.             # 卸载模块
  98.             pygame.quit()
  99.             exit(0)
  100.         # 战机移动
  101.         if event.type == pygame.KEYDOWN:
  102.             if event.key == pygame.K_LEFT:
  103.                 heroPlaneX = heroPlaneX-10 if heroPlaneX >= 5 else 0
  104.             elif event.key == pygame.K_RIGHT:
  105.                 heroPlaneX = heroPlaneX+10 if heroPlaneX <=370 else 380
  106.             elif event.key == pygame.K_UP:
  107.                 heroPlaneY = heroPlaneY-10 if heroPlaneY >=5 else 0
  108.             elif event.key == pygame.K_DOWN:
  109.                 heroPlaneY = heroPlaneY+20 if heroPlaneY <=521 else 526
  110.             elif event.key == pygame.K_SPACE:
  111.                 hero_bullet = HeroBullet(heroPlaneX+40+10, heroPlaneY-11,screen)
  112.                 hero_Bulletlist.append(hero_bullet)
  113.     # 调用函数画出战机子弹
  114.     for bullet in hero_Bulletlist:
  115.         bullet.draw()
  116.     # 定义战机子弹的rect
  117.         hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
  118.     # 检测敌机和子弹矩形是否相交
  119.         flag = hero_bullet_rect.colliderect(di_rect)
  120.         # 如果相交
  121.         if flag:
  122.             print("敌机爆炸")
  123.             is_bomb = True
  124.             hero_Bulletlist.remove(bullet)
  125.     # 绘制敌机爆炸图片
  126.     if is_bomb == False:
  127.         #
  128.         screen.blit(di_img,(diPlaneX,diPlaneY))
  129.     else:
  130.         #
  131.         if di_bomb_index == len(di_bomb_list):
  132.             time.sleep(0.2)
  133.             exit(0)
  134.         di_bomb_img = pygame.image.load(di_bomb_list[di_bomb_index])
  135.         screen.blit(di_bomb_img,(diPlaneX,diPlaneY))
  136.         di_bomb_index += 1
  137.         time.sleep(0.2)
  138.     # 显示敌机
  139.     # screen.blit(di_img,(diPlaneX,diPlaneY))
  140.     # 敌机移动
  141.     if b == 'left':
  142.         diPlaneX = diPlaneX-3
  143.         if diPlaneX <= 0:
  144.             b = 'right'
  145.     elif b == 'right':
  146.         diPlaneX = diPlaneX+3
  147.         if diPlaneX >= 480-60:
  148.             b = 'left'
  149.     # 定义敌机子弹
  150.     x = random.randint(1, 100)
  151.     if x == 5 or x == 78:
  152.         enemybullet = DiBullet(diPlaneX+(69+5)/2, diPlaneY+99, screen)
  153.         di_Bulletlist.append(enemybullet)
  154.     for bullet1 in di_Bulletlist:
  155.         bullet1.draw()
  156.         di_bullet_rect = pygame.rect.Rect(bullet1.x,bullet1.y,9,21)
  157.         flag = di_bullet_rect.colliderect(hero_rect)
  158.         if flag:
  159.             print("战机爆炸")
  160.             hero_bomb = True
  161.             di_Bulletlist.remove(bullet1)
  162.     if hero_bomb == False:
  163.         # 显示战机
  164.         if a == "连发":
  165.             screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
  166.             a = "连发"
  167.         else:
  168.             screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
  169.             a = "单发"
  170.     else:
  171.         if hero_bomb_index == len(hero_bomb_list):
  172.             time.sleep(0.5)
  173.             exit()
  174.         hero_bomb_img = pygame.image.load(hero_bomb_list[hero_bomb_index])
  175.         screen.blit(hero_bomb_img,(heroPlaneX, heroPlaneY))
  176.         hero_bomb_index += 1
  177.         time.sleep(0.5)
  178.     # 循环显示所有图片
  179.     pygame.display.update()
复制代码
分段剖析

1.导包和初始化

  1. import time
  2. import pygame
  3. import random
复制代码
导入须要的Python模块:time用于处置处罚时间相关的功能,pygame是用于游戏开发的库,random用于生成随机数。
  1. pygame.init()
复制代码
初始化Pygame库,这是使用Pygame之前必须做的。
2. 设置窗口和图标

  1. screen = pygame.display.set_mode((480, 650))
复制代码
创建一个游戏窗口,大小为480x650像素。
  1. icon = pygame.image.load("img/icon.png")
  2. pygame.display.set_icon(icon)
复制代码
加载游戏图标并设置到游戏窗口。
3. 加载游戏资源

  1. bg_img = pygame.image.load("img/background.png")
复制代码
加载背景图片。
  1. hero_img1 = pygame.image.load("img/me1.png")
  2. hero_img2 = pygame.image.load("img/me2.png")
复制代码
加载英雄战机的两种不同状态图片。
4.定义英雄飞机和敌机的基本属性

  1. hero_rect = pygame.rect.Rect(189,524,102,126)
  2. heroPlaneX = hero_rect.x
  3. heroPlaneY = hero_rect.y
  4. pygame.key.set_repeat(20,30)
复制代码
创建英雄战机的矩形区域,并设置初始位置。pygame.key.set_repeat用于设置按键重复的延迟和间隔。
5.英雄飞机子弹类

  1. a = "单发"
复制代码
一个变量,用于控制英雄战机的图片切换。
  1. class HeroBullet:
  2.     def __init__(self,x,y,screen):
  3.         self.x = x
  4.         self.y = y
  5.         self.show = screen
  6.         self.pic = pygame.image.load("img/bullet1.png")
  7.     # 画子弹
  8.     def draw(self):
  9.         self.show.blit(self.pic,(self.x,self.y))
  10.         self.move()
  11.     # 子弹移动
  12.     def move(self):
  13.         self.y -= 5
  14. # 战机子弹列表
  15. hero_Bulletlist = []
  16. # 战机爆炸条件
  17. hero_bomb = False
  18. # 战机爆炸索引
  19. hero_bomb_index = 0
  20. # 战机爆炸图片
  21. hero_bomb_list = ["img/enemy1_down1.png",
  22.                   "img/enemy1_down2.png",
  23.                   "img/enemy1_down3.png",
  24.                   "img/enemy1_down4.png"]
  25. # 加载敌机
  26. di_img = pygame.image.load("img/enemy2.png")
  27. # 定义敌机
  28. di_rect = pygame.rect.Rect(189, 0, 69, 99)
  29. diPlaneX = di_rect.x
  30. diPlaneY = di_rect.y
  31. # 敌机移动要用的参数
  32. b = 'left'
  33. # 敌机子弹
  34. class DiBullet:
  35.     def __init__(self,x,y,screen):
  36.         self.x = x
  37.         self.y = y
  38.         self.show = screen
  39.         self.pic = pygame.image.load("img/bullet2.png")
  40.     # 画子弹
  41.     def draw(self):
  42.         self.show.blit(self.pic,(self.x,self.y))
  43.         self.move()
  44.     # 子弹移动
  45.     def move(self):
  46.         self.y += 5
  47. # 敌机子弹列表
  48. di_Bulletlist = []
  49. # 敌机爆炸条件
  50. is_bomb = False
  51. # 敌机爆炸索引
  52. di_bomb_index = 0
  53. # 敌机爆炸图片
  54. di_bomb_list = ["img/enemy1_down1.png",
  55.                 "img/enemy1_down2.png",
  56.                 "img/enemy1_down3.png",
  57.                 "img/enemy1_down4.png"]
复制代码
这段代码定义了两个类 HeroBullet 和 DiBullet,分别用于创建和渲染英雄战机和敌机的子弹。同时,它还初始化了一些用于控制游戏逻辑的变量。

HeroBullet 类
这个类用于创建英雄战机的子弹。每个子弹对象都有以下属性和方法:

x 和 y:子弹在屏幕上的坐标。
show:游戏屏幕的表面临象,用于在屏幕上绘制子弹。
pic:子弹的图像,通过 pygame.image.load 加载。
draw() 方法:在屏幕上绘制子弹,并调用 move() 方法来更新子弹的位置。
move() 方法:将子弹的 y 坐标淘汰 5,使子弹向上移动。
DiBullet 类
这个类用于创建敌机的子弹。它的结构和工作方式与 HeroBullet 类似,但是子弹的移动方向相反:子弹的 y 坐标增加 5,使子弹向下移动。

游戏逻辑变量
hero_Bulletlist 和 di_Bulletlist:这两个列表分别存储英雄战机和敌机的子弹对象。
hero_bomb 和 is_bomb:这两个布尔变量用于判断战机是否应该爆炸。
hero_bomb_index 和 di_bomb_index:这两个整型变量用于跟踪爆炸动画的当前帧。
hero_bomb_list 和 di_bomb_list:这两个列表包罗战机爆炸动画的帧图像文件路径。
敌机初始化
di_img:加载敌机的图像。
di_rect:定义敌机的矩形区域,用于碰撞检测。
diPlaneX 和 diPlaneY:存储敌机的当前位置。
b:控制敌机移动方向的变量,初始值为 'left'。
敌机移动逻辑
敌机的移动逻辑在主游戏循环中实现,根据变量 b 的值,敌机在屏幕上左右移动。当敌机到达屏幕边缘时,改变移动方向。

爆炸逻辑
当战机被子弹击中时,相应的爆炸条件变量 (hero_bomb 或 is_bomb) 设置为 True,并在游戏循环中触发爆炸动画。动画通过遍历爆炸图像列表来实现,每次循环显示一张图像,直到列表中的全部图像都被显示一遍。

这段代码是游戏的一部分,它需要与游戏的主循环和事件处置处罚逻辑联合使用。在主循环中,将创建子弹对象,更新它们的位置,检测碰撞,并绘制到屏幕上。当战机或敌机被击中时,将触发爆炸动画,最终可能结束游戏或进行其他游戏逻辑的处置处罚。
  1. clock = pygame.time.Clock()
复制代码
创建一个时钟对象,用于控制游戏的帧率。
6.游戏循环和事件处置处罚

  1. while True:
  2.     clock.tick(120)
复制代码
游戏的主循环,全部游戏逻辑都在这个循环中处置处罚。
游戏循环开始,clock.tick(120) 设置每秒钟最多实行120次循环,即游戏的帧率为120FPS。
  1. screen.blit(bg_img, (0, 0))
复制代码
在屏幕上绘制背景图像,位于屏幕的左上角。
  1. heroPlaneY -= 1
  2.     if heroPlaneY <= 0:
  3.         heroPlaneY = 500
复制代码
英雄战机的Y坐标每帧淘汰1,模拟战机移动。假如战机移动到屏幕顶部之外,将其重新设置到屏幕底部。
  1. event_list = pygame.event.get()
复制代码
获取全部pygame事件。
  1. for event in event_list:
  2.         if event.type == pygame.QUIT:
  3.             print("游戏结束了")
  4.             pygame.quit()
  5.             exit(0)
复制代码
遍历事件列表,假如检测到QUIT事件(通常是用户关闭窗口),则打印游戏结束信息,卸载pygame模块,并退出程序。
  1. if event.type == pygame.KEYDOWN:
  2.             if event.key == pygame.K_LEFT:
  3.                 heroPlaneX = heroPlaneX-10 if heroPlaneX >= 5 else 0
  4.             elif event.key == pygame.K_RIGHT:
  5.                 heroPlaneX = heroPlaneX+10 if heroPlaneX <=370 else 380
  6.             elif event.key == pygame.K_UP:
  7.                 heroPlaneY = heroPlaneY-10 if heroPlaneY >=5 else 0
  8.             elif event.key == pygame.K_DOWN:
  9.                 heroPlaneY = heroPlaneY+20 if heroPlaneY <=521 else 526
  10.             elif event.key == pygame.K_SPACE:
  11.                 hero_bullet = HeroBullet(heroPlaneX+40+10, heroPlaneY-11,screen)
  12.                 hero_Bulletlist.append(hero_bullet)
复制代码
假如检测到KEYDOWN事件(键盘按键按下),则根据按下的键来移动战机或发射子弹。
  1.      for bullet in hero_Bulletlist:
  2.         bullet.draw()
  3.     # 定义战机子弹的rect
  4.         hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
  5.     # 检测敌机和子弹矩形是否相交
  6.         flag = hero_bullet_rect.colliderect(di_rect)
  7.         # 如果相交
  8.         if flag:
  9.             print("敌机爆炸")
  10.             is_bomb = True
  11.             hero_Bulletlist.remove(bullet)
  12. for bullet in hero_Bulletlist:
  13.         bullet.draw()
复制代码
遍历英雄战机的子弹列表,调用每个子弹的draw方法来绘制它们,并检测子弹是否与敌机碰撞。
  1. for bullet in hero_Bulletlist:
  2.         bullet.draw()
  3.     # 定义战机子弹的rect
  4.         hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
  5.     # 检测敌机和子弹矩形是否相交
  6.         flag = hero_bullet_rect.colliderect(di_rect)
  7.         # 如果相交
  8.         if flag:
  9.             print("敌机爆炸")
  10.             is_bomb = True
  11.             hero_Bulletlist.remove(bullet)
复制代码
假如敌机没有被击中(is_bomb为False),则绘制敌机。否则,播放敌机爆炸动画。
  1.   for bullet1 in di_Bulletlist:
  2.         bullet1.draw()
  3.         di_bullet_rect = pygame.rect.Rect(bullet1.x,bullet1.y,9,21)
  4.         flag = di_bullet_rect.colliderect(hero_rect)
  5.         if flag:
  6.             print("战机爆炸")
  7.             hero_bomb = True
  8.             di_Bulletlist.remove(bullet1)
复制代码
遍历敌机的子弹列表,调用每个子弹的draw方法来绘制它们,并检测子弹是否与英雄战机碰撞。
  1. if is_bomb == False:
  2.         #
  3.         screen.blit(di_img,(diPlaneX,diPlaneY))
  4.     else:
  5.         #
  6.         if di_bomb_index == len(di_bomb_list):
  7.             time.sleep(0.2)
  8.             exit(0)
  9.         di_bomb_img = pygame.image.load(di_bomb_list[di_bomb_index])
  10.         screen.blit(di_bomb_img,(diPlaneX,diPlaneY))
  11.         di_bomb_index += 1
  12.         time.sleep(0.2)
复制代码
假如英雄战机没有被击中(hero_bomb为False),则绘制战机。否则,播放战机爆炸动画。
7.游戏结束条件

  1. pygame.display.update()
复制代码
更新整个屏幕的显示,这是游戏循环的末了一部分。
总结分析:


1.游戏初始化:

1.1导入所需的模块:time, pygame, random。
1.2初始化游戏窗口,设置窗口大小为480x650像素。
1.3加载游戏图标和背景图片。
1.4加载英雄机和敌机的图片,并定义它们的矩形区域。
1.5设置键盘重复事件,以便在按下键时可以或许连续移动英雄机。

2.英雄机控制:

2.1英雄机在窗口中上下移动,并且当到达窗口底部时会重新出如今顶部。
2.2英雄机可以通过键盘的左右键来移动。
2.3按下空格键时,英雄机会发射子弹。

3.子弹和敌机:

3.1英雄机的子弹是一个单独的类 HeroBullet,它有绘制和移动子弹的方法。
3.2敌机也是一个单独的类 DiBullet,它有绘制和移动敌机子弹的方法。
3.3敌机子弹列表 enemy_Bulletlist 和英雄机子弹列表 hero_Bulletlist 用于存储全部子弹对象。

4.碰撞检测:

4.1使用 colliderect 函数来检测英雄子弹和敌机,以及敌机子弹和英雄机之间的碰撞。
4.2当发生碰撞时,相应的子弹会被移除,并且敌机或英雄机会触发爆炸结果。

5.爆炸结果:

5.1爆炸条件 is_bomb 和 hero_bomb 用于指示敌机和英雄机是否发生了爆炸。
5.2爆炸图片列表 enemy_bomb_list 和 hero_bomb_list 包罗了用于显示爆炸的图片。
5.3当爆炸条件为真时,会循环显示爆炸图片,直到图片索引到达列表的末尾,然后结束游戏或重新开始。

6.游戏循环:

6.1游戏循环不断运行,处置处罚事件、更新游戏状态、绘制图像,并更新窗口显示。
6.2循环中使用了 pygame.display.update() 来革新屏幕显示。

7.游戏结束:

7.1游戏中设置了退失事件,当用户关闭窗口或按下退出键时,游戏会打印“游戏结束了”,并退出程序。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4