当前位置:   article > 正文

飞机大战python代码_python飞机大战源代码

python飞机大战源代码

下面附有源代码,一个简单运用python的应用。

图片可自己自由调配 部分模块需要去从python的软件包去下载,可以去从清华和北大还有阿里的云仓库中获取镜像链接,下载速度会快点。

源代码如下并有详细注释:

  1. import pygame #导入pygame模块
  2. from pygame.locals import * #导入pygame.locals模块
  3. import time #导入time模块
  4. #子弹类
  5. class Bullet(object):
  6. def __init__(self, screen_temp, x, y): #构造方法 初始化子弹对象的属性
  7. self.x = x+40 #子弹起始X坐标
  8. self.y = y-20 #子弹起始Y坐标
  9. self.screen = screen_temp #窗口
  10. self.image = pygame.image.load("./images/bullet.png") #创建一个子弹图片
  11. def display(self): #显示子弹图片的方法
  12. self.screen.blit(self.image, (self.x, self.y)) #将创建的子弹图片按设定的坐标贴到窗口中
  13. def move(self): #子弹移动方法
  14. self.y-=10 #子弹Y坐标自减10
  15. def judge(self): #判断子弹是否越界的方法
  16. if self.y<0: #如果子弹的Y坐标小于0
  17. return True #返回true正确
  18. else:
  19. return False #返回false错误
  20. #飞机类
  21. class Aircraft_obj(object):
  22. def __init__(self, screen_temp): #构造方法 初始化飞机对象的属性
  23. self.x = 190 #飞起起始X坐标
  24. self.y = 708 #飞机起始Y坐标
  25. self.screen = screen_temp #窗口
  26. self.image = pygame.image.load("./images/hero1.png") #创建一个飞机图
  27. self.bullet_list = []#存储发射出去的子弹对象引用
  28. def display(self): #显示飞机图片的方法(这里包括了显示子弹的图片)
  29. self.screen.blit(self.image, (self.x, self.y)) #将创建的飞机图片按设定的坐标贴到窗口中
  30. #显示飞机发射的所有子弹
  31. for bullet in self.bullet_list:
  32. bullet.display() #显示子弹
  33. bullet.move() #移动子弹
  34. if bullet.judge():#判断子弹是否越界
  35. self.bullet_list.remove(bullet) #将子弹从bullet_list中删除
  36. def move_left(self): #飞机左移方法
  37. if self.x < 10: #X坐标小于10(移动距离)
  38. pass #不做任何事
  39. else:
  40. self.x -= 10 #X坐标自减少10
  41. def move_right(self): #飞机右移方法
  42. if self.x > 480-100-10: #X坐标大于(窗口宽度-飞机宽度-移动距离)的值
  43. pass #不做任何事
  44. else:
  45. self.x += 10 #坐标自增加10
  46. #存储发射子弹的方法
  47. def fire(self):
  48. self.bullet_list.append(Bullet(self.screen, self.x, self.y)) #将发射的子弹对象存储到bullet_list中
  49. #敌机类
  50. class EnemyPlane(object):
  51. def __init__(self, screen_temp): #构造方法 初始化敌机对象的属性
  52. self.x = 0 #敌机的起始X坐标
  53. self.y = 0 #敌机的起始Y坐标
  54. self.screen = screen_temp #窗口
  55. self.image = pygame.image.load("./images/enemy0.png") #创建一个敌机图片
  56. self.direction = "right" #用来存储飞机移动方向,默认向右移动
  57. #爆炸效果用的属性
  58. self.hit = False #表示是否要爆炸
  59. self.bomb_lists = [] #用来存储爆炸时需要的图片
  60. self.__crate_images() #调用这个方法向bomb_lists中添加图片
  61. self.image_num = 0#用来记录while循环的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,当这个次数再次达到时,再显示下一个爆炸效果的图片
  62. self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号
  63. def __crate_images(self): #将爆炸需要的图片添加到self.bomb_lists中
  64. self.bomb_lists.append(pygame.image.load("./images/enemy0_down1.png"))
  65. self.bomb_lists.append(pygame.image.load("./images/enemy0_down2.png"))
  66. self.bomb_lists.append(pygame.image.load("./images/enemy0_down3.png"))
  67. self.bomb_lists.append(pygame.image.load("./images/enemy0_down4.png"))
  68. #判断爆炸的方法,x1表示子弹最左侧的X坐标,x2表示子弹最右侧的X坐标,y表示子弹当前的Y坐标
  69. def blast(self,x1,x2,y):
  70. #判断子弹能命中敌机的三种情况,满足任意一种即可让敌机爆炸,51是敌机图片的宽度,39是敌机图片的高度
  71. #1.子弹横坐标在敌机横坐标的区域中,并且子弹Y坐标小于敌机图片的高度
  72. #2.子弹最右侧坐标等于敌机最左侧坐标,并且子弹Y坐标小于敌机图片的高度
  73. #3.子弹最左侧坐标等于敌机最右侧坐标,并且子弹Y坐标小于敌机图片的高度
  74. if ((x1>=self.x and x2<=self.x+51) or x2==self.x or x1==self.x+51) and y<39:
  75. self.hit = True
  76. def display(self): #显示敌机的方法
  77. #如果被击中,就显示爆炸效果,否则显示普通的飞机效果
  78. if self.hit == True: #如果满足爆炸条件,就显示爆炸的图片
  79. self.screen.blit(self.bomb_lists[self.image_index], (self.x, self.y))
  80. self.image_num+=1 #这是统计循环次数,为了使玩家看清爆炸效果
  81. if self.image_num == 7: #如果循环次数达到7次
  82. self.image_num=0 #将循环次数改为0次
  83. self.image_index+=1 #图片显示序号+1,换为另一张图
  84. if self.image_index>3: #这里爆炸图片一共是四张,所以是图片序号大于三次
  85. time.sleep(1) #暂停一秒
  86. exit() #调用exit让游戏退出
  87. else: #否则显示正常的敌机图片
  88. self.screen.blit(self.image,(self.x, self.y))
  89. def move(self): #敌机移动方法
  90. if self.hit == True:
  91. pass
  92. else:
  93. if self.direction=="right": #如果是向右移动
  94. self.x += 5 #X坐标自增加5
  95. elif self.direction=="left": #如果是向左移动
  96. self.x -= 5 #X坐标自减少5
  97. if self.x>480-50: #如果X坐标大于窗口减去敌机宽度的值
  98. self.direction = "left" #移动方向改为左
  99. elif self.x<0: #如果X坐标小于0
  100. self.direction = "right" #移动方向改为右
  101. #处理鼠标和键盘事件的方法
  102. def key_control(aircraft_temp):
  103. #获取当前等待处理的事件,使用for循环来遍历里面的事件
  104. for event in pygame.event.get():
  105. #判断是否点击了退出按钮
  106. if event.type == QUIT:
  107. print("exit") #输出“exit”
  108. exit() #退出窗口
  109. #判断是不是键盘按下事件
  110. elif event.type == KEYDOWN:
  111. #检测按键是不是a或者left
  112. if event.key == K_a or event.key == K_LEFT:
  113. print('left') #输出“left”
  114. aircraft_temp.move_left() #执行飞机左移方法
  115. #检测按键是不是d或者right
  116. elif event.key == K_d or event.key == K_RIGHT:
  117. print('right') #输出“right”
  118. aircraft_temp.move_right() #执行飞机右移方法
  119. #检测按键是不是空格键
  120. elif event.key == K_SPACE:
  121. print('space') #输出“space”
  122. aircraft_temp.fire() #执行飞机类中存储子弹的方法
  123. def main():
  124. #1. 创建窗口
  125. pygame.init()
  126. screen = pygame.display.set_mode((480,852),0,32)
  127. #2. 创建一个背景图片
  128. background = pygame.image.load("./images/background.png")
  129. #3. 创建一个飞机对象
  130. aircraft = Aircraft_obj(screen)
  131. #4. 创建一个敌机对象
  132. enemy = EnemyPlane(screen)
  133. while True:
  134. screen.blit(background, (0,0)) #把背景复制到窗口的0,0处开始贴进去
  135. aircraft.display() #执行飞机类中显示飞机的方法
  136. for bullet in aircraft.bullet_list: #循环飞机对象中存储的子弹信息
  137. x1 = bullet.x #子弹当前X坐标
  138. x2 = bullet.x + 22 #子弹当前X坐标+子弹图片的宽
  139. y1 = bullet.y #子弹当前Y坐标
  140. enemy.blast(x1,x2,y1) #判断子弹的坐标区域有没有与敌机相交
  141. enemy.display() #执行敌机类中显示敌机的方法
  142. enemy.move() #调用敌机的移动方法
  143. pygame.display.update() #更新需要显示的内容到窗口
  144. key_control(aircraft) #处理飞机对象的相关事件
  145. time.sleep(0.01) #暂停0.01秒
  146. main()

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

闽ICP备14008679号