教你用Python写一个植物大战僵尸小游戏
教你⽤Python写⼀个植物⼤战僵⼫⼩游戏⽬录
⼀、前⾔
⼆、引⼊模块
三、完整代码
四、主程序
五、效果演⽰
⼀、前⾔
上次写了⼀个俄罗斯⽅块,感觉好像⼤家都看懂了,这次就更新⼀个植物⼤战僵⼫吧
⼆、引⼊模块
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, )
else:
print(LOG)
向⽇葵类
class Sunflower(Plant):
def __init__(self, x, y):
super(Sunflower, self).__init__()
self.image = pygame.image.load('imgs/sunflower.png')
< = _rect()
< = x
< = y
self.price = 50
self.hp = 100
# 5 时间计数器
self.time_count = 0
新增功能:⽣成阳光
def produce_money(self):
self.time_count += 1
if self.time_count == 25:
< += 5
self.time_count = 0
向⽇葵加⼊到窗⼝中
def display_sunflower(self):
MainGame.window.blit(self.image, )
豌⾖射⼿类
class PeaShooter(Plant):
def __init__(self, x, y):
super(PeaShooter, self).__init__()
# self.image 为⼀个 surface
self.image = pygame.image.load('imgs/peashooter.png')
< = _rect()
< = x
< = y
self.price = 50
self.hp = 200
# 6 发射计数器
self.shot_count = 0
增加射击⽅法
def shot(self):
# 6 记录是否应该射击
should_fire = False
for zombie bie_list:
== < 800 > :            should_fire = True
# 6 如果活着
if self.live and should_fire:
self.shot_count += 1
# 6 计数器到25发射⼀次
if self.shot_count == 25:
# 6 基于当前豌⾖射⼿的位置,创建⼦弹
peabullet = PeaBullet(self)
# 6 将⼦弹存储到⼦弹列表中
MainGame.peabullet_list.append(peabullet)
self.shot_count = 0
将豌⾖射⼿加⼊到窗⼝中的⽅法
def display_peashooter(self):
MainGame.window.blit(self.image, )
豌⾖⼦弹类
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
< = _rect()
< = + 60
< = + 15
def move_bullet(self):
# 7 在屏幕范围内,实现往右移动
< scrrr_width:
< += self.speed
else:
self.live = False
# 7 新增,⼦弹与僵⼫的碰撞
def hit_zombie(self):
for zombie bie_list:
if llide_rect(self, zombie):
# 打中僵⼫之后,修改⼦弹的状态,
self.live = False
# 僵⼫掉⾎
zombie.hp -= self.damage
if zombie.hp <= 0:
zombie.live = False
# 7闯关⽅法
def nextLevel(self):
MainGame.score += 20
for i in range(1, 100):
if MainGame.score == 100 * i ant_score == 0:                ant_score = 100 * i
MainGame.shaoguan += 1
MainGame.produce_zombie += 50
def display_peabullet(self):
MainGame.window.blit(self.image, )
僵⼫类
class Zombie(pygame.sprite.Sprite):
def __init__(self, x, y):
super(Zombie, self).__init__()
self.image = pygame.image.load('imgs/zombie.png')
< = _rect()
< = x
< = y
self.hp = 1000
self.damage = 2
self.speed = 1
self.live = True
self.stop = False
# 9 僵⼫的移动
def move_zombie(self):
if self.live and not self.stop:
< -= self.speed
< -80:
# 8 调⽤游戏结束⽅法
MainGame().gameOver()
# 9 判断僵⼫是否碰撞到植物,如果碰撞,调⽤攻击植物的⽅法
def hit_plant(self):
for plant in MainGame.plants_list:
if llide_rect(self, plant):
# 8  僵⼫移动状态的修改
self.stop = True
self.eat_plant(plant)
# 9 僵⼫攻击植物
def eat_plant(self, plant):
# 9 植物⽣命值减少
plant.hp -= self.damage
# 9 植物死亡后的状态修改,以及地图状态的修改
if plant.hp <= 0:
a = // 80 - 1
b = // 80
map = MainGame.map_list[a][b]
map.can_grow = True
plant.live = False
# 8 修改僵⼫的移动状态
self.stop = False
# 9 将僵⼫加载到地图中
def display_zombie(self):
MainGame.window.blit(self.image, )
四、主程序
class MainGame():
# 2 创建关数,得分,剩余分数,钱数
shaoguan = 1
score = 0
remnant_score = 100
money = 200
# 3 存储所有地图坐标点
map_points_list = []
# 3 存储所有的地图块
map_list = []
# 4 存储所有植物的列表
plants_list = []
# 7 存储所有豌⾖⼦弹的列表
peabullet_list = []
# 9 新增存储所有僵⼫的列表
zombie_list = []
count_zombie = 0
produce_zombie = 100
# 1 加载游戏窗⼝
def init_window(self):
# 1 调⽤显⽰模块的初始化
pygame.display.init()
# 1 创建窗⼝
MainGame.window = pygame.display.set_mode([scrrr_width, scrrr_height])
# 2 ⽂本绘制
def draw_text(self, content, size, color):
pygame.font.init()
喝酒后吃什么好font = pygame.font.SysFont('kaiti', size)
text = der(content, True, color)
return text
# 2 加载帮助提⽰
def load_help_text(self):
text1 = self.draw_text('1.按左键创建向⽇葵 2.按右键创建豌⾖射⼿', 26, (255, 0, 0))        MainGame.window.blit(text1, (5, 5))
# 3 初始化坐标点
def init_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)
# 3 初始化地图
def init_map(self):
for points in MainGame.map_points_list:
temp_map_list = list()
for point in points:
# map = None
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)
# 3 将地图加载到窗⼝中
def load_map(self):
for temp_map_list in MainGame.map_list:
for map in temp_map_list:
map.load_map()
# 6 增加豌⾖射⼿发射处理
def load_plants(self):
for plant in MainGame.plants_list:
# 6 优化加载植物的处理逻辑
if plant.live:
if isinstance(plant, Sunflower):
plant.display_sunflower()
plant.produce_money()
elif isinstance(plant, PeaShooter):
plant.display_peashooter()
plant.shot()
else:
MainGame.ve(plant)
# 7 加载所有⼦弹的⽅法
def load_peabullets(self):
for b in MainGame.peabullet_list:
if b.live:
b.display_peabullet()
# v1.9 调⽤⼦弹是否打中僵⼫的⽅法
b.hit_zombie()
else:
MainGame.ve(b)
# 8事件处理
def deal_events(self):
# 8 获取所有事件
eventList = ()
# 8 遍历事件列表,判断
for e in eventList:
pe == pygame.QUIT:
self.gameOver()
pe == pygame.MOUSEBUTTONDOWN:
去痘产品
# print('按下⿏标按键')舒高老公
print(e.pos)中通快递客服
# print(e.button)#左键1  按下滚轮2 上转滚轮为4 下转滚轮为5  右键 3                x = e.pos[0] // 80
y = e.pos[1] // 80
print(x, y)
map = MainGame.map_list[y - 1][x]
print(map.position)
# 8 增加创建时候的地图装填判断以及⾦钱判断
if e.button == 1:
if map.can_grow >= 50:
sunflower = Sunflower(map.position[0], map.position[1])
MainGame.plants_list.append(sunflower)
print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))                        map.can_grow = False
< -= 50
elif e.button == 3:
if map.can_grow >= 50:
peashooter = PeaShooter(
map.position[0], map.position[1])
MainGame.plants_list.append(peashooter)
print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))                        map.can_grow = False
< -= 50
# 9 新增初始化僵⼫的⽅法
def init_zombies(self):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。