当前位置:   article > 正文

速看!!!用植物大战僵尸游戏学习python面向对象_植物大战僵尸python

植物大战僵尸python

1:定义一个游戏管理类,先创建一个窗体 self.screen = pygame.display.set_mode((1400,600))。里面是个元组
2.设置题目:pygame.display.set_caption("植物大战僵尸")
3.定义 while True 保证循环不结束
4.最后记得添加实例。有类就要有实例
5.运行出来窗体之后,定义一个背景布
6.将背景布赋给窗体(图形,位置) self.screen.blit(self.bg_surface,(0,0))
7.绘制出来
8.定义一个精灵类
9.显示对话,定义一个动画组
10.写一个射手类
11.多个射手,定义射手组
12.将射手组绘制到屏幕,调用updata
13.定义射手1,将射手添加到射手组
14.有射手之后,对射手的帧频进行修改 self. clock = pygame.time.Clock() self.clock.tick(10)
15.定义一个计时器发射子弹
16.定义一个子弹群
17.定义一个子弹精灵类将子弹动起来
18.定义一个僵尸类,以动画移动类作为父类
19.将僵尸类draw到屏幕上
20.将子弹和僵尸碰撞

  1. import sys
  2. import pygame
  3. # 8.定义一个精灵类
  4. class BaseSprite(pygame.sprite.Sprite):
  5. def __init__(self,name):
  6. super().__init__()
  7. self.image = pygame.image.load(name)
  8. self.rect = self.image.get_rect()
  9. # 9.显示动画,定义一个动画组
  10. class AnimateSprite(BaseSprite):
  11. def __init__(self,default_name ,names):
  12. super().__init__(default_name)
  13. # 写动起来
  14. self.images = [pygame.image.load(name) for name in names] # 列表推导式
  15. self.current = 0
  16. def update(self):
  17. self.current += 1
  18. if self.current == len(self.images) * 2:
  19. self.current = 0
  20. self.image = self.images[self.current//2] ##
  21. # 10.写一个射手类
  22. class PeaShooter(AnimateSprite):
  23. def __init__(self,default_name,names,center,gm):
  24. super().__init__(default_name,names)
  25. self.rect.center = center
  26. self.time_count = 2
  27. self.gm =gm
  28. # 16.定义一个子弹群
  29. self.bullet_group = pygame.sprite.Group()
  30. print("当前子弹个数",len(self.bullet_group.sprites()))
  31. # 15.定义一个计时器发射子弹
  32. def update(self):
  33. super().update()
  34. self.time_count -= 0.1
  35. if self.time_count <= 0:
  36. self.time_count = 2
  37. # 将豌豆子弹加入子弹组
  38. BulletSprite("bullet.png",(self.rect.right,self.rect.top + 15)).add(self.bullet_group)
  39. # 子弹群绘制,更新
  40. self.bullet_group.draw(self.gm.screen)
  41. self.bullet_group.update()
  42. # 18.定义一个僵尸类,以动画移动类作为父类
  43. class Enemy(AnimateSprite):
  44. def __init__(self,default_name,names,center,gm):
  45. super().__init__(default_name,names)
  46. self.rect.center = center
  47. self.time_count = 2
  48. self.gm =gm
  49. def update(self):
  50. super().update()
  51. self.rect.left -= 10
  52. class BulletSprite(BaseSprite):
  53. def __init__(self,name,center):
  54. super().__init__(name)
  55. self.rect.center = center
  56. def update(self):
  57. self.rect.left += 10
  58. if self.rect.left > 1400:
  59. self.kill()
  60. class GameManage:
  61. def __init__(self):
  62. self.screen = pygame.display.set_mode((1400,600))# 1:定义一个游戏管理类,先创建一个窗体 self.screen = pygame.display.set_mode((1400,600))。里面是个元组
  63. pygame.display.set_caption("植物大战僵尸")# 2.设置题目:pygame.display.set_caption("植物大战僵尸")
  64. # 14.对射手的帧频进行修改
  65. self. clock = pygame.time.Clock()
  66. self.bg_surface = pygame.image.load("background1.jpg")# 5.运行出来窗体之后,定义一个背景布
  67. # 11.多个射手,定义射手组
  68. self.pea_shooter_group = pygame.sprite.Group()
  69. # 13.定义射手1射手2
  70. self.pea1 = PeaShooter("plants/peashooter/idle/idle_00.png",
  71. [f"plants/peashooter/idle/idle_0{i}.png" for i in range(8)],(300,300),self )
  72. self.pea2 = PeaShooter("plants/peashooter/idle/idle_00.png",
  73. [f"plants/peashooter/idle/idle_0{i}.png" for i in range(8)], (300, 200), self)
  74. # 13.定义射手1射手2,将射手添加到射手组
  75. self.pea1.add(self.pea_shooter_group)
  76. self.pea2.add(self.pea_shooter_group)
  77. # 定义僵尸组
  78. self.enemy_group = pygame.sprite.Group()
  79. # # 18.定义一个僵尸类,以动画移动类作为父类
  80. images = [f"zombies/run/run_0{i}.png" for i in range(10)]
  81. for i in range(10,31):
  82. images.append(f"zombies/run/run_{i}.png")
  83. self.enemy1 = Enemy("zombies/run/run_00.png",images,(1200,300),self)
  84. self.enemy1.add(self.enemy_group)
  85. self.enemy2 = Enemy("zombies/run/run_00.png", images, (1200, 200), self)
  86. self.enemy2.add(self.enemy_group)
  87. self.enemy3 = Enemy("zombies/run/run_00.png", images, (1200, 500), self)
  88. self.enemy3.add(self.enemy_group)
  89. self.enemy4 = Enemy("zombies/run/run_00.png", images, (1100, 400), self)
  90. self.enemy4.add(self.enemy_group)
  91. def run(self):
  92. # 3.定义 while True 保证循环不结束
  93. while True:
  94. # 14对射手的帧频进行修改
  95. self.clock.tick(20)
  96. for event in pygame.event.get():
  97. if event.type == pygame.QUIT:
  98. pygame.quit()
  99. sys.exit()
  100. self.screen.blit(self.bg_surface, (0, 0)) # 6.将背景布赋给窗体(图形,位置)
  101. # 12.将射手组绘制到屏幕,调用updata
  102. self.pea_shooter_group.draw(self.screen)
  103. self.pea_shooter_group.update()
  104. # 19.将僵尸类draw到屏幕上
  105. self.enemy_group.draw(self.screen)
  106. self.enemy_group.update()
  107. # 20.将子弹和僵尸碰撞
  108. for pea_sprite in self.pea_shooter_group:
  109. if pygame.sprite.groupcollide(pea_sprite.bullet_group,self.enemy_group,True,True):
  110. print("打死了")
  111. pygame.display.flip() # 7.绘制出来
  112. # 4.最后记得添加实例。有类就要有实例
  113. gm = GameManage()
  114. gm.run()

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/413805
推荐阅读
相关标签
  

闽ICP备14008679号