《植物大战僵尸》是一款极富策略性的小游戏,可怕的僵尸即将入侵,唯一的防御方式就是栽种植物。此游戏集成了即时战略、塔防御战和卡片收集等要素、游戏的内容就是:玩家控制植物,抵御僵尸的进攻,保护这片草坪。
那么咱们今天自己来整一个植物大战僵尸小游戏!
想学Python的小伙伴可以关注小编的Python源码、问题解答&学习交流群:733089476
有很多的资源可以白嫖的哈,需要源码的小伙伴可以在+君羊领取
Python版本:3.7.8
安装Python并添加到环境变量,pip安装需要的相关模块即可。
引入需要的模块
import pygame
import random
配置图片地址
IMAGE_PATH = 'imgs/'
设置页面宽高
scrrr_width=800
scrrr_height =560
创建控制游戏结束的状态
GAMEOVER = False
图片加载报错处理
LOG = '文件:{}中的方法:{}出错'.format(__file__,__name__)
创建地图类
class Map():
# 存储两张不同颜色的图片名称
map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']
# 初始化地图
def __init__(self, x, y, img_index):
self.image = pygame.image.load(Map.map_names_list[img_index])
self.position = (x, y)
# 是否能够种植
self.can_grow = True
# 加载地图
def load_map(self):
MainGame.window.blit(self.image,self.position)
植物类
class Plant(pygame.sprite.Sprite):
def __init__(self):
super(Plant, self).__init__()
self.live=True
# 加载图片
def load_image(self):
if hasattr(self, 'image') and hasattr(self, 'rect'):
MainGame.window.blit(self.image, self.rect)
else:
print(LOG)
向日葵类
class Sunflower(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 = x
self.rect.y = y
self.price = 50
self.hp = 100
# 时间计数器
self.time_count = 0
# 新增功能:生成阳光
def produce_money(self):
self.time_count += 1
if self.time_count == 25:
MainGame.money += 5
self.time_count = 0
# 向日葵加入到窗口中
def display_sunflower(self):
MainGame.window.blit(self.image,self.rect)
豌豆射手类
class PeaShooter(Plant):
def __init__(self,x,y):
super(PeaShooter, self).__init__()
# self.image 为一个 surface
self.image = pygame.image.load('imgs/peashooter.png')
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.price = 50
self.hp = 200
# 发射计数器
self.shot_count = 0
# 增加射击方法
def shot(self):
# 记录是否应该射击
should_fire = False
for zombie in MainGame.zombie_list:
if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x:
should_fire = True
# 如果活着
if self.live and should_fire:
self.shot_count += 1
# 计数器到25发射一次
if self.shot_count == 25:
# 基于当前豌豆射手的位置,创建子弹
peabullet = PeaBullet(self)
# 将子弹存储到子弹列表中
MainGame.peabullet_list.append(peabullet)
self.shot_count = 0
# 将豌豆射手加入到窗口中的方法
def display_peashooter(self):
MainGame.window.blit(self.image,self.rect)
豌豆子弹类
class PeaBullet(pygame.sprite.Sprite):
def __init__(self,peashooter):
self.live = True
self.image = pygame.image.load('imgs/peabullet.png')
self.damage = 50
self.speed = 10
self.rect = self.image.get_rect()
self.rect.x = peashooter.rect.x + 60
self.rect.y = peashooter.rect.y + 15
def move_bullet(self):
# 在屏幕范围内,实现往右移动
if self.rect.x < scrrr_width:
self.rect.x += self.speed
else:
self.live = False
# 新增,子弹与僵尸的碰撞
def hit_zombie(self):
for zombie in MainGame.zombie_list:
if pygame.sprite.collide_rect(self,zombie):
#打中僵尸之后,修改子弹的状态,
self.live = False
#僵尸掉血
zombie.hp -= self.damage
if zombie.hp <= 0:
zombie.live = False
self.nextLevel()
僵尸类
class Zombie(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
# 僵尸的移动
def move_zombie(self):
if self.live and not self.stop:
self.rect.x -= self.speed
if self.rect.x < -80:
#8 调用游戏结束方法
MainGame().gameOver()
# 判断僵尸是否碰撞到植物,如果碰撞,调用攻击植物的方法
def hit_plant(self):
for plant in MainGame.plants_list:
if pygame.sprite.collide_rect(self,plant):
# 僵尸移动状态的修改
self.stop = True
self.eat_plant(plant)
代码可能有点长,就不全部展示出来啦
需要源码的小伙伴可以+扣君羊