植物大战僵尸游戏的开发(python)

  

装备东西: 搭建好python环境, 四张图片,(背景图片,炮弹图片,僵尸图片,豌豆图片),就ok了  没有安装pygame的需要进行安装  pip install pygame

  参考视频

# 植物大战僵尸的练习 使用 pygame  模块进行开发

import pygame
from pygame.locals import *
import random

# 1.创建窗口
# 2.显示豌豆
# 3.通过键盘控制豌豆上下移动
WIDTH = 1200
HEIGHT = 600

# 创建豌豆对象
class Peas:

    def __init__(self):
        self.image_source = pygame.image.load('./res/peas.png')
        self.image_new = pygame.transform.scale(self.image_source, (100, 100))
        self.image_rect = self.image_new.get_rect()
        # 初始化位置
        self.image_rect.top = 280
        self.image_rect.left = 60
        # 设置豌豆是否上下移动
        self.is_move_up = False
        self.is_move_down = False
        # 是否发射炮弹
        self.is_shout = False

    def dispaly(self):
        """ 豌豆显示在页面上"""
        mode.blit(self.image_new, self.image_rect)

    def move_up(self):
        if self.image_rect.top > 90:
            self.image_rect.move_ip(0, -6)

    def move_down(self):
        if self.image_rect.bottom < 600:
            self.image_rect.move_ip(0, 6)

    def shout_bullet(self):
        # 创建一个炮弹对象
        bullet = Bullet(self);
        # 保存创建好的炮弹对象
        Bullet.bullet_list.append(bullet)

# 炮弹对象
class Bullet:
    bullet_list = []   # 创建一个类对象
    interval = 0   # 炮弹的间隔

    def __init__(self,peas):
        self.image_source = pygame.image.load('./res/bullet.png')
        self.image_new = pygame.transform.scale(self.image_source, (50, 50))
        self.image_rect = self.image_new.get_rect()
        # 初始化位置(和豌豆有关系)
        self.image_rect.top = peas.image_rect.top
        self.image_rect.left = peas.image_rect.right

    def display(self):
        mode.blit(self.image_new, self.image_rect)

    def move(self):
        self.image_rect.move_ip(10, 0)
        # 如果炮弹越界移除炮弹
        if self.image_rect.left > WIDTH - 100:
            Bullet.bullet_list.remove(self)

        # 如果炮弹碰撞到僵尸,僵尸消失
        for item in Zombie.zombie_list:
            if self.image_rect.colliderect(item.image_rect):  # 碰撞机制
                Bullet.bullet_list.remove(self)
                Zombie.zombie_list.remove(item)
                break

# 僵尸的出现和移动
class Zombie:
    # 保存多个僵尸
    zombie_list = []
    interval = 0  # 僵尸创建频率

    def __init__(self):
        self.image_source = pygame.image.load('./res/zombie.png')
        self.image_new = pygame.transform.scale(self.image_source, (150, 150))
        self.image_rect = self.image_new.get_rect()
        # 初始化位置
        self.image_rect.top = random.randint(100,HEIGHT - 100)
        self.image_rect.left = WIDTH - 100

    def display(self):
        mode.blit(self.image_new, self.image_rect)

    def move(self):
        self.image_rect.move_ip(-3, 0)
        # 如果炮弹越界移除炮弹
        if self.image_rect.left < 20:
            Zombie.zombie_list.remove(self)

        # 如果炮弹碰撞到僵尸,僵尸消失
        for item in Bullet.bullet_list:
            if self.image_rect.colliderect(item.image_rect):
                Bullet.bullet_list.remove(item)
                Zombie.zombie_list.remove(self)
                break




def key_control():
    '''时间监听'''
    # 对事件进行处理 它监听的是一个列表
    for item in pygame.event.get():
        # 事件类型进行判断
        if item.type == QUIT:
            pygame.quit()
            exit()
        # 按下键盘的事件判断
        if item.type == KEYDOWN:  # 也就是说,只要键盘向下,一直是True
            # 判断具体的键
            if item.key == K_UP:
                print("向上移动")
                # 移动
                peas.is_move_up = True
            elif item.key == K_DOWN:
                print("向下移动")
                peas.is_move_down = True
            elif item.key == K_SPACE:
                print("空格键按下")
                peas.is_shout = True
        elif item.type == KEYUP:
            # 判断具体的键
            if item.key == K_UP:
                print("向上移动")
                peas.is_move_up = False
            elif item.key == K_DOWN:
                print("向下移动")
                peas.is_move_down = False
            elif item.key == K_SPACE:
                print("空格键松开")
                peas.is_shout = False


if __name__ == '__main__':
    # 显示窗体
    mode = pygame.display.set_mode((WIDTH, HEIGHT))
    # 为了使图片完全覆盖窗口,涉及到一个坐标,就是从左上角开始
    # 加载图片
    bg = pygame.image.load('./res/bg.jpg')
    # 改变图片大小 生成新的图片
    bg = pygame.transform.scale(bg,(WIDTH,HEIGHT))
    # 获取图片的位置和大小
    bg_rect = bg.get_rect()

    # 创建一个时钟,优化速度效果
    clock = pygame.time.Clock()
    # 创建豌豆对象
    peas = Peas();
    # 为了方式程序结束,窗口消失,需要写一个死循环
    while True:
        # 设置背景颜色(颜色的填充)
        mode.fill((0, 0, 0))
        # 图片和窗口的关联
        mode.blit(bg, bg_rect)
        # 调用豌豆的显示方法
        # 显示豌豆
        peas.dispaly()
        # 事件的调用
        key_control()

        if peas.is_move_up:
            peas.move_up()

        if peas.is_move_down:
            peas.move_down()

        # 发射炮弹
        Bullet.interval += 1
        if peas.is_shout and Bullet.interval >= 20:
            Bullet.interval = 0
            peas.shout_bullet()

        # 显示所有的炮弹
        for bullet in Bullet.bullet_list:
            bullet.display()
            bullet.move()

        # 创建僵尸对象
        Zombie.interval += 1
        if Zombie.interval >= 20:
            Zombie.interval = 0
            zombie = Zombie();
            Zombie.zombie_list.append(zombie)

        # 显示所有的僵尸
        for zombie in Zombie.zombie_list:
            zombie.display()
            zombie.move()

        # 动画变化的帧频率
        clock.tick(60)
        # 显示图片
        pygame.display.update()

猜你喜欢

转载自www.cnblogs.com/chengyangyang/p/10334748.html