设置动画管道精灵的类---管道的图纸 image 管道的运动规则 image 创建一个精灵组来放管道精灵,为之后和小鸟的碰撞检测做准备 image 生成管道,并且确认随机位置

image

失败条件的设置 image 新管道的生成 image 游戏运行是更新的素材 image 游戏失败时更新的素材 image 重新开始时重置管道设置 image

1 条评论

  • @ 2024-5-25 20:27:29
    import pygame as pg
    import sys,random
    
    pg.init() #初始化
    pg.display.set_caption("飞翔的小鸟")#设置标题
    width,height = 700,500
    win = pg.display.set_mode((width,height))
    
    bg = pg.image.load("./img/bg_day.png").convert() #导入背景图片
    bg = pg.transform.smoothscale(bg,(width,height)) # 设置背景图片的尺寸成窗口大小
    font36 = pg.font.SysFont("微软雅黑",36) # 设置游戏内文字的字体和大小
    clock = pg.time.Clock() # 开启时钟设置
    running = False # 设置监控变量,默认游戏没有运行
    high_score = current_score = 0 # 最高分和当前游戏得分两个变量初始化为0
    msg = font36.render("按空格开始游戏",1,(0,0,0))
    
    bird_images = [] #定义用来储存小鸟图片的列表
    for i in range(3):
        img = pg.image.load(f"./img/bird0_{i}.png").convert_alpha()
        bird_images.append(img)
    
    class Bird(pg.sprite.Sprite):
        def __init__(self,images):
            pg.sprite.Sprite.__init__(self)
            self.images = images
            self.image = images[0]
            self.rect = self.image.get_rect() # 尺寸设置
            self.rect.topleft = 150,300 # 位置设置
            self.speed = 0 # 速度设置
            self.frame = 0
        def update(self):
            self.speed+= 0.5
            self.rect.y += self.speed
            self.frame += 1
            if self.frame>2:
                self.frame=0
            self.image = self.images[self.frame]
    
    class  Pipe(pg.sprite.Sprite):
        def __init__(self,image,top):
            pg.sprite.Sprite.__init__(self)
            self.image = image
            self.rect = self.image.get_rect() # 尺寸设置
            self.mask = pg.mask.from_surface(self.image)
            self.rect.topleft = width,top
        def update(self):
            self.rect.x -= 5
            if self.rect.right<0:
                self.kill()
    pipes = pg.sprite.Group()
    pipe_down_image = pg.image.load(f"./img/pipe_down.png").convert_alpha()
    pipe_up_image = pg.image.load(f"./img/pipe_up.png").convert_alpha()
    
    def add_pipe():
        top = random.randint(-300,0)
        space = random.randint(100,200)
        pipes.add(Pipe(pipe_down_image,top))
        pipes.add(Pipe(pipe_up_image,320+space+top))
    add_pipe()
    
    bird = Bird(bird_images)
    while  True :
        win.blit(bg,(0,0))
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()
            if event.type == pg.KEYDOWN and event.key == pg.K_SPACE:
                if not running: # 是否是没有开始游戏状态按的空格,也就是游戏开始状态
                    running = True
                    bird = Bird(bird_images)
                    pipes.empty() # 清空管道精灵组
                    add_pipe() # 往管道精灵组添加新的管道
                else:
                    bird.speed = -8
        
        if running:
            # 失败条件
            if (bird.rect.y<0 or bird.rect.y>height) or\
            pg.sprite.spritecollide(bird,pipes,False ,
                                    pg.sprite.collide_mask):
                running =False
                pg.time.wait(500)
            # 新管道生成
            if len(pipes)==0:
                current_score +=1
                add_pipe()
            
            bird.update() # 小鸟更新动作规则
            win.blit(bird.image,bird.rect) # 小鸟更新图片和位置
            pipes.update() # 管道精灵组更新动作规则
            score = font36.render("Score:"+str(current_score),1,(0,0,0))
            win.blit(score,(20,10)) # 把得分信息写在20,10的位置
            pipes.draw(win) # 把管道精灵组中的动画精灵绘制在win窗口
        else :
            high_score = max(high_score,current_score)
            current_score = 0
            win.blit(font36.render("High Score:"+str(high_score),1,(0,0,0)),(200,300)) # 把最高分写在200,300的位置
            win.blit(msg,(200,200))
        clock.tick(60)
        pg.display.flip()
    
    
    • 1