|
|
|
|
import os
|
|
|
|
|
import time
|
|
|
|
|
import pygame
|
|
|
|
|
|
|
|
|
|
pygame.init()
|
|
|
|
|
|
|
|
|
|
# 设置游戏背景尺寸,所有的资源图片都是基于这个尺寸制作的,不建议修改
|
|
|
|
|
background_size = (820, 560)
|
|
|
|
|
|
|
|
|
|
# 创建游戏窗口并设置标题
|
|
|
|
|
screen = pygame.display.set_mode(background_size)
|
|
|
|
|
pygame.display.set_caption("植物大战僵尸")
|
|
|
|
|
|
|
|
|
|
# 获取当前工作目录
|
|
|
|
|
base_path = os.getcwd()
|
|
|
|
|
|
|
|
|
|
# 加载背景图片
|
|
|
|
|
bg_img_obj = pygame.image.load(os.path.join(base_path, 'images/a3.png')).convert_alpha()
|
|
|
|
|
|
|
|
|
|
# 加载植物图片
|
|
|
|
|
sunFlowerImg = pygame.image.load(os.path.join(base_path, 'images/SunFlower/SunFlower_00.png')).convert_alpha()
|
|
|
|
|
wallNutImg = pygame.image.load(os.path.join(base_path, 'images/WallNut/wall_nut_00.png')).convert_alpha()
|
|
|
|
|
peaShooterImg = pygame.image.load(os.path.join(base_path, 'images/Peashooter/Peashooter00.png')).convert_alpha()
|
|
|
|
|
jxcImg = pygame.image.load(os.path.join(base_path, 'images/jxc/JXC00.png')).convert_alpha()
|
|
|
|
|
|
|
|
|
|
# 加载阳光储蓄罐和种子图片
|
|
|
|
|
sun_back_img = pygame.image.load(os.path.join(base_path, 'images/SeedBank01.png')).convert_alpha()
|
|
|
|
|
sunflower_seed = pygame.image.load(os.path.join(base_path, 'images/SunFlower_kp.png'))
|
|
|
|
|
wall_nut_seed = pygame.image.load(os.path.join(base_path, 'images/Wallnut_kp.png'))
|
|
|
|
|
peashooter_seed = pygame.image.load(os.path.join(base_path, 'images/Peashooter_kp.png'))
|
|
|
|
|
jxc_seed = pygame.image.load(os.path.join(base_path, 'images/jxc_kp.png'))
|
|
|
|
|
|
|
|
|
|
# 初始化阳光值为100
|
|
|
|
|
text = "1000"
|
|
|
|
|
|
|
|
|
|
# 设置阳光值字体和颜色
|
|
|
|
|
sun_font = pygame.font.SysFont("黑体", 25)
|
|
|
|
|
sun_num_surface = sun_font.render(str(text), True, (0, 0, 0))
|
|
|
|
|
|
|
|
|
|
# 创建植物组、子弹组、僵尸组和阳光组
|
|
|
|
|
spriteGroup = pygame.sprite.Group()
|
|
|
|
|
bulletGroup = pygame.sprite.Group()
|
|
|
|
|
zombieGroup = pygame.sprite.Group()
|
|
|
|
|
sun_sprite = pygame.sprite.Group()
|
|
|
|
|
|
|
|
|
|
# 定义游戏时钟和特殊事件
|
|
|
|
|
clock = pygame.time.Clock()
|
|
|
|
|
GEN_SUN_EVENT = pygame.USEREVENT + 1 # 生成阳光事件
|
|
|
|
|
pygame.time.set_timer(GEN_SUN_EVENT, 2000) # 每2秒生成一次阳光
|
|
|
|
|
GEN_BULLET_EVENT = pygame.USEREVENT + 2 # 生成子弹事件
|
|
|
|
|
pygame.time.set_timer(GEN_BULLET_EVENT, 2000) # 每2秒生成一次子弹
|
|
|
|
|
GEN_ZOMBIE_EVENT = pygame.USEREVENT + 3 # 生成僵尸事件
|
|
|
|
|
pygame.time.set_timer(GEN_ZOMBIE_EVENT, 10000) # 每10秒生成一次僵尸
|
|
|
|
|
GEN_SUN2_EVENT = pygame.USEREVENT + 4 # 生成双倍阳光事件
|
|
|
|
|
pygame.time.set_timer(GEN_SUN2_EVENT, 20000) # 每20秒生成一次双倍阳光
|
|
|
|
|
|
|
|
|
|
# 初始化选择的植物类型和僵尸数量
|
|
|
|
|
choose = 0
|
|
|
|
|
zombie_num = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
"""
|
|
|
|
|
游戏主函数,包含游戏主循环
|
|
|
|
|
"""
|
|
|
|
|
global zombie_num # 僵尸数量全局变量
|
|
|
|
|
global choose # 选择的植物类型全局变量
|
|
|
|
|
global text # 阳光值全局变量
|
|
|
|
|
global sun_num_surface # 阳光值显示表面全局变量
|
|
|
|
|
running = True # 游戏是否运行标志
|
|
|
|
|
index = 0 # 用于植物、子弹和僵尸的更新和绘制的索引
|
|
|
|
|
|
|
|
|
|
while running:
|
|
|
|
|
# 控制游戏帧率
|
|
|
|
|
clock.tick(20)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 在屏幕上绘制背景、阳光储蓄罐、阳光值和种子图片
|
|
|
|
|
screen.blit(bg_img_obj, (0, 0))
|
|
|
|
|
screen.blit(sun_back_img, (20, 0.5))
|
|
|
|
|
screen.blit(sun_num_surface, (35, 50))
|
|
|
|
|
screen.blit(sunflower_seed, (80, 5))
|
|
|
|
|
screen.blit(peashooter_seed, (121, 5))
|
|
|
|
|
screen.blit(wall_nut_seed, (162, 5))
|
|
|
|
|
screen.blit(jxc_seed, (203, 5))
|
|
|
|
|
|
|
|
|
|
# 更新和绘制植物、子弹、僵尸和阳光
|
|
|
|
|
spriteGroup.update(index)
|
|
|
|
|
spriteGroup.draw(screen)
|
|
|
|
|
bulletGroup.update(index)
|
|
|
|
|
bulletGroup.draw(screen)
|
|
|
|
|
zombieGroup.update(index)
|
|
|
|
|
zombieGroup.draw(screen)
|
|
|
|
|
sun_sprite.update(index)
|
|
|
|
|
sun_sprite.draw(screen)
|
|
|
|
|
|
|
|
|
|
# 更新游戏界面
|
|
|
|
|
pygame.display.update()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|