简单实现的植物大战僵尸我自己网上扣了王校长的图做了个热狗射手hhhhhhhh最后面给大家分享一下我扣的热狗png图片求点赞!!!"""
v1.81.完善僵尸类2.加载僵尸"""
import pygame
import time
import random
import sys
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 560# 地图类 v1.2 完善地图类
class Map:images_list = ['imgs/map1.png','imgs/map2.png']def __init__(self, x, y, image_index):self.position = (x,y)self.image = pygame.image.load(Map.images_list[image_index])# v1.5 新增是否能种植的属性self.can_grow = True# 将当前地图的图片加入到窗口def display_map(self):MainGame.window.blit(self.image,self.position)# 植物类 (父类)
class Plant(pygame.sprite.Sprite):def __init__(self):super().__init__()self.live = True# 向日葵类 v1.4 完善向日葵类
class Sunflower(Plant):def __init__(self,x,y):super(Sunflower, self).__init__()self.image = pygame.image.load('imgs/sunflower.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 100# v1.6 时间计数器self.time_count = 0# v1.6 新增功能:生成阳光def produce_money(self):self.time_count += 1if self.time_count == 25:MainGame.money += 5self.time_count = 0# 向日葵加入到窗口中def display_sunflower(self):MainGame.window.blit(self.image,self.rect)# 豌豆射手类
# v1.5 完善 豌豆射手类
class PeaShooter(Plant):def __init__(self,x,y):super(PeaShooter, self).__init__()# self.image 为一个 surfaceself.image = pygame.image.load('imgs/1-4.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 200# v1.7 发射计数器self.shot_count = 0# v1.7 增加射击方法def shot(self):# v1.9 记录是否应该射击should_fire = Falsefor zombie in MainGame.zombie_list:if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x:should_fire = True# 如果活着if self.live and should_fire:self.shot_count += 1# 计数器到25发射一次if self.shot_count == 25:# 基于当前豌豆射手的位置,创建子弹peabullet = PeaBullet(self)# 将子弹存储到子弹列表中MainGame.peabullet_list.append(peabullet)self.shot_count = 0# 将豌豆射手加入到窗口中的方法def display_peashooter(self):MainGame.window.blit(self.image,self.rect)# 豌豆子弹类
# v1.6 新增子弹类的功能
class PeaBullet(pygame.sprite.Sprite):def __init__(self,peashooter):self.live = Trueself.image = pygame.image.load('imgs/1-6.png')self.damage = 50self.speed  = 10self.rect = self.image.get_rect()self.rect.x = peashooter.rect.x + 40self.rect.y = peashooter.rect.y + 25def move_bullet(self):#在屏幕范围内,实现往右移动if self.rect.x < SCREEN_WIDTH:self.rect.x += self.speedelse:self.live = False# v1.9 新增,子弹与僵尸的碰撞def hit_zombie(self):for zombie in MainGame.zombie_list:if pygame.sprite.collide_rect(self,zombie):#打中僵尸之后,修改子弹的状态,self.live = False#僵尸掉血zombie.hp -= self.damageif zombie.hp <= 0:zombie.live = Falsedef display_peabullet(self):MainGame.window.blit(self.image,self.rect)# 僵尸类
# v1.8 完善僵尸类
class Zombie(pygame.sprite.Sprite):def __init__(self,x,y):super(Zombie, self).__init__()self.image = pygame.image.load('imgs/zombie.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.hp = 1000self.damage = 2self.speed = 1self.live = Trueself.stop = False#  v1.8僵尸的移动def move_zombie(self):if self.live and not self.stop:self.rect.x -= self.speedif self.rect.x < -80:# 调用游戏结束方法MainGame().gameOver()#  v1.8将僵尸加载到地图中def display_zombie(self):MainGame.window.blit(self.image,self.rect)# 游戏主线类
class MainGame:# 游戏窗口window = None# v1.2 新增存储所有坐标点的列表points_list = []# v1.2 新增存储所有地图块的列表maps_list = []# v1.4 存储所有植物的列表plants_list = []# v1.5 记录当前的金钱数money = 50# v1.7 存储所有豌豆子弹的列表peabullet_list = []# v1.8 新增存储所有僵尸的列表zombie_list = []def __init__(self):pass# 加载游戏窗口def init_window(self):# 调用显示模块的初始化pygame.display.init()# 创建窗口MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))# Surface# 获取一个包含指定文字的surfacedef get_surface_with_content(self,content,size,font_name,color):# 字体初始化pygame.font.init()# 创建字体font = pygame.font.SysFont(font_name,size)# 使用对应的字体绘制surfacesf = font.render(content,True,color)return sf# v1.2 新增初始化地图坐标的方法def init_points(self):for y in range(1,7):#(1,6)temp_list = []for x in range(10):#0,9point = (x,y)temp_list.append(point)print(temp_list)MainGame.points_list.append(temp_list)# v1.2 完成所有地图块的创建,存储到列表中def init_maps(self):# 遍历列表的长度  points 为大列表中的小列表for points in MainGame.points_list:temp_map_list = []for p in points:x = p[0]*80y = p[1]*80if (p[0] + p[1]) % 2 == 0:map = Map(x, y, 1)else:map = Map(x, y, 0)temp_map_list.append(map)# 将存储所有地图的列表存储到大列表中MainGame.maps_list.append(temp_map_list)# v1.2 将地图加载到窗口中def load_maps(self):for map_list in MainGame.maps_list:for map in map_list:map.display_map()# v1.4 加载所有的植物# v1.5 加载豌豆射手处理# v1.7 增加豌豆射手发射处理def load_plants(self):for plant in MainGame.plants_list:# v1.6 优化加载植物的处理逻辑if plant.live:if isinstance(plant, Sunflower):plant.display_sunflower()plant.produce_money()elif isinstance(plant, PeaShooter):plant.display_peashooter()plant.shot()else:MainGame.plants_list.remove(plant)# v1.7 加载所有子弹的方法def load_peabullets(self):for b in MainGame.peabullet_list:if b.live:b.display_peabullet()b.move_bullet()#v1.9 调用子弹是否打中僵尸的方法b.hit_zombie()else:MainGame.peabullet_list.remove(b)# v1.8 新增初始化僵尸的方法def init_zombies(self):for i in range(1,7):dis = random.randint(1,5)*200zombie = Zombie(800+dis,i*80)MainGame.zombie_list.append(zombie)# v1.8 将所有僵尸加载到地图中def load_zombies(self):for zombie in MainGame.zombie_list:if zombie.live:zombie.display_zombie()zombie.move_zombie()else:MainGame.zombie_list.remove(zombie)# v1.3 新增事件处理的方法def deal_events(self):# 获取所有事件eventList = pygame.event.get()# 遍历事件列表,判断for e in eventList:if e.type == pygame.QUIT:self.gameOver()elif e.type == pygame.MOUSEBUTTONDOWN:# print('按下鼠标按键')print(e.pos)# print(e.button)#左键1  按下滚轮2 上转滚轮为4 下转滚轮为5  右键 3x = e.pos[0]//80y = e.pos[1]//80print(x,y)map = MainGame.maps_list[y-1][x]print(map.position)# v1.5 增加创建时候的地图装填判断以及金钱判断if e.button == 1:if map.can_grow and MainGame.money >= 50:sunflower = Sunflower(map.position[0], map.position[1])MainGame.plants_list.append(sunflower)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow = FalseMainGame.money -= 50elif e.button == 3:if map.can_grow and MainGame.money >= 50:peashooter = PeaShooter(map.position[0], map.position[1])MainGame.plants_list.append(peashooter)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow = FalseMainGame.money -= 50# 游戏开始入口def startGame(self):# 调用初始化窗口的方法self.init_window()# v1.2 调用初始化坐标点self.init_points()# v1.2 调用初始化地图self.init_maps()# v1.8 调用初始化僵尸的方法self.init_zombies()while True:# 设置窗口的填充色MainGame.window.fill((255,255,255))# v1.5 修改文字加载的位置# 调用绘制表面sf = self.get_surface_with_content('剩余金钱{}'.format(MainGame.money), 26, 'kaiti', (255, 0, 0))# 将包含文字的表面加入到窗口中MainGame.window.blit(sf,(260,10))# v1.2 调用加载地图方法self.load_maps()# v1.3 调用事件处理的方法self.deal_events()# v1.4 调用加载植物的方法self.load_plants()# v1.5 金钱随着时间增加# MainGame.money += 0.25# v1.7 调用加载所有子弹的方法self.load_peabullets()# v1.8 调用展示僵尸的方法self.load_zombies()# 调用窗口刷新功能pygame.display.update()# time.sleep(0.025)# v1.7 pygame自己的休眠pygame.time.wait(10)# 程序结束方法def gameOver(self):print('僵尸进入了你家后院')#结束程序sys.exit()
if __name__ == '__main__':game = MainGame()game.startGame()

分享图片

下面是植物与地图的images:

链接:https://pan.baidu.com/s/1Ihr4HTz5CvcuZ3gC59Aofw 
提取码:f7bx 
复制这段内容后打开百度网盘手机App,操作更方便哦

如何用python简单做一个植物大战僵尸 源码相关推荐

  1. 做一个植物大战僵尸有多难?python教你几步搞定

    一个简单的植物大战僵尸游戏. 仅供个人学习和非商业用途.如果这个游戏侵犯了版权,请告诉我. 已有的植物: 向日葵, 豌豆射手, 坚果墙, 寒冰豌豆射手, 樱桃炸弹, 三向豌豆射手, 食人花, 喷射蘑菇 ...

  2. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  3. 17 - python——简单的坦克大战(附源码)

    基于对面向对象编程的思想完成简单的坦克大战游戏.主要目的锻炼面相对象编程思想 同样的在使用python进行游戏编写时需要安装pygame模块 安装方法: pycharm安装方式:File --> ...

  4. 用Python写了一个植物大战僵尸小游戏

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 大家好,我是 A梦. 今天给大家带来一个 Python 的练手项目.用Python的Py ...

  5. python版植物大战僵尸源码_用Python写一个植物大战僵尸! 简直一模一样!

    引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_heigh ...

  6. 福利来啦,送给大家利用Python做出的一个小游戏源码,不要错过哟

    从小到大玩过很多的游戏,在我小时候,能玩游戏的地方不多,那时玩游戏都是偷摸玩的,只要是个游戏就觉得非常有趣,比较经典的有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方块等游戏:发展到现在,玩游戏已经成为生活 ...

  7. C语言做一个图书管理系统源码,使用txt文件保存数据

    我使用的IDE为 VS2022,仅实现对文件内容的的添加以及修改,一本书是否被删除,我这里是以图书的状态来划分,如果这本书的状态为删除,则不显示出来,但是存在文本里:并且我这里是退出程序才会进行修改文 ...

  8. 【Python游戏】Python实现一个植物大战僵尸小游戏,非常简单,可以用于做毕业设计哟 | 附源码

    前言 halo,包子们上午好 今天给打击整一个植物大战僵尸 无广告版本 哈哈 说实话,现在的小游戏很多都是有广告,多少有点难受 今天给大家直接安排 相关文件 关注小编,私信小编领取哟! 当然别忘了一件 ...

  9. 今天咱们用Python整一个植物大战僵尸游戏 | 附带源码

    <植物大战僵尸>是一款极富策略性的小游戏,可怕的僵尸即将入侵,唯一的防御方式就是栽种植物.此游戏集成了即时战略.塔防御战和卡片收集等要素.游戏的内容就是:玩家控制植物,抵御僵尸的进攻,保护 ...

最新文章

  1. Python/Jupyter Notebook以及可视化的运用
  2. Oracle数据库索引失效,引起GoldenGate异常
  3. CC2530, 各种智能家居通信技术比较
  4. MySQL5.5 对多核CPU的支持测试
  5. 10分钟学会用Python轻松玩转Excel
  6. 聊聊微服务架构及分布式事务解决方案
  7. ZZULIOJ 1072:青蛙爬井
  8. sql server的跨库查询(简单实现)
  9. spring邮件发送(转)
  10. 关于创建 LINQ to SQL 类时无法转换复数的问题(zhuan)
  11. CSS Sprite精灵图如何缩放大小
  12. CENTOS7+LNMP+zabbix3.2.6安装配置
  13. javascritp读xml
  14. java8读流_JAVA: Java8流逐行读取文件
  15. 从 LinkedIn 的数据处理机制学习数据架构
  16. Linux 安装JDK详细步骤
  17. LCD显示屏和OLED显示屏的区别
  18. 请求的操作需要提升 win10
  19. mongoengine fields详解
  20. 安卓AS一键发布到蒲公英

热门文章

  1. The Sybil Attak 女巫攻击 论文翻译
  2. 计算机组成原理-基本组成
  3. linux 代码格式化工具下载,Linux 代码格式化工具 indent
  4. Python Network(三)案例(无向图,有向图,权重,点线分类与大小粗细)
  5. msf常用模块功能整理
  6. 游戏建模与动画建模的区别,小白学建模前一定要知道
  7. 电脑WIN XP蓝屏错误代码大全查询
  8. 如何用Qt展示你的GIF动图
  9. 浅谈自媒体带货底层逻辑及公众号变现操作路径
  10. gc buffer busy的优化