En este artículo vamos a ver cómo hacer un juego de flappy bird en Pygame.
Todos estamos familiarizados con este juego. En este juego, el objetivo principal del jugador es obtener el máximo de puntos defendiendo al ave de los obstáculos. Aquí, construiremos nuestro propio juego Flappy Bird usando Python.
Usaremos Pygame (una biblioteca de Python) para crear este juego de Flappy Bird. Pygame es una biblioteca de código abierto diseñada para crear videojuegos. nos ayuda a crear juegos y programas multimedia completamente funcionales en python.
En primer lugar, debe instalar la biblioteca Pygame usando el comando: –
pip install pygame
Implementación paso a paso
Paso 1: en este primer paso, tenemos que importar bibliotecas.
Después de eso, tenemos que establecer la altura y el ancho de la pantalla en la que se jugará el juego. Ahora tenemos que definir algunas imágenes que usaremos en nuestro juego, como tuberías como obstáculos, imágenes de pájaros y también una imagen de fondo del juego Flappy Bird.
Python3
# For generating random height of pipes import random import sys import pygame from pygame.locals import * # Global Variables for the game window_width = 600 window_height = 499 # set height and width of window window = pygame.display.set_mode((window_width, window_height)) elevation = window_height * 0.8 game_images = {} framepersecond = 32 pipeimage = 'images/pipe.png' background_image = 'images/background.jpg' birdplayer_image = '/images/bird.png' sealevel_image = '/images/base.jfif'
Paso 2: después de declarar las variables del juego e importar bibliotecas, debemos inicializar el Pygame
El archivo usado se puede descargar desde aquí.
Inicialice el programa usando pygame.init() y establezca el título de la ventana. Aquí pygame.time.Clock() se usará más en el ciclo principal del juego para alterar la velocidad del pájaro. Cargue las imágenes del sistema en pygame usando pygame.image.load().
Python3
# program where the game starts if __name__ == "__main__": # For initializing modules of pygame library pygame.init() framepersecond_clock = pygame.time.Clock() # Sets the title on top of game window pygame.display.set_caption('Flappy Bird Game') # Load all the images which we will use in the game # images for displaying score game_images['scoreimages'] = ( pygame.image.load('images/0.png').convert_alpha(), pygame.image.load('images/1.png').convert_alpha(), pygame.image.load('images/2.png').convert_alpha(), pygame.image.load('images/3.png').convert_alpha(), pygame.image.load('images/4.png').convert_alpha(), pygame.image.load('images/5.png').convert_alpha(), pygame.image.load('images/6.png').convert_alpha(), pygame.image.load('images/7.png').convert_alpha(), pygame.image.load('images/8.png').convert_alpha(), pygame.image.load('images/9.png').convert_alpha() ) game_images['flappybird'] = pygame.image.load(birdplayer_image).convert_alpha() game_images['sea_level'] = pygame.image.load(sealevel_image).convert_alpha() game_images['background'] = pygame.image.load(background_image).convert_alpha() game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load(pipeimage) .convert_alpha(), 180), pygame.image.load(pipeimage).convert_alpha()) print("WELCOME TO THE FLAPPY BIRD GAME") print("Press space or enter to start the game")
Paso 3: inicializa la posición del pájaro y comienza el ciclo del juego
Inicialice la posición del pájaro y el nivel del mar al suelo. Agregar condiciones en el bucle define las condiciones del juego. La variable horizontal y vertical se utiliza para establecer la posición del ave. Tenemos que ejecutar el programa hasta que el usuario se detenga o salga (usando sys.exit() ), si el programa es así, creamos un ciclo while infinito.
Python3
while True: # sets the coordinates of flappy bird horizontal = int(window_width/5) vertical = int((window_height - game_images['flappybird'].get_height())/2) # for selevel ground = 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() # Exit the program 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): flappygame() # if user doesn't press anykey Nothing happen else: window.blit(game_images['background'], (0, 0)) window.blit(game_images['flappybird'], (horizontal, vertical)) window.blit(game_images['sea_level'], (ground, elevation)) # Just Refresh the screen pygame.display.update() # set the rate of frame per second framepersecond_clock.tick(framepersecond)
Paso 4: Cree una función que genere una nueva tubería de altura aleatoria
En primer lugar, tenemos que buscar la altura de la tubería usando la función getheight() . Después de esto, genera un número aleatorio entre 0 y un número (de modo que la altura de la tubería debe ser ajustable a la altura de nuestra ventana). Después de eso, creamos una lista de diccionarios que contiene las coordenadas de las tuberías superior e inferior y la devolvemos.
Python3
def createPipe(): offset = window_height/3 pipeHeight = game_images['pipeimage'][0].get_height() # generating random height of pipes y2 = offset + random.randrange( 0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset)) pipeX = window_width + 10 y1 = pipeHeight - y2 + offset pipe = [ # upper Pipe {'x': pipeX, 'y': -y1}, # lower Pipe {'x': pipeX, 'y': y2} ] return pipe
Paso 5: Ahora creamos una función GameOver() que representa si el pájaro ha golpeado las tuberías o ha caído al mar.
Según mi pensamiento, tres condiciones conducen a una situación de fin del juego. si la diferencia entre nuestra elevación y una cierta altura es menor que la vertical, significa que el ave ha cruzado sus límites, lo que resulta en un fin del juego y si el ave golpea cualquiera de los pips inferior y superior, esto también conducirá a la condición de fin del juego.
Python3
# Checking if bird is above the sealevel. def isGameOver(horizontal, vertical, up_pipes, down_pipes): if vertical > elevation - 25 or vertical < 0: return True # Checking if bird hits the upper pipe or not for pipe in up_pipes: pipeHeight = game_images['pipeimage'][0].get_height() if(vertical < pipeHeight + pipe['y'] and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()): return True # Checking if bird hits the lower pipe or not for pipe in down_pipes: if (vertical + game_images['flappybird'].get_height() > pipe['y']) and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width(): return True return False
Paso 6: Ahora crearemos nuestra función principal ( flappygame() ) que hará lo siguiente:
Inicialice las variables y cree dos tuberías mediante la función createPipe(). Cree dos listas, la primera es de tuberías inferiores y la otra es de tuberías inferiores. Definición de la velocidad de las aves, la velocidad mínima de las aves, la velocidad máxima de las aves y la velocidad de las tuberías. Maneje los eventos clave usando pygame.event.get() y verifique si el juego ha terminado o no si ha terminado el retorno de la función. Actualización de la puntuación y las imágenes del juego blit, como el fondo, la tubería y el pájaro en la ventana.
Python3
def flappygame(): your_score = 0 horizontal = int(window_width/5) vertical = int(window_width/2) ground = 0 mytempheight = 100 # Generating two pipes for blitting on window first_pipe = createPipe() second_pipe = createPipe() # List containing lower pipes down_pipes = [ {'x': window_width+300-mytempheight, 'y': first_pipe[1]['y']}, {'x': window_width+300-mytempheight+(window_width/2), 'y': second_pipe[1]['y']}, ] # List Containing upper pipes up_pipes = [ {'x': window_width+300-mytempheight, 'y': first_pipe[0]['y']}, {'x': window_width+200-mytempheight+(window_width/2), 'y': second_pipe[0]['y']}, ] pipeVelX = -4 #pipe velocity along x bird_velocity_y = -9 # bird velocity bird_Max_Vel_Y = 10 bird_Min_Vel_Y = -8 birdAccY = 1 # velocity while flapping bird_flap_velocity = -8 # It is true only when the bird is flapping bird_flapped = False while True: # Handling the key pressing events 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 vertical > 0: bird_velocity_y = bird_flap_velocity bird_flapped = True # This function will return true if the flappybird is crashed game_over = isGameOver(horizontal, vertical, up_pipes, down_pipes) if game_over: return # check for your_score playerMidPos = horizontal + game_images['flappybird'].get_width()/2 for pipe in up_pipes: pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2 if pipeMidPos <= playerMidPos < pipeMidPos + 4: # Printing the score your_score += 1 print(f"Your your_score is {your_score}") if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped: bird_velocity_y += birdAccY if bird_flapped: bird_flapped = False playerHeight = game_images['flappybird'].get_height() vertical = vertical + min(bird_velocity_y, elevation - vertical - playerHeight) # move pipes to the left for upperPipe, lowerPipe in zip(up_pipes, down_pipes): upperPipe['x'] += pipeVelX lowerPipe['x'] += pipeVelX # Add a new pipe when the first is about # to cross the leftmost part of the screen if 0 < up_pipes[0]['x'] < 5: newpipe = createPipe() up_pipes.append(newpipe[0]) down_pipes.append(newpipe[1]) # if the pipe is out of the screen, remove it if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width(): up_pipes.pop(0) down_pipes.pop(0) # Lets blit our game images now window.blit(game_images['background'], (0, 0)) for upperPipe, lowerPipe in zip(up_pipes, down_pipes): window.blit(game_images['pipeimage'][0], (upperPipe['x'], upperPipe['y'])) window.blit(game_images['pipeimage'][1], (lowerPipe['x'], lowerPipe['y'])) window.blit(game_images['sea_level'], (ground, elevation)) window.blit(game_images['flappybird'], (horizontal, vertical)) # Fetching the digits of score. numbers = [int(x) for x in list(str(your_score))] width = 0 # finding the width of score images from numbers. for num in numbers: width += game_images['scoreimages'][num].get_width() Xoffset = (window_width - width)/1.1 # Blitting the images on the window. for num in numbers: window.blit(game_images['scoreimages'][num], (Xoffset, window_width*0.02)) Xoffset += game_images['scoreimages'][num].get_width() # Refreshing the game window and displaying the score. pygame.display.update() # Set the framepersecond framepersecond_clock.tick(framepersecond)
A continuación se muestra la implementación completa:
Python3
# Import module import random import sys import pygame from pygame.locals import * # All the Game Variables window_width = 600 window_height = 499 # set height and width of window window = pygame.display.set_mode((window_width, window_height)) elevation = window_height * 0.8 game_images = {} framepersecond = 32 pipeimage = 'images/pipe.png' background_image = 'images/background.jpg' birdplayer_image = 'images/bird.png' sealevel_image = 'images/base.jfif' def flappygame(): your_score = 0 horizontal = int(window_width/5) vertical = int(window_width/2) ground = 0 mytempheight = 100 # Generating two pipes for blitting on window first_pipe = createPipe() second_pipe = createPipe() # List containing lower pipes down_pipes = [ {'x': window_width+300-mytempheight, 'y': first_pipe[1]['y']}, {'x': window_width+300-mytempheight+(window_width/2), 'y': second_pipe[1]['y']}, ] # List Containing upper pipes up_pipes = [ {'x': window_width+300-mytempheight, 'y': first_pipe[0]['y']}, {'x': window_width+200-mytempheight+(window_width/2), 'y': second_pipe[0]['y']}, ] # pipe velocity along x pipeVelX = -4 # bird velocity bird_velocity_y = -9 bird_Max_Vel_Y = 10 bird_Min_Vel_Y = -8 birdAccY = 1 bird_flap_velocity = -8 bird_flapped = False 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 vertical > 0: bird_velocity_y = bird_flap_velocity bird_flapped = True # This function will return true # if the flappybird is crashed game_over = isGameOver(horizontal, vertical, up_pipes, down_pipes) if game_over: return # check for your_score playerMidPos = horizontal + game_images['flappybird'].get_width()/2 for pipe in up_pipes: pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2 if pipeMidPos <= playerMidPos < pipeMidPos + 4: your_score += 1 print(f"Your your_score is {your_score}") if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped: bird_velocity_y += birdAccY if bird_flapped: bird_flapped = False playerHeight = game_images['flappybird'].get_height() vertical = vertical + \ min(bird_velocity_y, elevation - vertical - playerHeight) # move pipes to the left for upperPipe, lowerPipe in zip(up_pipes, down_pipes): upperPipe['x'] += pipeVelX lowerPipe['x'] += pipeVelX # Add a new pipe when the first is # about to cross the leftmost part of the screen if 0 < up_pipes[0]['x'] < 5: newpipe = createPipe() up_pipes.append(newpipe[0]) down_pipes.append(newpipe[1]) # if the pipe is out of the screen, remove it if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width(): up_pipes.pop(0) down_pipes.pop(0) # Lets blit our game images now window.blit(game_images['background'], (0, 0)) for upperPipe, lowerPipe in zip(up_pipes, down_pipes): window.blit(game_images['pipeimage'][0], (upperPipe['x'], upperPipe['y'])) window.blit(game_images['pipeimage'][1], (lowerPipe['x'], lowerPipe['y'])) window.blit(game_images['sea_level'], (ground, elevation)) window.blit(game_images['flappybird'], (horizontal, vertical)) # Fetching the digits of score. numbers = [int(x) for x in list(str(your_score))] width = 0 # finding the width of score images from numbers. for num in numbers: width += game_images['scoreimages'][num].get_width() Xoffset = (window_width - width)/1.1 # Blitting the images on the window. for num in numbers: window.blit(game_images['scoreimages'][num], (Xoffset, window_width*0.02)) Xoffset += game_images['scoreimages'][num].get_width() # Refreshing the game window and displaying the score. pygame.display.update() framepersecond_clock.tick(framepersecond) def isGameOver(horizontal, vertical, up_pipes, down_pipes): if vertical > elevation - 25 or vertical < 0: return True for pipe in up_pipes: pipeHeight = game_images['pipeimage'][0].get_height() if(vertical < pipeHeight + pipe['y'] and\ abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()): return True for pipe in down_pipes: if (vertical + game_images['flappybird'].get_height() > pipe['y']) and\ abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width(): return True return False def createPipe(): offset = window_height/3 pipeHeight = game_images['pipeimage'][0].get_height() y2 = offset + \ random.randrange( 0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset)) pipeX = window_width + 10 y1 = pipeHeight - y2 + offset pipe = [ # upper Pipe {'x': pipeX, 'y': -y1}, # lower Pipe {'x': pipeX, 'y': y2} ] return pipe # program where the game starts if __name__ == "__main__": # For initializing modules of pygame library pygame.init() framepersecond_clock = pygame.time.Clock() # Sets the title on top of game window pygame.display.set_caption('Flappy Bird Game') # Load all the images which we will use in the game # images for displaying score game_images['scoreimages'] = ( pygame.image.load('images/0.png').convert_alpha(), pygame.image.load('images/1.png').convert_alpha(), pygame.image.load('images/2.png').convert_alpha(), pygame.image.load('images/3.png').convert_alpha(), pygame.image.load('images/4.png').convert_alpha(), pygame.image.load('images/5.png').convert_alpha(), pygame.image.load('images/6.png').convert_alpha(), pygame.image.load('images/7.png').convert_alpha(), pygame.image.load('images/8.png').convert_alpha(), pygame.image.load('images/9.png').convert_alpha() ) game_images['flappybird'] = pygame.image.load( birdplayer_image).convert_alpha() game_images['sea_level'] = pygame.image.load( sealevel_image).convert_alpha() game_images['background'] = pygame.image.load( background_image).convert_alpha() game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load( pipeimage).convert_alpha(), 180), pygame.image.load( pipeimage).convert_alpha()) print("WELCOME TO THE FLAPPY BIRD GAME") print("Press space or enter to start the game") # Here starts the main game while True: # sets the coordinates of flappy bird horizontal = int(window_width/5) vertical = int( (window_height - game_images['flappybird'].get_height())/2) ground = 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): flappygame() # if user doesn't press anykey Nothing happen else: window.blit(game_images['background'], (0, 0)) window.blit(game_images['flappybird'], (horizontal, vertical)) window.blit(game_images['sea_level'], (ground, elevation)) pygame.display.update() framepersecond_clock.tick(framepersecond)
Producción:
Publicación traducida automáticamente
Artículo escrito por bansalshubhamcse21 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA