python植物大战僵尸 豆约翰,python植物大战僵尸二十三之添加音乐

import pygame,sys

from pygame.locals import *

from src.Peashooter import Peashooter

from src.Bullet import Bullet

from src.Zombie import Zombie

from src.FlagZombie import FlagZombie

from src.SunFlower import SunFlower

from src.Sun import Sun

from src.WallNut import WallNut

pygame.init()

bg_size = (1200,600)

#初始化音乐模块

pygame.mixer.init()

#加载音乐

pygame.mixer.music.load("../material/music/02 - Crazy Dave (Intro Theme).mp3")

screen = pygame.display.set_mode((1200,600))

pygame.display.set_caption("植物大战僵尸")

background_image_path = "../material/images/background1.jpg"

sunback_imgage_path = "../material/images/SeedBank.png"

flower_seed = pygame.image.load("../material/images/TwinSunflower.gif")

wallNut_seed = pygame.image.load("../material/images/WallNut.gif")

peashooter_seed = pygame.image.load("../material/images/Peashooter.gif")

background = pygame.image.load(background_image_path).convert()

sunback = pygame.image.load(sunback_imgage_path).convert()

#太阳花Surface

sunflower_surface = pygame.image.load("../material/images/SunFlower_00.png")

#坚果Surface

wallnut_surface = pygame.image.load("../material/images/WallNut_00.png")

#豌豆射手Surface

peashooter_surface = pygame.image.load("../material/images/Peashooter_00.png")

#定义生成太阳的事件

GENERATORSUNEVNET = pygame.USEREVENT + 1

pygame.time.set_timer(GENERATORSUNEVNET,5000)

# 定义生成僵尸的事件

GENERATORZOMBIEEVENT = pygame.USEREVENT + 2

pygame.time.set_timer(GENERATORZOMBIEEVENT,3000)

# 定义生成旗帜僵尸的事件

GENERATORFLAGZOMBIEEVENT = pygame.USEREVENT + 3

pygame.time.set_timer(GENERATORFLAGZOMBIEEVENT,30000)

# 定义生成子弹的事件

GENERATORBULLETEVENT = pygame.USEREVENT + 4

pygame.time.set_timer(GENERATORBULLETEVENT,1000)

# 创建太阳数量文本

text = "150"

suns_font = pygame.font.SysFont("arial", 20)

suns_number_surface = suns_font.render(text, True, (0, 0, 0))

choose = 0

def main():

#声明太阳数量为全局变量

global text

global suns_number_surface

global suns_font

global choose

running = True

delay = 0

# 太阳花集合

sunFlowers = pygame.sprite.Group()

# 豌豆射手集合

peashooters = pygame.sprite.Group()

# 坚果集合 =

wallNuts = pygame.sprite.Group()

# 生成子弹

bulls = pygame.sprite.Group()

suns = pygame.sprite.Group()

# 生成僵尸

zombies = pygame.sprite.Group()

#生成旗帜僵尸

flagZombies = pygame.sprite.Group()

# 生成种子

seeds = pygame.sprite.Group()

while running:

delay += 1

if delay == 60:

delay = 0

# 绘制背景

screen.blit(background,(0,0))

##如果没有音乐流则选择播放

if not pygame.mixer.music.get_busy():

pygame.mixer.music.play()

#绘制顶部太阳数量栏

screen.blit(sunback,(250,0))

screen.blit(suns_number_surface,(280,60))

screen.blit(flower_seed, (330, 10))

screen.blit(wallNut_seed, (380, 10))

screen.blit(peashooter_seed, (430, 10))

clock = pygame.time.Clock()

clock.tick(15)

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

if event.type == MOUSEBUTTONDOWN:

pressed_array = pygame.mouse.get_pressed()

# print(pressed_array)

if pressed_array[0]:

x, y = pygame.mouse.get_pos()

# print(x, y)

for sun in suns:

if x <= sun.rect.left + sun.rect.width and x >= sun.rect.left \

and y <= sun.rect.top + sun.rect.height and y >= sun.rect.top:

if sun.active:

sun.active = False

suns.remove(sun)

