经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
面向对象学习之pygame坦克大战
来源:jb51  时间:2019/9/11 9:23:57  对本文有异议

经过一天多的奋战,查阅文献,参考别人的代码等等,完成了第一个面向对象的小项目,也深深体会到面向对象编程思想在游戏编程中所扮演的角色。

附上代码,参考了别人的代码,以及对他们代码的完善,又加上了自己的一些东西,收获颇深。

  1. import pygame
  2. import sys
  3. import time
  4. from pygame.locals import *
  5. from random import randint
  6. MOVE_SLEEP = 0.01
  7. class MyTank:
  8. width = 600
  9. heights = 500
  10. speed = 10
  11. screen = 0
  12. myshells = []
  13. enemylist = []
  14. enemyshells = []
  15. grade = 0
  16. life = 3
  17. cnt = 0
  18. def startgame(self):
  19. pygame.init()
  20. self.screen = pygame.display.set_mode((self.width,self.heights),0,32)
  21. pygame.display.set_caption("bit tank")
  22. self.tank = Tank(self.screen,275,450)
  23. for i in range(6):
  24. self.enemylist.append(EnmeyTank(self.screen))
  25. while True:
  26. key = pygame.key.get_pressed()
  27. self.screen.fill((0,0,0))
  28. if key[K_LEFT]:
  29. self.tank.move('L')
  30. elif key[K_RIGHT]:
  31. self.tank.move('R')
  32. elif key[K_UP]:
  33. self.tank.move('U')
  34. elif key[K_DOWN]:
  35. self.tank.move('D')
  36. self.get_event()
  37. for shell in self.myshells:
  38. if shell.move() == True:
  39. self.myshells.remove(shell)
  40. shell.display()
  41. a = shell.hitTank()
  42. #子弹碰撞
  43. if a == True:
  44. if self.life >0:
  45. self.myshells.remove(shell)
  46. self.grade += 1
  47. #mytank碰撞
  48. if self.tank.live == True:
  49. if self.tank.hitTank():
  50. self.life -= 1
  51. if self.life <=0:
  52. self.tank.live =False
  53. else:self.tank = Tank(self.screen,275,450)
  54. #mytanke 碰撞子弹
  55. if self.tank.live == True:
  56. if self.tank.hitShell():
  57. self.life -= 1
  58. if self.life <=0:
  59. self.tank.live = False
  60. else:self.tank=Tank(self.screen,275,450)
  61. #敌方子弹击中我方坦克
  62. # 游戏结束
  63. if self.life <=0:
  64. self.gotGamePrint()
  65. for enemy in self.enemylist:
  66. enemy.move()
  67. print('move')
  68. enemy.display()
  69. # 添加敌方子弹
  70. self.cnt += 1
  71. if self.cnt % 100 ==0:
  72. for enemy in self.enemylist:
  73. self.enemyshells.append(enemy.fire())
  74. #判断敌方子弹碰撞
  75. for enemyshell in self.enemyshells:
  76. f = enemyshell.move()
  77. enemyshell.display()
  78. if f:
  79. self.enemyshells.remove(enemyshell)
  80. if len(self.enemylist)<6:
  81. self.enemylist.append(EnmeyTank(self.screen))
  82. self.screen.blit(self.getGrade(),(5,5))
  83. self.tank.display()
  84. pygame.display.update()
  85. time.sleep(0.02)
  86. def get_event(self):
  87. for event in pygame.event.get():
  88. if event.type == KEYDOWN:
  89. if event.key == K_SPACE:
  90. self.myshells.append(self.tank.fire())
  91. if event.key == K_ESCAPE:
  92. pass
  93. def getGrade(self):
  94. text = pygame.font.Font('./font/msyhbd.ttc',20).render("分数:{} 生命:{}".format(self.grade,self.life),True,(0,255,0))
  95. return text
  96. def gotGamePrint(self):
  97. text = pygame.font.Font('./font/msyh.ttc',70).render('game over!',True,(0,255,0))
  98. self.screen.blit(text,(100,200))
  99. class Shell:
  100. width = 48
  101. height = 48
  102. live = True
  103. speed = 3
  104. def __init__(self,screen,tank):
  105. self.screen = screen
  106. self.image = pygame.image.load('./images/3.png')
  107. self.direction = tank.direction
  108. self.rect = self.image.get_rect()
  109. self.rect.left = tank.rect.left + (tank.width-self.width)/2.0+18
  110. # print(tank.rect.left,tank.width,self.width)
  111. self.rect.top = tank.rect.top + (tank.height - self.height)/2.0
  112. self.live = True
  113. def move(self):
  114. tag = self.isObstacle()
  115. if self.live == True:
  116. if self.direction == 'L' and self.direction not in tag:
  117. self.rect.left -= self.speed
  118. elif self.direction == 'R' and self.direction not in tag:
  119. self.rect.left += self.speed
  120. elif self.direction == 'U' and self.direction not in tag:
  121. self.rect.top -= self.speed
  122. elif self.direction == 'D' and self.direction not in tag:
  123. self.rect.top += self.speed
  124. else:
  125. pass
  126. if self.direction in tag:
  127. return True
  128. else:
  129. return False
  130. else:
  131. pass
  132. def display(self):
  133. # print(self.rect.left,self.rect.top)
  134. if self.live == True:
  135. self.screen.blit(self.image,self.rect)
  136. def isObstacle(self):
  137. tag = []
  138. if self.rect.left <=0:tag.append('L')
  139. if self.rect.left + self.width >= MyTank.width:tag.append('R')
  140. if self.rect.top <=0:tag.append('U')
  141. if self.rect.top + self.height >=MyTank.heights:tag.append('D')
  142. return tag
  143. def hitTank(self):
  144. hitList = pygame.sprite.spritecollide(self,MyTank.enemylist,False)
  145. for e in hitList:
  146. e.live = False
  147. MyTank.enemylist.remove(e)
  148. self.live = False
  149. return True
  150. return False
  151. def hitMytank(self):
  152. hitList = pygame.sprite.spritecollide(self,MyTank.tank,False)
  153. for e in hitList:
  154. e.live = False
  155. MyTank.life -= 1
  156. return True
  157. class BaseTank:
  158. width = 50
  159. height = 50
  160. direction = 'U'
  161. live = True
  162. time = 0
  163. images = {}
  164. def __init__(self,screen,left,top):
  165. self.screen = screen
  166. self.images['L'] = pygame.image.load("images/04.jpg")
  167. self.images['R'] = pygame.image.load("images/02.jpg")
  168. self.images['U'] = pygame.image.load("images/01.jpg")
  169. self.images['D'] = pygame.image.load("images/03.jpg")
  170. self.image = self.images[self.direction]
  171. self.rect = self.image.get_rect()
  172. self.rect.left = left
  173. self.rect.top = top
  174. self.live = True # 坦克是否被消灭
  175. def isObstacle(self):
  176. tag = []
  177. if self.rect.left <= 0: tag.append('L')
  178. if self.rect.left + self.width >= MyTank.width: tag.append('R')
  179. if self.rect.top <= 0: tag.append('U')
  180. if self.rect.top + self.height >= MyTank.heights: tag.append('D')
  181. return tag
  182. def display(self):
  183. if self.live == True:
  184. self.image = self.images[self.direction]
  185. self.screen.blit(self.image, self.rect)
  186. def fire(self):
  187. m = Shell(self.screen,self)
  188. return m
  189. class Tank(BaseTank):
  190. images = {}
  191. def __init__(self,screen,left,top):
  192. super().__init__(screen,275,450)
  193. self.screen = screen
  194. self.speed = 2
  195. self.images['L'] = pygame.image.load('./images/4.jpg')
  196. self.images['R'] = pygame.image.load('./images/2.jpg')
  197. self.images['U'] = pygame.image.load('./images/1.jpg')
  198. self.images['D'] = pygame.image.load('./images/3.jpg')
  199. self.image = self.images[self.direction]
  200. self.rect = self.image.get_rect()
  201. self.rect.top = top
  202. self.rect.left = left
  203. def move(self, direction):
  204. if self.live == True:
  205. tag = self.isObstacle()
  206. if direction == self.direction:
  207. if self.direction == 'L' and self.direction not in tag:
  208. self.rect.left -= self.speed
  209. elif self.direction == 'R' and self.direction not in tag:
  210. self.rect.left += self.speed
  211. elif self.direction == 'U' and self.direction not in tag:
  212. self.rect.top -= self.speed
  213. elif self.direction == 'D' and self.direction not in tag:
  214. self.rect.top += self.speed
  215. else:
  216. pass
  217. else:
  218. self.direction = direction
  219. def hitTank(self):
  220. hitList = pygame.sprite.spritecollide(self,MyTank.enemylist,False)
  221. for e in hitList:
  222. self.live = False
  223. return True
  224. return False
  225. def hitShell(self):
  226. hitlist = pygame.sprite.spritecollide(self, MyTank.enemyshells, False)
  227. for e in hitlist:
  228. self.live = False
  229. return True
  230. return False
  231. class EnmeyTank(BaseTank):
  232. speed = 1
  233. def __init__(self,screen):
  234. super().__init__(screen,randint(1,5)*100,0)
  235. self.getdirection()
  236. self.step = 0
  237. def getdirection(self):
  238. self.direction = ['L','R','U','D'][randint(0,3)]
  239. def move(self):
  240. if self.live == True:
  241. if self.step == 0 or (self.direction in self.isObstacle()):
  242. self.getdirection()
  243. self.step = randint(0, 200)
  244. else:
  245. tag = self.isObstacle()
  246. if self.direction == 'L' and self.direction not in tag:
  247. self.rect.left -= self.speed
  248. elif self.direction == 'R' and self.direction not in tag:
  249. self.rect.left += self.speed
  250. elif self.direction == 'U' and self.direction not in tag:
  251. self.rect.top -= self.speed
  252. elif self.direction == 'D' and self.direction not in tag:
  253. self.rect.top += self.speed
  254. else:
  255. pass
  256. self.step -= 1
  257. if __name__ == '__main__':
  258. main = MyTank()
  259. main.startgame()

文件主要有10张图片和2个字体文件,主坦克的四个形态,敌方坦克的四个形态,以及子弹等,10张图片。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号