• 植物大战僵尸游戏的开发(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()
  • 相关阅读:
    [学习笔记] SSD代码笔记 + EifficientNet backbone 练习
    [论文理解] CornerNet: Detecting Objects as Paired Keypoints
    [torch] torch.contiguous
    [tensorflow] tf2.0 简单例子
    [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    本机Jenkins的使用
    安全工具acunetix使用
    cv2.matchTemplate()函数的应用,匹配图片后画出矩形
    python将PNG格式的图片转化成为jpg
    Python实现FTP文件的上传和下载
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/10334748.html
Copyright © 2020-2023  润新知