text = str(int(text) + 50)

suns_font = pygame.font.SysFont("arial", 20)

suns_number_surface = suns_font.render(text, True, (0, 0, 0), None)

screen.blit(suns_number_surface, (280, 60))

if x >= 330 and x <= 380 and y >= 0 and y <= 70 and int(text) >= 50:

choose = 1

elif x > 380 and x <= 430 and y >= 0 and y <= 70 and int(text) >= 50:

choose = 2

elif x > 430 and x <= 480 and y >= 0 and y <= 70 and int(text) >= 100:

choose = 3

elif x > 250 and x < 1200 and y > 70 and y < 600:

if choose == 1:

#绘制Money文本

text = str(int(text) - 50)

suns_font = pygame.font.SysFont("arial", 20)

suns_number_surface = suns_font.render(text, True, (0, 0, 0), None)

screen.blit(suns_number_surface, (280, 60))

#创建太阳花对象

sunflower = SunFlower((x,y),bg_size)

seeds.add(sunflower)

sunFlowers.add(sunflower)

choose = 0

elif choose == 2:

# 绘制Money文本

text = str(int(text) - 50)

suns_font = pygame.font.SysFont("arial", 20)

suns_number_surface = suns_font.render(text, True, (0, 0, 0), None)

screen.blit(suns_number_surface, (280, 60))

#创建坚果对象

wallnut = WallNut((x,y),bg_size)

seeds.add(wallnut)

wallNuts.add(wallnut)

choose = 0

elif choose == 3:

# 绘制Money文本

text = str(int(text) - 100)

suns_font = pygame.font.SysFont("arial", 20)

suns_number_surface = suns_font.render(text, True, (0, 0, 0), None)

screen.blit(suns_number_surface, (280, 60))

#创建豌豆射手对象

peashooter = Peashooter((x,y),bg_size)

seeds.add(peashooter)

peashooters.add(peashooter)

choose = 0

# print(choose)

# 生成太阳

if event.type == GENERATORSUNEVNET:

if sunFlowers.__len__() > 0:

for sunFlower in sunFlowers:

sun = Sun(sunFlower.rect, bg_size)

suns.add(sun)

#生成僵尸

if event.type == GENERATORZOMBIEEVENT:

zombie = Zombie(bg_size)

zombies.add(zombie)

#生成旗帜僵尸

if event.type == GENERATORFLAGZOMBIEEVENT:

flagZombie = FlagZombie(bg_size)

flagZombies.add(flagZombie)

#生成子弹

if event.type == GENERATORBULLETEVENT:

if peashooters.__len__() > 0:

for peashooter in peashooters:

bullet = Bullet(peashooter.rect,bg_size)

bulls.add(bullet)

seeds.draw(screen)

#碰撞检测

for bull in bulls:

if not bull.visible:

continue

for zombie in zombies:

if pygame.sprite.collide_mask(bull,zombie):

bull.visible = False

#screen.blit(zombie.dying_images[1], zombie.rect)

bulls.remove(bull)

zombie.energy -= 2

if zombie.energy == 8:

screen.blit(zombie.dying_images[0], zombie.rect)

elif zombie.energy == 6:

screen.blit(zombie.dying_images[4], zombie.rect)

elif zombie.energy == 4:

screen.blit(zombie.dying_images[6], zombie.rect)

elif zombie.energy == 2:

screen.blit(zombie.dying_images[7], zombie.rect)

elif zombie.energy <= 0:

screen.blit(zombie.dying_images[9], zombie.rect)

zombie.kill()

for flagZombie in flagZombies:

if pygame.sprite.collide_mask(bull,flagZombie):

bull.visible = False

bulls.remove(bull)

flagZombie.energy -= 4

if flagZombie.energy <= 0:

screen.blit(flagZombie.dying_images[9], flagZombie.rect)

flagZombie.kill()

# 绘制坚果

for wallnut in wallNuts:

if wallnut.active and not wallnut.isMeetZombie and not wallnut.isMeetFlagZombie and wallnut.energy == 10:

screen.blit(wallnut.images[delay % 13], wallnut.rect)

elif wallnut.isMeetZombie and wallnut.isMeetFlagZombie and wallnut.energy == 0:

wallnut.kill()

wallNuts.remove(wallnut)

# 僵尸和坚果碰撞

for zombie in zombies:

if not zombie.active:

continue

for wallnut in wallNuts:

if pygame.sprite.collide_mask(zombie, wallnut):

zombie.isMeetWallNut = True

wallnut.isMeetZombie = True

wallnut.zombies.append(zombie)

# 旗帜僵尸和坚果碰撞

for flagZombie in flagZombies:

if not flagZombie.active:

continue

for wallnut in wallNuts:

if pygame.sprite.collide_mask(flagZombie, wallnut):

flagZombie.isMeetWallNut = True

wallnut.isMeetFlagZombie = True

wallnut.flagZombies.append(flagZombie)

# 控制坚果的生命值

for wallnut in wallNuts:

if wallnut.isMeetZombie:

print(wallnut.energy)

if delay % 30 == 0 and wallnut.energy > 0:

wallnut.energy -= 1

if wallnut.isMeetFlagZombie:

print(wallnut.energy)

if delay % 30 == 0 and wallnut.energy > 0:

wallnut.energy -= 2

# 根据坚果的生命值控制坚果的显示状态以及僵尸的形态

for wallnut in wallNuts:

if (wallnut.isMeetZombie or wallnut.isMeetFlagZombie) and wallnut.energy == 0:

for zombie_wallnut in wallnut.zombies:

zombie_wallnut.isMeetWallNut = False

for flag_zombie_wallnut in wallnut.flagZombies:

flag_zombie_wallnut.isMeetWallNut = False

wallnut.kill()

wallNuts.remove(wallnut)

# 绘制豌豆射手

for peashooter in peashooters:

if peashooter.active and not peashooter.isMeetZombie and not peashooter.isMeetFlagZombie and peashooter.energy == 10:

screen.blit(peashooter.images[delay % 13],peashooter.rect)

elif (peashooter.isMeetZombie or peashooter.isMeetFlagZombie) and peashooter.energy == 0:

peashooter.kill()

peashooter.remove()

# 僵尸和豌豆射手碰撞

for zombie in zombies:

if not zombie.active:

continue

for peashooter in peashooters:

if pygame.sprite.collide_mask(zombie, peashooter):

zombie.isMeetPeashooter = True

peashooter.isMeetZombie = True

peashooter.zombies.append(zombie)

# 旗帜僵尸和豌豆射手碰撞

for flagZombie in flagZombies:

if not flagZombie.active:

continue

for peashooter in peashooters:

if pygame.sprite.collide_mask(flagZombie, peashooter):

flagZombie.isMeetPeashooter = True

peashooter.isMeetFlagZombie = True

peashooter.flagZombies.append(flagZombie)

# 控制豌豆射手的生命值

for peashooter in peashooters:

if peashooter.isMeetZombie :

print(peashooter.energy)

if delay % 10 == 0 and peashooter.energy > 0:

peashooter.energy -= 1

if peashooter.isMeetFlagZombie:

print(peashooter.energy)

if delay % 10 == 0 and peashooter.energy > 0:

peashooter.energy -= 2

# 根据豌豆射手的生命值控制豌豆射手的显示状态

for peashooter in peashooters:

if (peashooter.isMeetZombie or peashooter.isMeetFlagZombie) and peashooter.energy == 0:

for zombie_peashooter in peashooter.zombies:

zombie_peashooter.isMeetPeashooter = False

for flagzombie_peashooter in peashooter.flagZombies:

flagzombie_peashooter.isMeetPeashooter = False

peashooter.kill()

peashooters.remove(peashooter)

# 绘制太阳花

for sunflower in sunFlowers:

if sunflower.active and not sunflower.isMeetZombie and not sunflower.isMeetFlagZombie and sunflower.energy == 10:

screen.blit(sunflower.images[delay % 13], sunflower.rect)

elif (sunflower.isMeetZombie or sunflower.isMeetFlagZombie) and sunflower.energy == 0:

sunflower.kill()

sunflower.remove()

# 僵尸和太阳花碰撞

