import random # For generating random numbers import sys # We will use sys.exit to exit the program import pygame from pygame.locals import * # Basic pygame imports # Global Variables for the game FPS = 32 SCREENWIDTH = 289 SCREENHEIGHT = 511 SCREEN = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT)) GROUNDY = SCREENHEIGHT * 0.8 GAME_SPRITES = {} GAME_SOUNDS = {} PLAYER = 'gallery/sprites/bird.png' BACKGROUND = 'gallery/sprites/background.png' PIPE = 'gallery/sprites/pipe.png' def welcomeScreen(): """ Shows welcome images on the screen """ playerx = int(SCREENWIDTH/5) playery = int((SCREENHEIGHT - GAME_SPRITES['player'].get_height())/2) messagex = int((SCREENWIDTH - GAME_SPRITES['message'].get_width())/2) messagey = int(SCREENHEIGHT*0.13) basex = 0 while True: for event in pygame.event.get(): # if user clicks on cross button, close the game if event.type == QUIT or (event.type==KEYDOWN and event.key == K_ESCAPE): pygame.quit() sys.exit() # If the user presses space or up key, start the game for them elif event.type==KEYDOWN and (event.key==K_SPACE or event.key == K_UP): return else: SCREEN.blit(GAME_SPRITES['background'], (0, 0)) SCREEN.blit(GAME_SPRITES['player'], (playerx, playery)) SCREEN.blit(GAME_SPRITES['message'], (messagex,messagey )) SCREEN.blit(GAME_SPRITES['base'], (basex, GROUNDY)) pygame.display.update() FPSCLOCK.tick(FPS) def mainGame(): score = 0 playerx = int(SCREENWIDTH/5) playery = int(SCREENWIDTH/2) basex = 0 # Create 2 pipes for blitting on the screen newPipe1 = getRandomPipe() newPipe2 = getRandomPipe() # my List of upper pipes upperPipes = [ {'x': SCREENWIDTH+200, 'y':newPipe1[0]['y']}, {'x': SCREENWIDTH+200+(SCREENWIDTH/2), 'y':newPipe2[0]['y']}, ] # my List of lower pipes lowerPipes = [ {'x': SCREENWIDTH+200, 'y':newPipe1[1]['y']}, {'x': SCREENWIDTH+200+(SCREENWIDTH/2), 'y':newPipe2[1]['y']}, ] pipeVelX = -4 playerVelY = -9 playerMaxVelY = 10 playerMinVelY = -8 playerAccY = 1 playerFlapAccv = -8 # velocity while flapping playerFlapped = False # It is true only when the bird is flapping while True: for event in pygame.event.get(): if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): pygame.quit() sys.exit() if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP): if playery > 0: playerVelY = playerFlapAccv playerFlapped = True GAME_SOUNDS['wing'].play() crashTest = isCollide(playerx, playery, upperPipes, lowerPipes) # This function will return true if the player is crashed if crashTest: return #check for score playerMidPos = playerx + GAME_SPRITES['player'].get_width()/2 for pipe in upperPipes: pipeMidPos = pipe['x'] + GAME_SPRITES['pipe'][0].get_width()/2 if pipeMidPos<= playerMidPos < pipeMidPos +4: score +=1 print(f"Your score is {score}") GAME_SOUNDS['point'].play() if playerVelY GROUNDY - 25 or playery<0: GAME_SOUNDS['hit'].play() return True for pipe in upperPipes: pipeHeight = GAME_SPRITES['pipe'][0].get_height() if(playery < pipeHeight + pipe['y'] and abs(playerx - pipe['x']) < GAME_SPRITES['pipe'][0].get_width()): GAME_SOUNDS['hit'].play() return True for pipe in lowerPipes: if (playery + GAME_SPRITES['player'].get_height() > pipe['y']) and abs(playerx - pipe['x']) < GAME_SPRITES['pipe'][0].get_width(): GAME_SOUNDS['hit'].play() return True return False def getRandomPipe(): """ Generate positions of two pipes(one bottom straight and one top rotated ) for blitting on the screen """ pipeHeight = GAME_SPRITES['pipe'][0].get_height() offset = SCREENHEIGHT/3 y2 = offset + random.randrange(0, int(SCREENHEIGHT - GAME_SPRITES['base'].get_height() - 1.2 *offset)) pipeX = SCREENWIDTH + 10 y1 = pipeHeight - y2 + offset pipe = [ {'x': pipeX, 'y': -y1}, #upper Pipe {'x': pipeX, 'y': y2} #lower Pipe ] return pipe if __name__ == "__main__": # This will be the main point from where our game will start pygame.init() # Initialize all pygame's modules FPSCLOCK = pygame.time.Clock() pygame.display.set_caption('Flappy Bird by CodeWithHarry') GAME_SPRITES['numbers'] = ( pygame.image.load('gallery/sprites/0.png').convert_alpha(), pygame.image.load('gallery/sprites/1.png').convert_alpha(), pygame.image.load('gallery/sprites/2.png').convert_alpha(), pygame.image.load('gallery/sprites/3.png').convert_alpha(), pygame.image.load('gallery/sprites/4.png').convert_alpha(), pygame.image.load('gallery/sprites/5.png').convert_alpha(), pygame.image.load('gallery/sprites/6.png').convert_alpha(), pygame.image.load('gallery/sprites/7.png').convert_alpha(), pygame.image.load('gallery/sprites/8.png').convert_alpha(), pygame.image.load('gallery/sprites/9.png').convert_alpha(), ) GAME_SPRITES['message'] =pygame.image.load('gallery/sprites/message.png').convert_alpha() GAME_SPRITES['base'] =pygame.image.load('gallery/sprites/base.png').convert_alpha() GAME_SPRITES['pipe'] =(pygame.transform.rotate(pygame.image.load( PIPE).convert_alpha(), 180), pygame.image.load(PIPE).convert_alpha() ) # Game sounds GAME_SOUNDS['die'] = pygame.mixer.Sound('gallery/audio/die.wav') GAME_SOUNDS['hit'] = pygame.mixer.Sound('gallery/audio/hit.wav') GAME_SOUNDS['point'] = pygame.mixer.Sound('gallery/audio/point.wav') GAME_SOUNDS['swoosh'] = pygame.mixer.Sound('gallery/audio/swoosh.wav') GAME_SOUNDS['wing'] = pygame.mixer.Sound('gallery/audio/wing.wav') GAME_SPRITES['background'] = pygame.image.load(BACKGROUND).convert() GAME_SPRITES['player'] = pygame.image.load(PLAYER).convert_alpha() while True: welcomeScreen() # Shows welcome screen to the user until he presses a button mainGame() # This is the main game function