用python编程语言写植物大战僵尸的游戏
时间: 2024-03-09 14:37:58 浏览: 49
好的,让我们从头开始创建植物大战僵尸游戏。首先,我们需要导入Pygame库和其他必要的库:
```python
import pygame
import random
import time
```
接下来,我们定义一些常量,如窗口大小、背景颜色、字体等。
```python
# 窗口大小
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 字体
FONT_SMALL = pygame.font.SysFont('comicsansms', 25)
FONT_MEDIUM = pygame.font.SysFont('comicsansms', 50)
FONT_LARGE = pygame.font.SysFont('comicsansms', 80)
```
然后,我们创建窗口并设置标题:
```python
# 初始化Pygame
pygame.init()
# 创建窗口并设置标题
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("植物大战僵尸")
```
接下来,我们定义一些类,如植物、僵尸、子弹等。
```python
class Plant(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((0, 255, 0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Zombie(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((10, 10))
self.image.fill((0, 0, 255))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
```
接下来,我们创建一个游戏循环,其中包含事件处理、更新游戏状态和绘制游戏元素的代码。
```python
# 创建游戏循环
running = True
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 更新游戏状态
# 绘制游戏元素
window.fill(WHITE)
pygame.display.update()
# 结束游戏
pygame.quit()
```
现在,我们可以将植物、僵尸和子弹添加到游戏中。我们可以使用Pygame的精灵组来管理它们。
```python
# 创建精灵组
all_sprites = pygame.sprite.Group()
# 添加植物、僵尸和子弹
plant = Plant(100, 100)
zombie = Zombie(600, 100)
bullet = Bullet(150, 150)
all_sprites.add(plant)
all_sprites.add(zombie)
all_sprites.add(bullet)
```
在游戏循环中,我们需要更新并绘制所有精灵。
```python
# 更新游戏状态
all_sprites.update()
# 绘制游戏元素
window.fill(WHITE)
all_sprites.draw(window)
pygame.display.update()
```
现在,我们需要实现植物、僵尸和子弹的移动和碰撞检测。
```python
class Plant(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((0, 255, 0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = 5
def update(self):
self.rect.x += self.speed
class Zombie(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = 3
def update(self):
self.rect.x -= self.speed
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((10, 10))
self.image.fill((0, 0, 255))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.speed = 10
def update(self):
self.rect.y -= self.speed
# 在游戏循环中检测碰撞
hits = pygame.sprite.groupcollide(bullets, zombies, True, True)
for hit in hits:
score += 1
```
最后,我们可以添加一些游戏逻辑,例如生成随机的僵尸和定时发射子弹。
```python
# 生成随机的僵尸
if random.randint(0, 100) < 2:
zombie = Zombie(WINDOW_WIDTH, random.randint(0, WINDOW_HEIGHT))
all_sprites.add(zombie)
zombies.add(zombie)
# 定时发射子弹
now = time.time()
if now - last_shot_time > 0.5:
bullet = Bullet(plant.rect.x + 25, plant.rect.y)
all_sprites.add(bullet)
bullets.add(bullet)
last_shot_time = now
```
完整代码:
```python
import pygame
import random
import time
# 窗口大小
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 字体
FONT_SMALL = pygame.font.SysFont('comicsansms', 25)
FONT_MEDIUM = pygame.font.SysFont('comicsansms', 50)
FONT_LARGE = pygame.font.SysFont('comicsansms', 80)
# 初始化Pygame
pygame.init()
# 创建窗口并设置标题
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("植物大战僵尸")
# 创建精灵组
all_sprites = pygame.sprite.Group()
plants = pygame.sprite.Group()
zombies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
# 添加植物
plant = Plant(100, 100)
all_sprites.add(plant)
plants.add(plant)
# 游戏分数
score = 0
# 上一次发射子弹的时间
last_shot_time = time.time()
# 创建游戏循环
running = True
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 生成随机的僵尸
if random.randint(0, 100) < 2:
zombie = Zombie(WINDOW_WIDTH, random.randint(0, WINDOW_HEIGHT))
all_sprites.add(zombie)
zombies.add(zombie)
# 定时发射子弹
now = time.time()
if now - last_shot_time > 0.5:
bullet = Bullet(plant.rect.x + 25, plant.rect.y)
all_sprites.add(bullet)
bullets.add(bullet)
last_shot_time = now
# 更新游戏状态
all_sprites.update()
# 在游戏循环中检测碰撞
hits = pygame.sprite.groupcollide(bullets, zombies, True, True)
for hit in hits:
score += 1
# 绘制游戏元素
window.fill(WHITE)
all_sprites.draw(window)
# 显示分数
score_text = FONT_MEDIUM.render("Score: {}".format(score), True, BLACK)
window.blit(score_text, (10, 10))
pygame.display.update()
# 结束游戏
pygame.quit()
```
阅读全文