diff --git a/flappy.py b/flappy.py index a9ce290ac..a93a1e2b6 100644 --- a/flappy.py +++ b/flappy.py @@ -1,53 +1,49 @@ -import pygame, random, time +import pygame +import random +import time +import math from pygame.locals import * -#VARIABLES -SCREEN_WIDHT = 400 +# VARIABLES +SCREEN_WIDTH = 400 SCREEN_HEIGHT = 600 SPEED = 20 GRAVITY = 2.5 GAME_SPEED = 15 -GROUND_WIDHT = 2 * SCREEN_WIDHT -GROUND_HEIGHT= 100 +GROUND_WIDTH = 2 * SCREEN_WIDTH +GROUND_HEIGHT = 100 -PIPE_WIDHT = 80 +PIPE_WIDTH = 80 PIPE_HEIGHT = 500 PIPE_GAP = 150 -wing = 'assets/audio/wing.wav' -hit = 'assets/audio/hit.wav' - -pygame.mixer.init() - +pygame.init() class Bird(pygame.sprite.Sprite): - def __init__(self): pygame.sprite.Sprite.__init__(self) - - self.images = [pygame.image.load('assets/sprites/bluebird-upflap.png').convert_alpha(), - pygame.image.load('assets/sprites/bluebird-midflap.png').convert_alpha(), - pygame.image.load('assets/sprites/bluebird-downflap.png').convert_alpha()] - + self.images = [ + pygame.image.load('assets/sprites/bluebird-upflap.png').convert_alpha(), + pygame.image.load('assets/sprites/bluebird-midflap.png').convert_alpha(), + pygame.image.load('assets/sprites/bluebird-downflap.png').convert_alpha() + ] self.speed = SPEED - self.current_image = 0 - self.image = pygame.image.load('assets/sprites/bluebird-upflap.png').convert_alpha() + self.image = self.images[self.current_image] self.mask = pygame.mask.from_surface(self.image) - self.rect = self.image.get_rect() - self.rect[0] = SCREEN_WIDHT / 6 + self.rect[0] = SCREEN_WIDTH / 6 self.rect[1] = SCREEN_HEIGHT / 2 + def update(self): self.current_image = (self.current_image + 1) % 3 self.image = self.images[self.current_image] self.speed += GRAVITY - - #UPDATE HEIGHT self.rect[1] += self.speed + def bump(self): self.speed = -SPEED @@ -56,18 +52,11 @@ def begin(self): self.current_image = (self.current_image + 1) % 3 self.image = self.images[self.current_image] - - - class Pipe(pygame.sprite.Sprite): - def __init__(self, inverted, xpos, ysize): pygame.sprite.Sprite.__init__(self) - - self. image = pygame.image.load('assets/sprites/pipe-green.png').convert_alpha() - self.image = pygame.transform.scale(self.image, (PIPE_WIDHT, PIPE_HEIGHT)) - - + self.image = pygame.image.load('assets/sprites/pipe-green.png').convert_alpha() + self.image = pygame.transform.scale(self.image, (PIPE_WIDTH, PIPE_HEIGHT)) self.rect = self.image.get_rect() self.rect[0] = xpos @@ -77,27 +66,21 @@ def __init__(self, inverted, xpos, ysize): else: self.rect[1] = SCREEN_HEIGHT - ysize - self.mask = pygame.mask.from_surface(self.image) - def update(self): self.rect[0] -= GAME_SPEED - - class Ground(pygame.sprite.Sprite): - def __init__(self, xpos): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load('assets/sprites/base.png').convert_alpha() - self.image = pygame.transform.scale(self.image, (GROUND_WIDHT, GROUND_HEIGHT)) - + self.image = pygame.transform.scale(self.image, (GROUND_WIDTH, GROUND_HEIGHT)) self.mask = pygame.mask.from_surface(self.image) - self.rect = self.image.get_rect() self.rect[0] = xpos self.rect[1] = SCREEN_HEIGHT - GROUND_HEIGHT + def update(self): self.rect[0] -= GAME_SPEED @@ -110,113 +93,148 @@ def get_random_pipes(xpos): pipe_inverted = Pipe(True, xpos, SCREEN_HEIGHT - size - PIPE_GAP) return pipe, pipe_inverted +def display_score(screen, score): + font = pygame.font.Font(None, 36) + text = font.render(f"Score: {score}", True, (255, 255, 255)) + screen.blit(text, (10, 10)) -pygame.init() -screen = pygame.display.set_mode((SCREEN_WIDHT, SCREEN_HEIGHT)) -pygame.display.set_caption('Flappy Bird') - -BACKGROUND = pygame.image.load('assets/sprites/background-day.png') -BACKGROUND = pygame.transform.scale(BACKGROUND, (SCREEN_WIDHT, SCREEN_HEIGHT)) -BEGIN_IMAGE = pygame.image.load('assets/sprites/message.png').convert_alpha() - -bird_group = pygame.sprite.Group() -bird = Bird() -bird_group.add(bird) - -ground_group = pygame.sprite.Group() - -for i in range (2): - ground = Ground(GROUND_WIDHT * i) - ground_group.add(ground) - -pipe_group = pygame.sprite.Group() -for i in range (2): - pipes = get_random_pipes(SCREEN_WIDHT * i + 800) - pipe_group.add(pipes[0]) - pipe_group.add(pipes[1]) - - - -clock = pygame.time.Clock() - -begin = True - -while begin: - - clock.tick(15) - - for event in pygame.event.get(): - if event.type == QUIT: - pygame.quit() - if event.type == KEYDOWN: - if event.key == K_SPACE or event.key == K_UP: - bird.bump() - pygame.mixer.music.load(wing) - pygame.mixer.music.play() - begin = False - - screen.blit(BACKGROUND, (0, 0)) - screen.blit(BEGIN_IMAGE, (120, 150)) - - if is_off_screen(ground_group.sprites()[0]): - ground_group.remove(ground_group.sprites()[0]) - - new_ground = Ground(GROUND_WIDHT - 20) - ground_group.add(new_ground) - - bird.begin() - ground_group.update() - - bird_group.draw(screen) - ground_group.draw(screen) +def game_over_screen(screen, score): + font = pygame.font.Font(None, 40) + text = font.render(f"Game Over! Score: {score}", True, (255, 0, 0)) + restart_text = font.render("Press SPACE to Restart", True, (255, 255, 255)) + + text_rect = text.get_rect(center=(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 3)) + restart_text_rect = restart_text.get_rect(center=(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)) + + screen.blit(text, text_rect) + screen.blit(restart_text, restart_text_rect) + pygame.display.update() + waiting = True + while waiting: + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + exit() + if event.type == KEYDOWN: + if event.key == K_SPACE: + waiting = False + + + +def main_game_loop(SPEED, GAME_SPEED): + bird_group = pygame.sprite.Group() + bird = Bird() + bird_group.add(bird) + + ground_group = pygame.sprite.Group() + for i in range(2): + ground = Ground(GROUND_WIDTH * i) + ground_group.add(ground) + + pipe_group = pygame.sprite.Group() + for i in range(2): + pipes = get_random_pipes(SCREEN_WIDTH * i + 800) + pipe_group.add(pipes[0]) + pipe_group.add(pipes[1]) -while True: + clock = pygame.time.Clock() + score = 0 + begin = True - clock.tick(15) + while begin: + clock.tick(15) - for event in pygame.event.get(): - if event.type == QUIT: - pygame.quit() - if event.type == KEYDOWN: - if event.key == K_SPACE or event.key == K_UP: - bird.bump() - pygame.mixer.music.load(wing) - pygame.mixer.music.play() + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + exit() + if event.type == KEYDOWN: + if event.key == K_SPACE or event.key == K_UP: + bird.bump() + begin = False + - screen.blit(BACKGROUND, (0, 0)) + screen.blit(BACKGROUND, (0, 0)) + screen.blit(BEGIN_IMAGE, (120, 150)) - if is_off_screen(ground_group.sprites()[0]): - ground_group.remove(ground_group.sprites()[0]) + if is_off_screen(ground_group.sprites()[0]): + ground_group.remove(ground_group.sprites()[0]) + new_ground = Ground(GROUND_WIDTH - 20) + ground_group.add(new_ground) - new_ground = Ground(GROUND_WIDHT - 20) - ground_group.add(new_ground) + bird.begin() + ground_group.update() - if is_off_screen(pipe_group.sprites()[0]): - pipe_group.remove(pipe_group.sprites()[0]) - pipe_group.remove(pipe_group.sprites()[0]) + bird_group.draw(screen) + ground_group.draw(screen) - pipes = get_random_pipes(SCREEN_WIDHT * 2) + pygame.display.update() - pipe_group.add(pipes[0]) - pipe_group.add(pipes[1]) + while True: + clock.tick(15) + + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + exit() + if event.type == KEYDOWN: + if event.key == K_SPACE or event.key == K_UP: + bird.bump() + elif event.key == K_f: + bird.rect[0] += 150 + elif event.key == K_d: + bird.rect[0] -= 150 + + + screen.blit(BACKGROUND, (0, 0)) + + if is_off_screen(ground_group.sprites()[0]): + ground_group.remove(ground_group.sprites()[0]) + new_ground = Ground(GROUND_WIDTH - 20) + ground_group.add(new_ground) + + if is_off_screen(pipe_group.sprites()[0]): + pipe_group.remove(pipe_group.sprites()[0]) + pipe_group.remove(pipe_group.sprites()[0]) + pipes = get_random_pipes(SCREEN_WIDTH * 2) + pipe_group.add(pipes[0]) + pipe_group.add(pipes[1]) + score += 1 + + bird_group.update() + ground_group.update() + pipe_group.update() + + bird_group.draw(screen) + pipe_group.draw(screen) + ground_group.draw(screen) + + display_score(screen, score) + + if(score == 2): + SPEED += 20 + GAME_SPEED += 20 - bird_group.update() - ground_group.update() - pipe_group.update() + pygame.display.update() - bird_group.draw(screen) - pipe_group.draw(screen) - ground_group.draw(screen) + #if (pygame.sprite.groupcollide(bird_group, ground_group, False, False, pygame.sprite.collide_mask) or + # pygame.sprite.groupcollide(bird_group, pipe_group, False, False, pygame.sprite.collide_mask)): + # time.sleep(1) + # game_over_screen(screen, score) + #return - pygame.display.update() +# Initialize screen +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) +pygame.display.set_caption('Flappy Bird') - if (pygame.sprite.groupcollide(bird_group, ground_group, False, False, pygame.sprite.collide_mask) or - pygame.sprite.groupcollide(bird_group, pipe_group, False, False, pygame.sprite.collide_mask)): - pygame.mixer.music.load(hit) - pygame.mixer.music.play() - time.sleep(1) - break +# Load images +BACKGROUND = pygame.image.load('assets/sprites/background-day.png') +BACKGROUND = pygame.transform.scale(BACKGROUND, (SCREEN_WIDTH, SCREEN_HEIGHT)) +BEGIN_IMAGE = pygame.image.load('assets/sprites/message.png').convert_alpha() +# Main entry point +while True: + main_game_loop(SPEED, GAME_SPEED)