Python植物大战僵尸源程序包含一个game.py及一个图片素材包,下载地址:植物大战僵尸的素材包。


#1 引入需要的模块
import pygame
import random
#1 配置图片地址
IMAGE_PATH = 'imgs/'
#1 设置页面宽高
scrrr_width=800
scrrr_height =560
#1 创建控制游戏结束的状态
GAMEOVER = False
#4 图片加载报错处理
LOG = '文件:{}中的方法:{}出错'.format(__file__,__name__)
#3 创建地图类
class Map():#3 存储两张不同颜色的图片名称map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']#3 初始化地图def __init__(self, x, y, img_index):self.image = pygame.image.load(Map.map_names_list[img_index])self.position = (x, y)# 是否能够种植self.can_grow = True#3 加载地图def load_map(self):MainGame.window.blit(self.image,self.position)
#4 植物类
class Plant(pygame.sprite.Sprite):def __init__(self):super(Plant, self).__init__()self.live=True# 加载图片def load_image(self):if hasattr(self, 'image') and hasattr(self, 'rect'):MainGame.window.blit(self.image, self.rect)else:print(LOG)
#5 向日葵类
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#5 时间计数器self.time_count = 0#5 新增功能:生成阳光def produce_money(self):self.time_count += 1if self.time_count == 25:MainGame.money += 5self.time_count = 0#5 向日葵加入到窗口中def display_sunflower(self):MainGame.window.blit(self.image,self.rect)
#6 豌豆射手类
class PeaShooter(Plant):def __init__(self,x,y):super(PeaShooter, self).__init__()# self.image 为一个 surfaceself.image = pygame.image.load('imgs/peashooter.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 200#6 发射计数器self.shot_count = 0#6 增加射击方法def shot(self):#6 记录是否应该射击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#6 如果活着if self.live and should_fire:self.shot_count += 1#6 计数器到25发射一次if self.shot_count == 25:#6 基于当前豌豆射手的位置,创建子弹peabullet = PeaBullet(self)#6 将子弹存储到子弹列表中MainGame.peabullet_list.append(peabullet)self.shot_count = 0#6 将豌豆射手加入到窗口中的方法def display_peashooter(self):MainGame.window.blit(self.image,self.rect)#7 豌豆子弹类
class PeaBullet(pygame.sprite.Sprite):def __init__(self,peashooter):self.live = Trueself.image = pygame.image.load('imgs/peabullet.png')self.damage = 50self.speed  = 10self.rect = self.image.get_rect()self.rect.x = peashooter.rect.x + 60self.rect.y = peashooter.rect.y + 15def move_bullet(self):#7 在屏幕范围内,实现往右移动if self.rect.x < scrrr_width:self.rect.x += self.speedelse:self.live = False#7 新增,子弹与僵尸的碰撞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 = Falseself.nextLevel()#7闯关方法def nextLevel(self):MainGame.score += 20MainGame.remnant_score -=20for i in range(1,100):if MainGame.score==100*i and MainGame.remnant_score==0:MainGame.remnant_score=100*iMainGame.shaoguan+=1MainGame.produce_zombie+=50def display_peabullet(self):MainGame.window.blit(self.image,self.rect)
#9 僵尸类
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#9 僵尸的移动def move_zombie(self):if self.live and not self.stop:self.rect.x -= self.speedif self.rect.x < -80:#8 调用游戏结束方法MainGame().gameOver()#9 判断僵尸是否碰撞到植物,如果碰撞,调用攻击植物的方法def hit_plant(self):for plant in MainGame.plants_list:if pygame.sprite.collide_rect(self,plant):#8  僵尸移动状态的修改self.stop = Trueself.eat_plant(plant)#9 僵尸攻击植物def eat_plant(self,plant):#9 植物生命值减少plant.hp -= self.damage#9 植物死亡后的状态修改,以及地图状态的修改if plant.hp <= 0:a = plant.rect.y // 80 - 1b = plant.rect.x // 80map = MainGame.map_list[a][b]map.can_grow = Trueplant.live = False#8 修改僵尸的移动状态self.stop = False#9 将僵尸加载到地图中def display_zombie(self):MainGame.window.blit(self.image,self.rect)
#1 主程序
class MainGame():#2 创建关数,得分,剩余分数,钱数shaoguan = 1score = 0remnant_score = 100money = 200#3 存储所有地图坐标点map_points_list = []#3 存储所有的地图块map_list = []#4 存储所有植物的列表plants_list = []#7 存储所有豌豆子弹的列表peabullet_list = []#9 新增存储所有僵尸的列表zombie_list = []count_zombie = 0produce_zombie = 100#1 加载游戏窗口def init_window(self):#1 调用显示模块的初始化pygame.display.init()#1 创建窗口MainGame.window = pygame.display.set_mode([scrrr_width,scrrr_height])#2 文本绘制def draw_text(self, content, size, color):pygame.font.init()font = pygame.font.SysFont('kaiti', size)text = font.render(content, True, color)return text#2 加载帮助提示def load_help_text(self):text1 = self.draw_text('1.按左键创建向日葵 2.按右键创建豌豆射手', 26, (255, 0, 0))MainGame.window.blit(text1, (5, 5))#3 初始化坐标点def init_plant_points(self):for y in range(1, 7):points = []for x in range(10):point = (x, y)points.append(point)MainGame.map_points_list.append(points)print("MainGame.map_points_list", MainGame.map_points_list)#3 初始化地图def init_map(self):for points in MainGame.map_points_list:temp_map_list = list()for point in points:# map = Noneif (point[0] + point[1]) % 2 == 0:map = Map(point[0] * 80, point[1] * 80, 0)else:map = Map(point[0] * 80, point[1] * 80, 1)# 将地图块加入到窗口中temp_map_list.append(map)print("temp_map_list", temp_map_list)MainGame.map_list.append(temp_map_list)print("MainGame.map_list", MainGame.map_list)#3 将地图加载到窗口中def load_map(self):for temp_map_list in MainGame.map_list:for map in temp_map_list:map.load_map()#6 增加豌豆射手发射处理def load_plants(self):for plant in MainGame.plants_list:#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)#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)#8事件处理def deal_events(self):#8 获取所有事件eventList = pygame.event.get()#8 遍历事件列表,判断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.map_list[y - 1][x]print(map.position)#8 增加创建时候的地图装填判断以及金钱判断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#9 新增初始化僵尸的方法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)#9将所有僵尸加载到地图中def load_zombies(self):for zombie in MainGame.zombie_list:if zombie.live:zombie.display_zombie()zombie.move_zombie()# v2.0 调用是否碰撞到植物的方法zombie.hit_plant()else:MainGame.zombie_list.remove(zombie)#1 开始游戏def start_game(self):#1 初始化窗口self.init_window()#3 初始化坐标和地图self.init_plant_points()self.init_map()#9 调用初始化僵尸的方法self.init_zombies()#1 只要游戏没结束,就一直循环while not GAMEOVER:#1 渲染白色背景MainGame.window.fill((255, 255, 255))#2 渲染的文字和坐标位置MainGame.window.blit(self.draw_text('当前钱数$: {}'.format(MainGame.money), 26, (255, 0, 0)), (500, 40))MainGame.window.blit(self.draw_text('当前关数{},得分{},距离下关还差{}分'.format(MainGame.shaoguan, MainGame.score, MainGame.remnant_score), 26,(255, 0, 0)), (5, 40))self.load_help_text()#3 需要反复加载地图self.load_map()#6 调用加载植物的方法self.load_plants()#7  调用加载所有子弹的方法self.load_peabullets()#8 调用事件处理的方法self.deal_events()#9 调用展示僵尸的方法self.load_zombies()#9 计数器增长,每数到100,调用初始化僵尸的方法MainGame.count_zombie += 1if MainGame.count_zombie == MainGame.produce_zombie:self.init_zombies()MainGame.count_zombie = 0#9 pygame自己的休眠pygame.time.wait(10)#1 实时更新pygame.display.update()#10 程序结束方法def gameOver(self):MainGame.window.blit(self.draw_text('游戏结束', 50, (255, 0, 0)), (300, 200))print('游戏结束')pygame.time.wait(400)global GAMEOVERGAMEOVER = True
#1 启动主程序
if __name__ == '__main__':game = MainGame()game.start_game()

