来源:https://blog.csdn.net/Gtieguo
大家好,我是 面师兄。
今天给大家推荐一个 Python 的练手项目。
用 Python 写个植物大战僵尸!
直接开搞!
1. 引入需要的模块
import pygameimport random
2. 配置图片地址
3. 设置页面宽高
scrrr_width = 800scrrr_height = 560
4. 创建控制游戏结束的状态
5. 图片加载报错处理
LOG = '文件:{}中的方法:{}出错'.format(__file__, __name__)
6. 创建地图类
7. 存储两张不同颜色的图片名称
map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']
8. 初始化地图
def__init__(self, x, y, img_index):self.image = pygame.image.load(Map.map_names_list[img_index]) self.position = (x, y)
9. 是否能够种植
10. 加载地图
defload_map(self): MainGame.window.blit(self.image, self.position)
11. 植物类
classPlant(pygame.sprite.Sprite):def__init__(self):super(Plant, self).__init__() self.live = True
12. 加载图片
defload_image(self):if hasattr(self, 'image') and hasattr(self, 'rect'): MainGame.window.blit(self.image, self.rect)else: print(LOG)
13. 向日葵类
classSunflower(Plant):def__init__(self, x, y):super(Sunflower, self).__init__()self.image = pygame.image.load('imgs/sunflower.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 100 self.time_count = 0
14. 新增功能:生成阳光
defproduce_money(self):self.time_count += 1ifself.time_count == 25: MainGame.money += 5 self.time_count = 0
15. 向日葵加入到窗口中
defdisplay_sunflower(self): MainGame.window.blit(self.image, self.rect)
16. 豌豆射手类
classPeaShooter(Plant):def__init__(self, x, y):super(PeaShooter, self).__init__()self.image = pygame.image.load('imgs/peashooter.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 200 self.shot_count = 0
17. 增加射击方法
defshot(self): should_fire = Falsefor zombie in MainGame.zombie_list:if zombie.rect.y == self.rect.y and zombie.rect.x 800and zombie.rect.x > self.rect.x: should_fire = Trueifself.live andshould_fire:self.shot_count += 1ifself.shot_count == 25: peabullet = PeaBullet(self) MainGame.peabullet_list.append(peabullet) self.shot_count = 0
18. 将豌豆射手加入到窗口中的方法
defdisplay_peashooter(self): MainGame.window.blit(self.image, self.rect)
19. 豌豆子弹类
classPeaBullet(pygame.sprite.Sprite):def__init__(self, peashooter):self.live = Trueself.image = pygame.image.load('imgs/peabullet.png')self.damage = 50self.speed = 10self.rect = self.image.get_rect()self.rect.x = peashooter.rect.x + 60self.rect.y = peashooter.rect.y + 15
defmove_bullet(self):ifself.rect.x < scrrr_width:self.rect.x += self.speedelse:self.live = False
defhit_zombie(self):for zombie in MainGame.zombie_list:if pygame.sprite.collide_rect(self, zombie):self.live = False zombie.hp -= self.damageif zombie.hp <= 0: zombie.live = Falseself.nextLevel()
defnextLevel(self): MainGame.score += 20 MainGame.remnant_score -= 20for i in range(1, 100):if MainGame.score == 100 * i and MainGame.remnant_score == 0: MainGame.remnant_score = 100 * i MainGame.shaoguan += 1 MainGame.produce_zombie += 50
defdisplay_peabullet(self): MainGame.window.blit(self.image, self.rect)
20. 僵尸类
classZombie(pygame.sprite.Sprite):def__init__(self, x, y): super(Zombie, self).__init__() self.image = pygame.image.load('imgs/zombie.png') self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y
self.hp = 1000 self.damage = 2 self.speed = 1 self.live = True self.stop = False
defmove_zombie(self):if self.live andnot self.stop: self.rect.x -= self.speedif self.rect.x < -80: MainGame().gameOver()
defhit_plant(self):for plant in MainGame.plants_list:if pygame.sprite.collide_rect(self, plant): self.stop = True self.eat_plant(plant)
defeat_plant(self, plant): plant.hp -= self.damageif plant.hp <= 0: a = plant.rect.y // 80 - 1 b = plant.rect.x // 80 map = MainGame.map_list[a][b] map.can_grow = True plant.live = False self.stop = False
defdisplay_zombie(self): MainGame.window.blit(self.image, self.rect)
21. 主程序
classMainGame(): shaoguan = 1 score = 0 remnant_score = 100 money = 200 map_points_list = [] map_list = [] plants_list = [] peabullet_list = [] zombie_list = [] count_zombie = 0 produce_zombie = 100
definit_window(self): pygame.display.init() MainGame.window = pygame.display.set_mode([scrrr_width, scrrr_height])
defdraw_text(self, content, size, color): pygame.font.init() font = pygame.font.SysFont('kaiti', size) text = font.render(content, True, color)return text
defload_help_text(self): text1 = self.draw_text('1.按左键创建向日葵 2.按右键创建豌豆射手', 26, (255, 0, 0)) MainGame.window.blit(text1, (5, 5))
definit_plant_points(self):for y in range(1, 7): points = []for x in range(10): point = (x, y) points.append(point) MainGame.map_points_list.append(points) print("MainGame.map_points_list", MainGame.map_points_list)
definit_map(self):for points in MainGame.map_points_list: temp_map_list = list()for point in points:if (point[0] + point[1]) % 2
== 0: map = Map(point[0] * 80, point[1] * 80, 0)else: map = Map(point[0] * 80, point[1] * 80, 1) temp_map_list.append(map) print("temp_map_list", temp_map_list) MainGame.map_list.append(temp_map_list) print("MainGame.map_list", MainGame.map_list)
defload_map(self):for temp_map_list in MainGame.map_list:for map in temp_map_list: map.load_map()
defload_plants(self):for plant in MainGame.plants_list:if plant.live:if isinstance(plant, Sunflower): plant.display_sunflower() plant.produce_money()elif isinstance(plant, PeaShooter): plant.display_peashooter() plant.shot()else: MainGame.plants_list.remove(plant)
defload_peabullets(self):for b in MainGame.peabullet_list:if b.live: b.display_peabullet() b.move_bullet() b.hit_zombie()else: MainGame.peabullet_list.remove(b)
defdeal_events(self): eventList = pygame.event.get()for e in eventList:if e.type == pygame.QUIT: self.gameOver()elif e.type == pygame.MOUSEBUTTONDOWN: print(e.pos)
x = e.pos[0] // 80 y = e.pos[1] // 80 print(x, y) map = MainGame.map_list[y - 1][x] print(map.position)if e.button == 1:if map.can_grow and MainGame.money >= 50: sunflower = Sunflower(map.position[0], map.position[1]) MainGame.plants_list.append(sunflower) print('当前植物列表长度:{}'.format(len(MainGame.plants_list))) map.can_grow = False MainGame.money -= 50elif e.button == 3:if map.can_grow and MainGame.money >= 50: peashooter = PeaShooter( map.position[0], map.position[1]) MainGame.plants_list.append(peashooter) print('当前植物列表长度:{}'.format(len(MainGame.plants_list))) map.can_grow = False MainGame.money -= 50
definit_zombies(self):for i in range(1, 7): dis = random.randint(1, 5) * 200 zombie = Zombie(800 + dis, i *
80) MainGame.zombie_list.append(zombie)
defload_zombies(self):for zombie in MainGame.zombie_list:if zombie.live: zombie.display_zombie() zombie.move_zombie() zombie.hit_plant()else: MainGame.zombie_list.remove(zombie)
defstart_game(self): self.init_window() self.init_plant_points() self.init_map() self.init_zombies()whilenot GAMEOVER: MainGame.window.fill((255, 255, 255)) MainGame.window.blit( self.draw_text('当前钱数$: {}'.format( MainGame.money), 26, (255, 0, 0)), (500, 40)) MainGame.window.blit( self.draw_text('当前关数{},得分{},距离下关还差{}分'.format( MainGame.shaoguan, MainGame.score, MainGame.remnant_score),26, (255,0,0)), (5,40)) self.load_help_text()
self.load_map() self.load_plants() self.load_peabullets() self.deal_events() self.load_zombies() MainGame.count_zombie += 1if MainGame.count_zombie == MainGame.produce_zombie: self.init_zombies() MainGame.count_zombie = 0 pygame.time.wait(10) pygame.display.update()
defgameOver(self): MainGame.window.blit( self.draw_text('游戏结束', 50, (255, 0, 0)), (300, 200)) print('游戏结束') pygame.time.wait(400)global GAMEOVER GAMEOVER = True
if __name__ == '__main__': game = MainGame() game.start_game()
写完的效果就是这样啦

觉得不错的,记得三连哦~