请写一个植物大战僵尸的python代码,包含游戏界面,做的精致点。
时间: 2024-03-06 20:48:46 浏览: 24
以下是一个植物大战僵尸的Python代码,包含了简单的游戏界面和声音效果,希望能够满足您的需求。注意:由于界面和声音效果需要用到外部库,代码在本地运行可能需要额外安装库文件。
```python
import random
import pygame
# 初始化pygame
pygame.init()
# 设置游戏窗口大小
window_size = (1024, 576)
window = pygame.display.set_mode(window_size)
pygame.display.set_caption("植物大战僵尸")
# 加载背景图片
background_image = pygame.image.load("background.png").convert_alpha()
background_rect = background_image.get_rect()
# 加载植物图片
peashooter_image = pygame.image.load("peashooter.png").convert_alpha()
sunflower_image = pygame.image.load("sunflower.png").convert_alpha()
# 加载僵尸图片
zombie_image = pygame.image.load("zombie.png").convert_alpha()
# 加载音效
attack_sound = pygame.mixer.Sound("attack.wav")
game_over_sound = pygame.mixer.Sound("game_over.wav")
# 植物类
class Plant:
def __init__(self, name, cost, hp, damage, image):
self.name = name
self.cost = cost
self.hp = hp
self.damage = damage
self.image = image
# 绘制植物
def draw(self, x, y):
window.blit(self.image, (x, y))
# 植物攻击僵尸
def attack(self, zombie):
zombie.hp -= self.damage
attack_sound.play()
if zombie.hp <= 0:
print(f"{zombie.name}被{self.name}击败了!")
return True
else:
return False
# 僵尸类
class Zombie:
def __init__(self, name, hp, damage, image):
self.name = name
self.hp = hp
self.damage = damage
self.image = image
# 绘制僵尸
def draw(self, x, y):
window.blit(self.image, (x, y))
# 僵尸攻击植物
def attack(self, plant):
plant.hp -= self.damage
attack_sound.play()
if plant.hp <= 0:
print(f"{plant.name}被{self.name}击败了!")
return True
else:
return False
# 游戏类
class Game:
def __init__(self):
self.plants = []
self.zombies = []
self.sun = 50
self.round = 1
self.game_over = False
# 添加植物
def add_plant(self, plant):
self.plants.append(plant)
# 添加僵尸
def add_zombie(self, zombie):
self.zombies.append(zombie)
# 游戏开始
def start(self):
print("游戏开始!")
while not self.game_over:
# 显示当前局数和太阳数
print(f"第{self.round}轮:太阳数{self.sun}")
# 显示可用植物
print("可用植物:")
for i, plant in enumerate(self.plants):
print(f"{i + 1}. {plant.name} ({plant.cost}阳光)")
# 显示可用僵尸
print("可用僵尸:")
for i, zombie in enumerate(self.zombies):
print(f"{i + 1}. {zombie.name} ({zombie.hp}血量)")
# 绘制游戏界面
window.blit(background_image, background_rect)
for i, plant in enumerate(self.plants):
plant.draw(100 + i * 100, 400)
for i, zombie in enumerate(self.zombies):
zombie.draw(800 - i * 100, 400)
# 处理游戏事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.game_over = True
elif event.type == pygame.MOUSEBUTTONUP:
# 获取鼠标点击位置
x, y = pygame.mouse.get_pos()
# 判断是否点击了植物
for i, plant in enumerate(self.plants):
if plant.cost <= self.sun and x >= 100 + i * 100 and x < 200 + i * 100 and y >= 400 and y < 500:
# 选择植物
selected_plant = plant
break
else:
selected_plant = None
# 判断是否点击了僵尸
for i, zombie in enumerate(self.zombies):
if x >= 800 - i * 100 and x < 900 - i * 100 and y >= 400 and y < 500:
# 选择僵尸
selected_zombie = zombie
break
else:
selected_zombie = None
if selected_plant is not None and selected_zombie is not None:
# 植物攻击
if selected_plant.attack(selected_zombie):
self.zombies.remove(selected_zombie)
self.sun += 25
print(f"获得25阳光!")
# 判断游戏是否结束
if len(self.zombies) == 0:
print("游戏结束,植物胜利!")
self.game_over = True
break
else:
# 僵尸攻击
for zombie in self.zombies:
if zombie.attack(selected_plant):
self.plants.remove(selected_plant)
# 判断游戏是否结束
if len(self.plants) == 0:
print("游戏结束,僵尸胜利!")
self.game_over = True
break
break
else:
self.sun -= selected_plant.cost
# 更新显示
pygame.display.update()
# 进入下一轮
print()
self.round += 1
# 创建植物和僵尸
peashooter = Plant("豌豆射手", 100, 10, 5, peashooter_image)
sunflower = Plant("向日葵", 50, 5, 0, sunflower_image)
zombie = Zombie("普通僵尸", 20, 2, zombie_image)
# 创建游戏并添加植物和僵尸
game = Game()
game.add_plant(peashooter)
game.add_plant(sunflower)
game.add_zombie(zombie)
# 开始游戏
game.start()
# 播放游戏结束音效
game_over_sound.play()
# 退出pygame
pygame.quit()
```