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

大家好呀,小伙伴们!今天要给大家介绍一个超有趣的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 = xself.y = yself.rect = pygame.Rect(x, y, 40, 40)  # 默认大小为40x40def 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 = 100self.attack_power = 20self.shoot_cooldown = 60  # 发射冷却时间self.cooldown_counter = 0def shoot(self):if self.cooldown_counter <= 0:self.cooldown_counter = self.shoot_cooldownreturn Projectile(self.x + 40, self.y + 20)return Nonedef 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 = 100self.speed = 1self.damage = 10def move(self):self.x -= self.speedself.rect.x = self.xdef is_alive(self):return self.health > 0# 子弹类
class Projectile(GameObject):def __init__(self, x, y):super().__init__(x, y)self.speed = 5self.damage = 20self.rect = pygame.Rect(x, y, 10, 10)def move(self):self.x += self.speedself.rect.x = self.x

四、游戏主循环

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

def main():plants = []zombies = []projectiles = []score = 0# 游戏主循环running = Truewhile running:# 事件处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif 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 = Falsebreak# 更新子弹for projectile in projectiles[:]:projectile.move()projectile.draw(screen)# 检查子弹碰撞for zombie in zombies[:]:if projectile.rect.colliderect(zombie.rect):zombie.health -= projectile.damageprojectiles.remove(projectile)if not zombie.is_alive():zombies.remove(zombie)score += 100break# 移除超出屏幕的子弹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 = 25self.sun_cooldown = 300def produce_sun(self):if self.cooldown_counter <= 0:self.cooldown_counter = self.sun_cooldownreturn Truereturn Falseclass PeaShooter(Plant):def __init__(self, x, y):super().__init__(x, y)self.attack_power = 20self.shoot_cooldown = 60

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

实际应用案例:

  1. 游戏存档功能:
import jsondef 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官方二维码获娶 ↓↓↓↓↓

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图解AUTOSAR_SWS_FlashTest

AUTOSAR Flash Test模块详解 基于AUTOSAR 4.4.0规范的Flash测试模块分析与图解 目录 概述 1.1 Flash Test模块的作用 1.2 工作原理架构设计 2.1 整体架构 2.2 依赖关系状态管理 3.1 状态转换图 3.2 前台与后台测试模式配置结构 4.1 配置类图 4.2 关键配置参数交互流程 5.1 序列…

【mongodb】mongodb的字段类型

目录 1. 基本数据类型1.1 String1.2 Number1.3 Boolean1.4 Date1.5 Null1.6 ObjectId1.7 Array1.8 Binary Data1.9 Object 2. 特殊数据类型2.1 Regular Expression2.2 JavaScript2.3 Symbol2.4 Decimal1282.5 Timestamp2.6 MinKey/MaxKey2.7 DBPointer 3. 常用字段类型示例4. 注…

MySQL篇(五)MySQL主从同步原理深度剖析

MySQL篇&#xff08;五&#xff09;MySQL主从同步原理深度剖析 MySQL篇&#xff08;五&#xff09;MySQL主从同步原理深度剖析一、引言二、MySQL主从同步基础概念主库&#xff08;Master&#xff09;从库&#xff08;Slave&#xff09;二进制日志&#xff08;Binary Log&#x…

论文学习16:Learning Transferable Visual Models From Natural Language Supervision

代码来源 Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020 模块作用 当前最先进的计算机视觉系统被训练用于预测一组固定的、预先定义的目标类别。这种受限的监督方式限制了它们的通用性和可用性&#xff0c;因为要…

[MySQL初阶]MySQL(9)事务机制

标题&#xff1a;[MySQL初阶]MySQL&#xff08;9&#xff09;事物机制 水墨不写bug 文章目录 一、认识事务1、多线程访问数据库出现的问题2、对CURD的限制是通过事务机制实现的3、事务的四个属性4、哪些引擎支持事务 二、事务的提交与autocommit设置三、事务的隔离性和隔离级别…

spring-cloud-alibaba-nacos-config使用说明

一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一&#xff0c;专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能&#xff0c;替代传统的 Spring Cloud Config&#xff0c;提供更高效的配置集中化管理…

SonarQube数据库配置

SonarQube部署完成后&#xff0c;在浏览器地址栏输入http://IP:9000可以进入登录页面&#xff0c;以本机运行为例&#xff0c;地址为http://127.0.0.1:9000/&#xff0c;默认登录名&#xff1a;admin&#xff0c;登录密码也是admin。登录后会要求设置密码&#xff1a; 按要求设…

医药档案区块链系统

1. 医生用户模块​​ ​​目标用户​​&#xff1a;医护人员 ​​核心功能​​&#xff1a; ​​检索档案​​&#xff1a;通过关键词或筛选条件快速定位患者健康档案。​​请求授权​​&#xff1a;向个人用户发起档案访问权限申请&#xff0c;需经对方确认。​​查看档案​…

CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)

化妆品网站 HTML5 CSS3 完整项目 下面是一个完整的化妆品网站项目&#xff0c;包含主页、登录页面和注册页面。我将按照您的要求提供详细的代码和注释。 1. 网站规划与需求分析 需求分析 展示化妆品产品信息提供用户注册和登录功能响应式设计&#xff0c;适配不同设备美观…

ROS2 多机时间同步(Chrony配置简明指南)

适用场景&#xff1a; 主机运行 ROS2 Humble&#xff08;发布 /scan 等&#xff09;&#xff0c;板子运行 ROS2 Foxy&#xff08;发布 /tf 等&#xff09;&#xff0c;两边通过 ROS_DOMAIN_ID 跨平台通讯。需要保证系统时间对齐&#xff0c;避免 TF 插值失败、建图抖动等问题。…

Nginx配置伪静态,URL重写

Nginx配置伪静态&#xff0c;URL重写 [ Nginx ] 在Nginx低版本中&#xff0c;是不支持PATHINFO的&#xff0c;但是可以通过在Nginx.conf中配置转发规则实现&#xff1a; location / { // …..省略部分代码if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 l…

电路笔记(元器件):ADC LTC系列模数转换器的输出范围+满量程和偏移调整

LTC1740(LTC1740官方文档)是Analog Devices&#xff08;原Linear Technology&#xff09;公司生产的一款高性能、低功耗的14位模数转换器(ADC)。它通常用于需要高精度和快速采样率的应用中&#xff0c;如通信系统、数据采集设备等。同类产品 LTC1746&#xff1a;一款14位、40Ms…

续-算法-数学知识

3、欧拉函数 1、定义&#xff1a; 1~n 中与 n 互质的数的个数 例如&#xff1a;6 的有 1 2 3 4 5 6 其中&#xff0c;与 n 互质 的 数的个数为 2个分别是&#xff1a;1、5 2、计算&#xff1a; $ N p_1^{a1} p_2^{a2} p_3^{a3} … p_k^{ak} $&#xff08;例如&#x…

C/C++测试框架googletest使用示例

文章目录 文档编译安装示例参考文章 文档 https://github.com/google/googletest https://google.github.io/googletest/ 编译安装 googletest是cmake项目&#xff0c;可以用cmake指令编译 cmake -B build && cmake --build build将编译产物lib和include 两个文件夹…

LintCode第974题-求矩阵各节点的最短路径(以0为标准)

描述 给定一个由0和1组成的矩阵&#xff0c;求每个单元格最近的0的距离。 两个相邻细胞之间的距离是1。 给定矩阵的元素数不超过10,000。 在给定的矩阵中至少有一个0。 单元格在四个方向上相邻:上&#xff0c;下&#xff0c;左和右。 样例 例1: 输入: [[0,0,0],[0,0,0],[0…

Redis核心机制-缓存、分布式锁

目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热&#xff08;Cache preheating&#xff09; 缓存穿透&#xff08;Cache penetration&#xff09; 缓存雪崩&#xff08;Cache avalanche&#xff09; 缓存击穿&#xff08;Cache breakdown&#xff09; 分…

CF每日5题(1300-1500)

最近急速补练蓝桥杯中&#xff0c;疏于cf练习。 感觉自己过题还是太慢了。 今日水题&#xff0c;我水水水水。 1- 1979C lcm 水 1400 第 i i i局赢了&#xff0c;1个硬币顶 k [ i ] k[i] k[i]个贡献&#xff0c;所以每局分硬币 x i 1 k [ i ] x_i{1\over k[i]} xi​k[i]1​个…

从代码学习深度学习 - LSTM PyTorch版

文章目录 前言一、数据加载与预处理1.1 代码实现1.2 功能解析二、LSTM介绍2.1 LSTM原理2.2 模型定义代码解析三、训练与预测3.1 训练逻辑代码解析3.2 可视化工具功能解析功能结果总结前言 深度学习中的循环神经网络(RNN)及其变种长短期记忆网络(LSTM)在处理序列数据(如文…

easy-poi 一对多导出

1. 需求&#xff1a; 某一列上下两行单元格A,B值一样且这两个单元格&#xff0c; 前面所有列对应单元格值一样的话&#xff0c; 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路&#xff1a; 先对数据集的国家&#xff0c;省份&#xff0c;城市...... id 身份证进行排序…

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解&#xff1a;本质和外在。我们的行为举止&#xff0c;都是我们的内心的表现。从外边可以看内心&#xff0c;从内心可以判断外在。曾国藩有&#xff17;个识人的方法&#xff0c;大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪&#xff0c;我认为有四点&…