for zombie in zombies:

if not zombie.active:

continue

for sunFlower in sunFlowers:

if pygame.sprite.collide_mask(zombie, sunFlower):

zombie.isMeetSunFlower = True

sunFlower.isMeetZombie = True

sunFlower.zombies.append(zombie)

# 旗帜僵尸和太阳花碰撞

for flagZombie in flagZombies:

if not flagZombie.active:

continue

for sunFlower in sunFlowers:

if pygame.sprite.collide_mask(flagZombie, sunFlower):

flagZombie.isMeetSunFlower = True

sunFlower.isMeetZombie = True

sunFlower.flagZombies.append(flagZombie)

# 控制太阳花的生命值

for sunFlower in sunFlowers:

if sunFlower.isMeetZombie:

print(sunFlower.energy)

if delay % 10 == 0 and sunFlower.energy > 0:

sunFlower.energy -= 1

if sunFlower.isMeetFlagZombie:

print(sunFlower.energy)

if delay % 10 == 0 and sunFlower.energy > 0:

sunFlower.energy -= 2

# 根据太阳花的生命值控制太阳花的显示状态以及僵尸的运动状态

for sunFlower in sunFlowers:

if (sunFlower.isMeetZombie or sunFlower.isMeetFlagZombie) and sunFlower.energy == 0:

if len(sunFlower.zombies) > 0:

for zombie_sunflower in sunFlower.zombies:

zombie_sunflower.isMeetSunFlower = False

if len(sunFlower.flagZombies) > 0:

for flag_zombie_sunflower in sunFlower.flagZombies:

flag_zombie_sunflower.isMeetSunFlower = False

sunFlower.kill()

sunFlowers.remove(sunFlower)

x,y = pygame.mouse.get_pos()

if choose == 1:

screen.blit(sunflower_surface,(x,y))

elif choose == 2:

screen.blit(wallnut_surface, (x, y))

elif choose == 3:

screen.blit(peashooter_surface, (x, y))

#绘制僵尸

for zombie in zombies:

if zombie.active and zombie.energy > 8 and not zombie.isMeetWallNut and not zombie.isMeetPeashooter\

and not zombie.isMeetSunFlower:

screen.blit(zombie.images[delay % 22],zombie.rect)

zombie.move()

elif zombie.isMeetWallNut or zombie.isMeetPeashooter or zombie.isMeetSunFlower:

screen.blit(zombie.attack_images[delay % 21], zombie.rect)

# 绘制旗帜僵尸

for flagZombie in flagZombies:

if flagZombie.active and flagZombie.energy > 8 and not flagZombie.isMeetWallNut and not flagZombie.isMeetPeashooter\

and not flagZombie.isMeetSunFlower:

screen.blit(flagZombie.images[delay % 12], flagZombie.rect)

flagZombie.move()

elif flagZombie.isMeetSunFlower or flagZombie.isMeetPeashooter or flagZombie.isMeetWallNut:

screen.blit(flagZombie.attack_images[delay % 11], flagZombie.rect)

# 绘制太阳

for sun in suns:

if sun.active:

screen.blit(sun.image, sun.rect)

#绘制子弹

for bullet in bulls:

if bullet.visible:

screen.blit(bullet.image,bullet.rect)

bullet.move()

#判断是否结束

if Zombie.victory_zombie_total == 3:

break

pygame.display.update()

if __name__ == '__main__':

main()

'''僵尸'''

import pygame

from random import randint

class Zombie(pygame.sprite.Sprite):

energy = 20

victory_zombie_total = 0

def __init__(self,bg_size):

super(Zombie, self).__init__()

# 本地背景的大小

self.width, self.height = bg_size[0], bg_size[1]

#图片

self.image = pygame.image.load("../material/images/Zombie_0.png")

# 获取图片位置

self.rect = self.image.get_rect()

# 定义僵尸的初始化位置

self.rect.left, self.rect.top = randint(900,1200),randint(0,400)

# 获取僵尸图片的掩模,用来进行精准碰撞检测

self.mask = pygame.mask.from_surface(self.image)

# 设置僵尸的生命状态 True活的,false死的

