从零开始玩python--python版植物大战僵尸来袭

发布于:2025-04-06 ⋅ 阅读:(19) ⋅ 点赞:(0)

大家好呀,小伙伴们!今天要给大家介绍一个超有趣的Python项目 - 用pygame制作植物大战僵尸游戏的进阶版本。相信不少小伙伴都玩过这款经典游戏,今天我们就用Python来实现它,让编程学习变得更加有趣!🌟
 

一、环境准备

首先需要安装pygame库,它是Python中非常强大的游戏开发库。打开终端输入以下命令:

pip install pygame

小贴士:建议使用Python 3.6及以上版本,确保兼容性更好哦!

二、基础架构搭建

让我们先来搭建游戏的基本框架:

import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 设置游戏窗口
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('植物大战僵尸 - Python版')

# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)

# 创建游戏时钟
clock = pygame.time.Clock()

# 基础游戏类
class GameObject:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.rect = pygame.Rect(x, y, 40, 40)  # 默认大小为40x40

    def draw(self, surface):
        pygame.draw.rect(surface, GREEN, self.rect)

三、核心gameplay实现

接下来实现游戏的核心玩法:

# 植物类
class Plant(GameObject):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.health = 100
        self.attack_power = 20
        self.shoot_cooldown = 60  # 发射冷却时间
        self.cooldown_counter = 0

    def shoot(self):
        if self.cooldown_counter <= 0:
            self.cooldown_counter = self.shoot_cooldown
            return Projectile(self.x + 40, self.y + 20)
        return None

    def update(self):
        if self.cooldown_counter > 0:
            self.cooldown_counter -= 1

# 僵尸类
class Zombie(GameObject):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.health = 100
        self.speed = 1
        self.damage = 10

    def move(self):
        self.x -= self.speed
        self.rect.x = self.x

    def is_alive(self):
        return self.health > 0

# 子弹类
class Projectile(GameObject):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.speed = 5
        self.damage = 20
        self.rect = pygame.Rect(x, y, 10, 10)

    def move(self):
        self.x += self.speed
        self.rect.x = self.x

四、游戏主循环

现在来实现游戏的主循环逻辑:

def main():
    plants = []
    zombies = []
    projectiles = []
    score = 0

    # 游戏主循环
    running = True
    while running:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.MOUSEBUTTONDOWN:
                # 点击放置植物
                x, y = pygame.mouse.get_pos()
                plants.append(Plant(x - 20, y - 20))

        # 随机生成僵尸
        if random.randint(0, 100) < 2:  # 2%的概率生成僵尸
            zombies.append(Zombie(WINDOW_WIDTH, random.randint(100, WINDOW_HEIGHT - 100)))

        # 更新游戏状态
        screen.fill(WHITE)

        # 更新植物
        for plant in plants:
            plant.update()
            plant.draw(screen)
            projectile = plant.shoot()
            if projectile:
                projectiles.append(projectile)

        # 更新僵尸
        for zombie in zombies[:]:
            zombie.move()
            zombie.draw(screen)

            # 检查僵尸是否到达最左边
            if zombie.x < 0:
                running = False
                break

        # 更新子弹
        for projectile in projectiles[:]:
            projectile.move()
            projectile.draw(screen)

            # 检查子弹碰撞
            for zombie in zombies[:]:
                if projectile.rect.colliderect(zombie.rect):
                    zombie.health -= projectile.damage
                    projectiles.remove(projectile)
                    if not zombie.is_alive():
                        zombies.remove(zombie)
                        score += 100
                    break

            # 移除超出屏幕的子弹
            if projectile.x > WINDOW_WIDTH:
                projectiles.remove(projectile)

        # 显示分数
        font = pygame.font.Font(None, 36)
        score_text = font.render(f'Score: {score}', True, (0, 0, 0))
        screen.blit(score_text, (10, 10))

        pygame.display.flip()
        clock.tick(60)

    pygame.quit()
    sys.exit()

if __name__ == '__main__':
    main()

五、游戏优化与扩展

让我们来给游戏添加一些有趣的功能:

  1. 多种植物类型:
class SunFlower(Plant):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.sun_production_rate = 25
        self.sun_cooldown = 300

    def produce_sun(self):
        if self.cooldown_counter <= 0:
            self.cooldown_counter = self.sun_cooldown
            return True
        return False

class PeaShooter(Plant):
    def __init__(self, x, y):
        super().__init__(x, y)
        self.attack_power = 20
        self.shoot_cooldown = 60

小贴士:可以根据需要继续添加更多植物类型,比如坚果墙、寒冰射手等!

实际应用案例:

  1. 游戏存档功能:
import json

def save_game(score, plants, zombies):
    game_state = {
        'score': score,
        'plants': [(p.x, p.y) for p in plants],
        'zombies': [(z.x, z.y, z.health) for z in zombies]
    }
    with open('game_save.json', 'w') as f:
        json.dump(game_state, f)

def load_game():
    try:
        with open('game_save.json', 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return None

注意事项:

  • 游戏运行时注意内存管理,及时清理不需要的对象
  • 碰撞检测要考虑性能优化
  • 注意游戏平衡性,调整各个参数
  • 添加音效和图片素材要注意版权问题

总结:

通过这个项目,我们学习了:

  1. Pygame的基本使用方法
  2. 面向对象编程在游戏开发中的应用
  3. 游戏循环和状态管理
  4. 碰撞检测的实现
  5. 简单的物理系统实现

这个Python版的植物大战僵尸还有很多可以扩展的空间,比如添加更多类型的植物和僵尸、实现阳光收集系统、添加关卡设计等。希望小伙伴们能基于这个基础版本,发挥创意,开发出更有趣的游戏!

需要完整代码+游戏素材的宝子可以扫描下方csdn官方二维码获娶 ↓↓↓↓↓

 


网站公告

今日签到

点亮在社区的每一天
去签到