更多Python源代码,请关注公众号:Python代码大全,

Python植物大战僵尸源代码及素材相关推荐

  1. (私人收藏)植物大战僵尸游戏角色素材集成包(用于练习)

    植物大战僵尸游戏角色素材集成包(用于练习) 植物大战僵尸里图片素材,收藏用于练习 植物大战僵尸;练习;游戏;游戏素材;素材包 https://pan.baidu.com/s/1b2Pm3OyBv4Ss ...

  2. 第5课python植物大战僵尸-添加豌豆射手类

    提示:第5课python植物大战僵尸-添加豌豆射手类 文章目录 摘要 一.豌豆射手类 Peashooter 1.import导入pygame模块 2.定义一个豌豆射手的类型,不用继承任何的类 3.定义 ...

  3. python植物大战僵尸(1)

    欢迎加入我们卧虎藏龙的python讨论qq群:729683466 ●导 语 ● 之前一直发一些简单的小游戏 百十行代码的那种 估计大家已经了解的一清二楚了 现在可以讲一些比较复杂的游戏 今天就带领大家 ...

  4. python植物大战僵尸辅助器手机版_GitHub又放大招,Python版本的植物大战僵尸还能作弊玩!...

    <植物大战僵尸>游戏它是一款极富策略性的小游戏,集成了即时战略.塔防御战和卡片收集等要素,玩家控制植物抵御僵尸的进攻,保护这片植物园.记得小编刚工作的时候抱着IPAD经常玩到深夜. 最近在 ...

  5. 第4课python植物大战僵尸-绘制背景

    摘要 1.新建material文件夹,在该文件下新建images和music,这两个文件存放音乐和图片,还有声音的处理. 2.新建python文件(plant_vs_zoomie_game_norma ...

  6. python植物大战僵尸代码例_用Python实现植物大战僵尸游戏,很酷

    以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. 功能实 ...

  7. 植物大战僵尸源代码java面向对象,植物大战僵尸:实现游戏内自动收集阳光

    1.首先我们找出阳光的动态地址,找到之后我们双击这个地址,将其加入到地址列表中,阳光的查找技巧相信你已经能够掌握了,这里就不再罗嗦了. 2.接着我们选择最下方的地址列表,然后按下[F6键],也就是下一 ...

  8. Python浅析-从植物大战僵尸源代码入门Python 从Python就业前景分析如何学习

    源代码私信小编"学习"领取 Python到底有多火呢?Python的简单易学,应用领域广让Python语言一路飙升到不可磨灭的重要地位.先来看看Python的就业方向吧 Pytho ...

  9. 【Python植物大战僵尸军团来袭】“大家快醒一醒、一大波僵尸来了”

    前言 大家好!我是梨子同学! 希望大家多多支持我!哈哈 为了感谢每一个关注我的小可爱:

  10. python植物大战僵尸 豆约翰,python植物大战僵尸六之添加僵尸

    import pygame from pygame.locals import * import sys from Peashooter import Peashooter from Sun impo ...

最新文章

  1. Retrofit源码研究
  2. 在LINUX终端和VIM下复制粘贴
  3. How to access the folder of Android
  4. 数据恢复,恢复丢失的数据,突破1G限制!
  5. windows NT的意义和各个版本
  6. 通用的异步处理类和进度通知类及其示例
  7. c语言’内存清除函数,c语言常用内存处理函数
  8. springcloud config配置中心概述
  9. Shiro 权限管理入门之认证与授权
  10. 中国主要的区块链公司以及融资情况
  11. 电工电子技术知识点总结(正弦交流电路)
  12. PorterLB使用手册
  13. 神奇的夏时令——本来设置好的日期在保存完成后少了一天?
  14. 21级计科专业计算机组成原理实验一报告
  15. Git 修改 commit author
  16. 爬虫 使用python+requests模块爬取12306网站的车次信息
  17. 【Spark ML】第 1 章:机器学习简介
  18. 第一章 cucumber测试框架综述
  19. 数据结构与算法基础 基本概念
  20. 水电图纸——工具简介-4

热门文章

  1. java 排队实现_Java实现排队论的原理
  2. C#编写ActiveX控件
  3. 百度钱包 java_百度钱包安全控件
  4. 软件测试人员必备工具介绍--如何滚屏抓取图片-SnagIt篇(图)
  5. WAP网站制作(WAP网站建设)全攻略教程二
  6. c语言算法单循环球队比赛安排,单循环赛赛程安排算法研究.doc
  7. 架构之美读书笔记之三
  8. 9WinMap 映射
  9. Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码
  10. wordpress怎么修改地址栏小图标