self.active = True

#僵尸是否遇到坚果

self.isMeetWallNut = False

#僵尸是否遇到豌豆射手

self.isMeetPeashooter = False

#僵尸是否遇到太阳花

self.isMeetSunFlower = False

#设置僵尸移动速度

self.speed = 2

#设置僵尸的生命

self.energy = Zombie.energy

# 加载僵尸动作

self.images = []

self.images.extend([pygame.image.load("../material/images/Zombie_0.png")

,pygame.image.load("../material/images/Zombie_1.png")

,pygame.image.load("../material/images/Zombie_2.png")

,pygame.image.load("../material/images/Zombie_3.png")

, pygame.image.load("../material/images/Zombie_4.png")

, pygame.image.load("../material/images/Zombie_5.png")

, pygame.image.load("../material/images/Zombie_6.png")

, pygame.image.load("../material/images/Zombie_7.png")

, pygame.image.load("../material/images/Zombie_8.png")

, pygame.image.load("../material/images/Zombie_9.png")

, pygame.image.load("../material/images/Zombie_10.png")

, pygame.image.load("../material/images/Zombie_11.png")

, pygame.image.load("../material/images/Zombie_12.png")

, pygame.image.load("../material/images/Zombie_13.png")

, pygame.image.load("../material/images/Zombie_14.png")

, pygame.image.load("../material/images/Zombie_15.png")

, pygame.image.load("../material/images/Zombie_16.png")

, pygame.image.load("../material/images/Zombie_17.png")

, pygame.image.load("../material/images/Zombie_18.png")

, pygame.image.load("../material/images/Zombie_19.png")

, pygame.image.load("../material/images/Zombie_20.png")

, pygame.image.load("../material/images/Zombie_21.png")

])

self.dying_images = []

self.dying_images.extend([pygame.image.load("../material/images/ZombieDie_0.png")

, pygame.image.load("../material/images/ZombieDie_1.png")

, pygame.image.load("../material/images/ZombieDie_2.png")

, pygame.image.load("../material/images/ZombieDie_3.png")

, pygame.image.load("../material/images/ZombieDie_4.png")

, pygame.image.load("../material/images/ZombieDie_5.png")

, pygame.image.load("../material/images/ZombieDie_6.png")

, pygame.image.load("../material/images/ZombieDie_7.png")

, pygame.image.load("../material/images/ZombieDie_8.png")

, pygame.image.load("../material/images/ZombieDie_9.png")

])

self.attack_images = []

self.attack_images.extend([pygame.image.load("../material/images/ZombieAttack_0.png")

, pygame.image.load("../material/images/ZombieAttack_1.png")

, pygame.image.load("../material/images/ZombieAttack_2.png")

, pygame.image.load("../material/images/ZombieAttack_3.png")

, pygame.image.load("../material/images/ZombieAttack_4.png")

, pygame.image.load("../material/images/ZombieAttack_5.png")

, pygame.image.load("../material/images/ZombieAttack_6.png")

, pygame.image.load("../material/images/ZombieAttack_7.png")

, pygame.image.load("../material/images/ZombieAttack_8.png")

, pygame.image.load("../material/images/ZombieAttack_9.png")

, pygame.image.load("../material/images/ZombieAttack_10.png")

, pygame.image.load("../material/images/ZombieAttack_11.png")

, pygame.image.load("../material/images/ZombieAttack_12.png")

, pygame.image.load("../material/images/ZombieAttack_13.png")

, pygame.image.load("../material/images/ZombieAttack_14.png")

, pygame.image.load("../material/images/ZombieAttack_15.png")

, pygame.image.load("../material/images/ZombieAttack_16.png")

, pygame.image.load("../material/images/ZombieAttack_17.png")

, pygame.image.load("../material/images/ZombieAttack_18.png")

, pygame.image.load("../material/images/ZombieAttack_19.png")

, pygame.image.load("../material/images/ZombieAttack_20.png")])

def move(self):

#if not self.isMeetWallNut:

if self.rect.left > 150:

self.rect.left -= self.speed

else :

Zombie.victory_zombie_total += 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值