import pygame, sys, random from pygame.locals import * from Debug import debug pygame.init() clock = pygame.time.Clock() screen_width,screen_height = 864,936 screen = pygame.display.set_mode((screen_width,screen_height)) pygame.display.set_caption("Flappy Bird") #define font font = pygame.font.SysFont("Bauhaus 93", 60) #define colour white = (255,255,255) #define game variables ground_scroll = 0 scroll_speed = 4 flying = False gameover = False pipe_gap = 150 pipe_frequency = 1500 #milliseconds last_pipe = pygame.time.get_ticks() - pipe_frequency score = 0 pass_pipe = False #load images bg = pygame.image.load("img/0bg.png") ground_image = pygame.image.load("img/0ground.png") button_image = pygame.image.load("img/0restart.png") def draw_text(text,font,text_colour,x,y): img = font.render(text, True, text_colour) screen.blit(img,(x,y)) def reset_game(): pipe_group.empty() flappy.rect.x = 100 flappy.rect.y = int(screen_height/2) score = 0 return score class Bird(pygame.sprite.Sprite): def __init__(self, x,y): pygame.sprite.Sprite.__init__(self) self.images = [] self.index = 0 self.counter = 0 for num in range(1,4): img = pygame.image.load(f"img/0bird{num}.png") self.images.append(img) self.image = self.images[self.index] self.rect = self.image.get_rect() self.rect.center = [x,y] self.vel = 0 self.clicked = False def update(self): if flying == True: #gravity self.vel += 0.5 if self.vel > 8: self.vel = 8 if self.rect.bottom < 768: self.rect.y += int(self.vel) if gameover == False: #jump if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False: self.clicked = True self.vel = -10 if pygame.mouse.get_pressed()[0] == 0: self.clicked = False #handle animation self.counter += 1 flap_cooldown = 5 if self.counter > flap_cooldown: self.counter = 0 self.index += 1 if self.index >= len(self.images): self.index = 0 self.image = self.images[self.index] #rotate the bird self.image = pygame.transform.rotate(self.images[self.index], self.vel * -2) else: self.image = pygame.transform.rotate(self.images[self.index], -90) class Pipe(pygame.sprite.Sprite): def __init__(self,x,y, position): pygame.sprite.Sprite.__init__(self) self.image= pygame.image.load("img/0pipe.png") self.rect = self.image.get_rect() #position 1 is from top, -1 is from the bottom if position == 1: self.image = pygame.transform.flip(self.image, False, True) self.rect.bottomleft = [x,y - int(pipe_gap/2)] if position == -1: self.rect.topleft = [x,y + int(pipe_gap/2)] def update(self): self.rect.x -= scroll_speed if self.rect.right < 0: self.kill() class Button(): def __init__(self, x,y,image): self.image = image self.rect = self.image.get_rect() self.rect.topleft = (x,y) def draw(self): action = False #get mouse pos pos = pygame.mouse.get_pos() #check if mouse is over the button if self.rect.collidepoint(pos): if pygame.mouse.get_pressed()[0] == 1: action = True #draw button screen.blit(self.image, (self.rect.x, self.rect.y)) return action pipe_group = pygame.sprite.Group() bird_group = pygame.sprite.Group() flappy = Bird(100, int(screen_height/2)) bird_group.add(flappy) #create restart button instance button = Button(screen_width//2 - 50, screen_height // 2 - 100, button_image) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN and flying == False and gameover == False: flying = True screen.blit(bg, (0,0)) bird_group.draw(screen) bird_group.update() pipe_group.draw(screen) screen.blit(ground_image, (ground_scroll,768)) if gameover == False and flying == True: #generate new pipes time_now = pygame.time.get_ticks() if time_now - last_pipe > pipe_frequency: pipe_height = random.randint(-100, 100) btm_pipe = Pipe(screen_width, int(screen_height/2) + pipe_height, -1) top_pipe = Pipe(screen_width, int(screen_height/2) + pipe_height, 1) pipe_group.add(top_pipe) pipe_group.add(btm_pipe) last_pipe = time_now #draw and scoll the ground ground_scroll -= scroll_speed if abs(ground_scroll) > 35: ground_scroll = 0 pipe_group.update() #check for game over and reset #Check the score if len(pipe_group) > 0: if bird_group.sprites()[0].rect.left > pipe_group.sprites()[0].rect.left\ and bird_group.sprites()[0].rect.right < pipe_group.sprites()[0].rect.right\ and pass_pipe == False: pass_pipe = True if pass_pipe == True: if bird_group.sprites()[0].rect.left > pipe_group.sprites()[0].rect.right: score += 1 pass_pipe = False draw_text(str(score), font,white,int(screen_width/2), 20) #look for collision if pygame.sprite.groupcollide(bird_group,pipe_group, False, False) or flappy.rect.top < 0: gameover = True #check if bird has hit ground if flappy.rect.bottom >= 768: gameover = True flying = False if gameover == True: if button.draw(): score = reset_game() gameover = False pygame.display.flip() clock.tick(60)