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()

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/84338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

定向流量卡怎么没人买了呢?你知道定向流量卡有多坑吗?

在购买流量卡的时候大家可能都注意了&#xff0c;市面上的流量卡有三种&#xff0c;定向流量卡&#xff0c;通用流量卡&#xff0c;通用流量定向流量卡&#xff0c;据小编了解&#xff0c;现在越来越多的人比较喜欢购买后两者&#xff0c;而关注定向流量卡越来越少了。 其实用过…

nginx反向代理后实现nginx和apache两种web服务器能够记录客户端的真实IP地址

一.构建环境 二.配置反向代理 1.基于源码安装的nginx环境下修改nginx.conf&#xff08;设备1&#xff09; 2.通过windows powershell进行修改hosts文件并测试 3.设备2和设备3上查看日志&#xff0c;可以看到访问来源都是代理服务器&#xff08;2.190&#xff09;而不是真实…

MySQL基础篇 (三)

函数 回顾学过的函数 countavgsumminmax 数值函数 做数值运算的 演示 #ABS(X)SELECT ABS(0); #SIGN(X)SELECT SIGN(-10); #SQRT(X)SELECT SQRT(4); #LEAST(value1,value2,...)SELECT LEAST(10,20,15);字符串函数 做字符串处理&#xff08;CONCAT()&#xff09; 演示 #CO…

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s

前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的 然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql 然后 启…

使用ChatGPT-4优化编程效率:高效查询代码示例和解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

在线转换器有哪些优势?在线Word转PDF操作分享

我们如果想要将两者不同格式文件进行格式转换&#xff0c;就需要下载安装转换器。如果出门带的设备没有安装转换软件客户端&#xff0c;就无法使用&#xff0c;会比较麻烦。现在有了在线转换工具&#xff0c;只需要打开相应的网页就可使用&#xff0c;那么在线Word转PDF的操作是…

情人节特别定制:多种语言编写动态爱心网页(附完整代码)

写在前面案例1&#xff1a;HTML Three.js库案例2&#xff1a;HTML CSS JavaScript案例3&#xff1a;Python环境 Flask框架结语 写在前面 随着七夕节的临近&#xff0c;许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代&#xff0c;结合创意和技术&#xff0…

初识微服务

我们在曾经最常见的就是所谓的单体架构&#xff0c;但是由于网民越来越多&#xff0c;单体架构已经逐渐的被淘汰出去&#xff0c;所以我们在单体架构的基础上提出了微服务&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0…

Web 3.0 安全风险,您需要了解这些内容

随着技术的不断发展&#xff0c;Web 3.0 正在逐渐成为现实&#xff0c;为我们带来了许多新的机遇和挑战。然而&#xff0c;与任何新技术一样&#xff0c;Web 3.0 也伴随着一系列安全风险&#xff0c;这些风险需要被认真对待。在这篇文章中&#xff0c;我们将探讨一些与Web 3.0 …

二、11.系统交互

fork 函数原型是 pid_t fork(void&#xff09;&#xff0c;返回值是数字&#xff0c;该数字有可能是子进程的 pid &#xff0c;有可能是 0&#xff0c;也有可能是-1 。 1个函数有 3 种返回值&#xff0c;这是为什么呢&#xff1f;可能的原因是 Linux 中没有获取子进程 pid 的方…

企业如何为服务器找到合适的托管机房?

企业的服务器在业务经营中扮演着很重要的角色&#xff0c;提供可靠的数据存储和备份功能、计算能力和软件支持、网络通信连接等功能&#xff0c;是企业运行中关键的组成部分。因此&#xff0c;企业的服务器需要得到妥善的保管&#xff0c;为它们选择一个合适的托管机房十分有必…

jmeter入门:接口压力测试全解析

一.对接口压力测试 1.配置 1.添加线程组&#xff08;参数上文有解释 这里不介绍&#xff09; 2.添加取样器 不用解释一看就知道填什么。。。 3.添加头信息&#xff08;否则请求头对不上&#xff09; 也不用解释。。。 4.配置监听器 可以尝试使用这几个监听器。 2.聚合结果…

Vue中实现自动匹配搜索框内容 关键字高亮文字显示

实现效果如下: 1.首先需要给输入框进行双向绑定 2.拿到搜索的结果去渲染页面 将返回的结果和搜索的关键字进行比对 如果相同的 就变红 上代码 html部分 //输入框<div class"search"><div class"shuru"><input type"请输入要查询的…

win10系统rust串口通信实现

一、用cargo创建新工程 命令&#xff1a;cargo new comport use std::env; use std::{thread, time}; use serialport::{DataBits, StopBits, Parity, FlowControl}; use std::io::{self, Read, Write}; use std::time::Duration;fn main() -> io::Result<()> {let m…

Lombok生成的Getter和Setter的名称对于“eMail”或“xAxis”等属性存在大小写转换异常

问题 最新开发中&#xff0c;遇到一个字段映射问题。我们先看问题案例&#xff1a; 明明代码中第二个字母是大写&#xff0c;结果测试接口时发现变成了小写字母。 分析 通过网上查询发现&#xff0c;这属于Lombok的bug。而且早在2015年就有人在GitHub上提出了issues。 Names o…

信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;公式和函数&#xff09; 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用&#xff0c;绝对引用&#xff0c;混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测 在煤矿生产中&#xff0c;空气质量是关系到矿工生命安全的重要因素。煤矿内部存在着各种有害气体&#xff0c;如甲烷、一氧化碳等&#xff0c;高浓度的有害气体会导致矿工中毒、窒息等危险情况&#xff0c;因此煤矿…

天锐绿盾安全U盘系统

安全U盘系统 01 简介 天锐绿盾安全U盘系统&#xff0c;是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等&#xff0c;天锐绿盾安全U盘系统为您U盘的数据保驾护航&#xff0…

桌面软件开发框架 Electron、Qt、WPF 和 WinForms 怎么选?

一、Electron Electron 是一个基于 Web 技术的跨平台桌面应用程序开发框架。它使用 HTML、CSS 和 JavaScript 来构建应用程序界面,并借助 Chromium 渲染引擎提供强大的页面渲染能力。Electron 的主要特点包括: 跨平台:Electron 可以在 Windows、macOS 和 Linux 等多个主流操…

Oracle的学习心得和知识总结(二十七)|Oracle数据库数据库回放功能之论文一翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…