Python面向对象植物大战僵尸

先来一波效果图

来看看如何设计游戏架构

python 复制代码
import sys

import pygame


class BaseSprite(pygame.sprite.Sprite):
    def __init__(self, name):
        super().__init__()
        self.image = pygame.image.load(name)
        self.rect = self.image.get_rect()


class AnimateSprite(BaseSprite):
    def __init__(self, default_name, names):
        super().__init__(default_name)
        self.images = [pygame.image.load(name) for name in names]
        self.current = 0

    def update(self):
        self.current += 1
        if self.current == len(self.images) * 2:
            self.current = 0
        self.image = self.images[self.current // 2]


class Enemy(AnimateSprite):
    def __init__(self, default_name, names, center, gm):
        super().__init__(default_name, names)
        self.rect.center = center
        self.time_count = 2
        self.gm = gm

        self.bullet_group = pygame.sprite.Group()

    def update(self):
        super().update()
        self.rect.left -= 1


class PeaShooter(AnimateSprite):
    def __init__(self, default_name, names, center, gm):
        super().__init__(default_name, names)
        self.rect.center = center
        self.time_count = 5
        self.gm = gm

        self.bullet_group = pygame.sprite.Group()

    def update(self):
        super().update()
        self.time_count -= 0.1
        if self.time_count <= 0:
            self.time_count = 5
            BulletSprite("bullet.png", (self.rect.right, self.rect.top + 15)).add(self.bullet_group)

        self.bullet_group.draw(self.gm.screen)
        self.bullet_group.update()

        print("当前子弹哟", len(self.bullet_group.sprites()))


class BulletSprite(BaseSprite):
    def __init__(self, name, center):
        super().__init__(name)
        self.rect.center = center

    def update(self):
        self.rect.left += 5
        if self.rect.left > 1400:
            self.kill()


class GameManage:
    def __init__(self):
        self.screen = pygame.display.set_mode((1400, 600))
        pygame.display.set_caption("植物大战僵尸")

        self.clock = pygame.time.Clock()

        self.bg_surface = pygame.image.load("background1.jpg")

        # 射手精灵组
        self.pea_shooter_group = pygame.sprite.Group()

        self.pea1 = PeaShooter("plants/peashooter/idle/idle_00.png",
                               [f"plants/peashooter/idle/idle_0{i}.png" for i in range(8)], (700, 200), self)
        self.pea1.add(self.pea_shooter_group)

        self.pea2 = PeaShooter("plants/peashooter/idle/idle_00.png",
                               [f"plants/peashooter/idle/idle_0{i}.png" for i in range(8)], (700, 300), self)
        self.pea2.add(self.pea_shooter_group)

        self.enemy_group = pygame.sprite.Group()

        images = [f"zombies/run/run_0{i}.png" for i in range(10)]
        for i in range(10, 31):
            images.append(f"zombies/run/run_{i}.png")

        self.enemy1 = Enemy("zombies/run/run_00.png", images, (1400, 200), self)
        self.enemy1.add(self.enemy_group)

        self.enemy2 = Enemy("zombies/run/run_00.png", images, (1100, 200), self)
        self.enemy2.add(self.enemy_group)

        self.enemy3 = Enemy("zombies/run/run_00.png", images, (1300, 300), self)
        self.enemy3.add(self.enemy_group)

        self.enemy4 = Enemy("zombies/run/run_00.png", images, (1200, 300), self)
        self.enemy4.add(self.enemy_group)

    def run(self):
        while True:
            self.clock.tick(20)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

            self.screen.blit(self.bg_surface, (0, 0))

            self.pea_shooter_group.draw(self.screen)
            self.pea_shooter_group.update()

            self.enemy_group.draw(self.screen)
            self.enemy_group.update()


            for pea_sprite in self.pea_shooter_group.sprites():
                if pygame.sprite.groupcollide(pea_sprite.bullet_group, self.enemy_group, True, True):
                    print("打死了一个僵尸")

            pygame.display.flip()


gm = GameManage()
gm.run()

抛砖引玉,等待后续完善。。。。。

相关推荐
Anastasiozzzz几秒前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步4 分钟前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
alvin_200510 分钟前
python之OpenGL应用(二)Hello Triangle
python·opengl
机器视觉的发动机15 分钟前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
铁蛋AI编程实战19 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
HyperAI超神经23 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
jiang_changsheng31 分钟前
RTX 2080 Ti魔改22GB显卡的最优解ComfyUI教程
python·comfyui
R_.L33 分钟前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan42 分钟前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
云姜.1 小时前
java多态
java·开发语言·c++