Pygame es una biblioteca de Python que se puede usar específicamente para diseñar y crear juegos. Pygame solo admite juegos 2D creados con diferentes sprites. Pygame no es particularmente mejor para diseñar juegos, ya que es muy complejo de usar, no tiene una GUI adecuada como Unity, pero definitivamente genera lógica para proyectos más complejos.
Crearemos un juego simple con las siguientes reglas:
- El jugador solo puede moverse verticalmente.
- Además del bloque de jugador, habrá otros dos bloques.
- Uno de ellos será el bloque enemigo y otro será el bloque de puntuación.
- Si el jugador choca con el bloque enemigo, aparece la pantalla de finalización del juego, si el jugador choca con el bloque de puntuación, la puntuación aumenta y es obligatorio recopilar todos los bloques de puntuación.
Usaremos varias técnicas como el uso de funciones, variables aleatorias, varias funciones de pygame, etc.
Instalación
Antes de inicializar la biblioteca de pygame, debemos instalarla. Para instalarlo, escriba el siguiente comando en la terminal.
pip install pygame
Después de instalar la biblioteca de pygame, debemos escribir las siguientes líneas para inicializar la biblioteca de pygame:
import pygame pygame.init()
Estas líneas son bastante autoexplicativas. La función pygame.init() inicia la biblioteca pygame.
Luego necesitamos inicializar la pantalla donde queremos colocar nuestros bloques. Esto se puede hacer escribiendo las siguientes líneas:
res = (720, 720) screen = pygame.display.set_mode(res)
La tupla res contiene dos valores que definirán la resolución de nuestro juego. Luego necesitamos definir otra pantalla variable que realmente actuará como nuestro banco de trabajo. Esto se puede hacer usando pygame.display.set_mode((arg, arg)). La tupla (arg, arg) se puede almacenar en una resolución variable para reducir la carga del procesador.
Ahora necesitamos que aparezca una pantalla real cuando ejecutamos el código. Esto se puede hacer mediante un bucle for y while de la siguiente manera:
while True: for ev in pygame.event.get(): if ev.type==pygame.QUIT: pygame.quit()
El bucle while utilizado aquí se ejecuta hasta que la condición es verdadera. Definimos una variable ev que en pygame.event. Ahora, si el usuario hace clic en el botón cruzado de la ventana, la condición cambia a falsa y el ciclo while termina de eliminar la ventana actual.
A continuación se muestra la implementación.
Python3
# Python program to demonstrate # 8 bit game import pygame import sys import random # initialize the constructor pygame.init() res = (720, 720) # randomly assigns a value to variables # ranging from lower limit to upper c1 = random.randint(125, 255) c2 = random.randint(0, 255) c3 = random.randint(0, 255) screen = pygame.display.set_mode(res) clock = pygame.time.Clock() red = (255, 0, 0) green = (0, 255, 0) blue = (0, 0, 255) color_list = [red, green, blue] colox_c1 = 0 colox_c2 = 0 colox_c3 = 254 colox_c4 = 254 # randomly assigns a colour from color_list # to player player_c = random.choice(color_list) # light shade of menu buttons startl = (169, 169, 169) # dark shade of menu buttons startd = (100, 100, 100) white = (255, 255, 255) start = (255, 255, 255) width = screen.get_width() height = screen.get_height() # initial X position of player lead_x = 40 # initial y position of player lead_y = height / 2 x = 300 y = 290 width1 = 100 height1 = 40 enemy_size = 50 # defining a font smallfont = pygame.font.SysFont('Corbel', 35) # texts to be rendered on screen text = smallfont.render('Start', True, white) text1 = smallfont.render('Options', True, white) exit1 = smallfont.render('Exit', True, white) # game title colox = smallfont.render('Colox', True, (c3, c2, c1)) x1 = random.randint(width / 2, width) y1 = random.randint(100, height / 2) x2 = 40 y2 = 40 speed = 15 # score of the player count = 0 rgb = random.choice(color_list) # enemy position e_p = [width, random.randint(50, height - 50)] e1_p = [random.randint(width, width + 100), random.randint(50, height - 100)] # function for game_over def game_over(): while True: # if the player clicks the cross # button for ev in pygame.event.get(): if ev.type == pygame.QUIT: pygame.quit() if ev.type == pygame.MOUSEBUTTONDOWN: if 100 < mouse1[0] < 140 and height - 100 < mouse1[1] \ < height - 80: pygame.quit() if ev.type == pygame.MOUSEBUTTONDOWN: if width - 180 < mouse1[0] < width - 100 and height \ - 100 < mouse1[1] < height - 80: # calling function game game(lead_x, lead_y, speed, count) # fills the screen with specified colour screen.fill((65, 25, 64)) smallfont = pygame.font.SysFont('Corbel', 60) smallfont1 = pygame.font.SysFont('Corbel', 25) game_over = smallfont.render('GAME OVER', True, white) game_exit = smallfont1.render('exit', True, white) restart = smallfont1.render('restart', True, white) mouse1 = pygame.mouse.get_pos() # exit if 100 < mouse1[0] < 140 and height - 100 < mouse1[1] < height - 80: pygame.draw.rect(screen, startl, [100, height - 100, 40,20]) else: pygame.draw.rect(screen, startd, [100, height - 100, 40,20]) # restart if width - 180 < mouse1[0] < width - 100 and height - 100 < mouse1[1] < height - 80: pygame.draw.rect(screen, startl, [width - 180, height- 100, 80, 20]) else: pygame.draw.rect(screen, startd, [width - 180, height- 100, 80, 20]) screen.blit(game_exit, (100, height - 100)) # superimposes one object on other screen.blit(restart, (width - 180, height - 100)) screen.blit(game_over, (width / 2 - 150, 295)) # updates frames of the game pygame.display.update() pygame.draw.rect(screen, startd, [100, height - 100, 40, 20]) pygame.draw.rect(screen, startd, [width - 180, height - 100, 40, 50]) # function for body of the game def game( lead_y, lead_X, speed, count, ): while True: for ev in pygame.event.get(): if ev.type == pygame.QUIT: pygame.quit() # player control # keeps track of the key pressed keys = pygame.key.get_pressed() if keys[pygame.K_UP]: # if up key is pressed then the players # y pos will decrement by 10 lead_y -= 10 if keys[pygame.K_DOWN]: # if down key is pressed then the y pos # of the player is incremented by 10 lead_y += 10 screen.fill((65, 25, 64)) clock.tick(speed) # draws a rectangle on the screen rect = pygame.draw.rect(screen, player_c, [lead_x, lead_y, 40,40]) pygame.draw.rect(screen, (c1, c2, c3), [0, 0, width, 40]) pygame.draw.rect(screen, (c3, c2, c1), [0, 680, width, 40]) pygame.draw.rect(screen, startd, [width - 100, 0, 100, 40]) smallfont = pygame.font.SysFont('Corbel', 35) exit2 = smallfont.render('Exit', True, white) # exit # gets the X and y position of mouse # pointer and stores them as a tuple mouse = pygame.mouse.get_pos() if width - 100 < mouse[0] < width and 0 < mouse[1] < 40: pygame.draw.rect(screen, startl, [width - 100, 0, 100, 40]) else: pygame.draw.rect(screen, startd, [width - 100, 0, 100, 40]) if width - 100 < mouse[0] < width and 0 < mouse[1] < 40: if ev.type == pygame.MOUSEBUTTONDOWN: pygame.quit() # enemy position if e_p[0] > 0 and e_p[0] <= width: # if the enemy block's X coordinate is between 0 and # the width of the screen the X value gets # decremented by 10 e_p[0] -= 10 else: if e_p[1] <= 40 or e_p[1] >= height - 40: e_p[1] = height / 2 if e1_p[1] <= 40 or e1_p[1] >= height - 40: e1_p[1] = random.randint(40, height - 40) e_p[1] = random.randint(enemy_size, height - enemy_size) e_p[0] = width # game over # collision detection if lead_x <= e_p[0] <= lead_x + 40 and lead_y >= e_p[1] >= lead_y - 40: game_over() # checks if the player block has collided with the enemy block if lead_y <= e_p[1] + enemy_size <= lead_y + 40 and lead_x <= e_p[0] <= lead_x + 40: game_over() pygame.draw.rect(screen, red, [e_p[0], e_p[1], enemy_size,enemy_size]) if e1_p[0] > 0 and e1_p[0] <= width + 100: e1_p[0] -= 10 else: if e1_p[1] <= 40 or e1_p[1] >= height - 40: e1_p[1] = height / 2 e1_p[1] = random.randint(enemy_size, height - 40) e1_p[0] = width + 100 if lead_x <= e1_p[0] <= lead_x + 40 and lead_y >= e1_p[1] >= lead_y - 40: e1_p[0] = width + 100 e1_p[1] = random.randint(40, height - 40) count += 1 speed += 1 if lead_y <= e1_p[1] + enemy_size <= lead_y + 40 and lead_x <= e1_p[0] <= lead_x + 40: e1_p[0] = width + 100 e1_p[1] = random.randint(40, height - 40) # increases the score when blue box is hit count += 1 # increases the speed as score increases speed += 1 if count >= 45: # freezes the game FPS to 60 if # score reaches 45 or more speed = 60 if lead_y <= 38 or lead_y >= height - 38: game_over() if e1_p[0] <= 0: game_over() pygame.draw.rect(screen, blue, [e1_p[0], e1_p[1], enemy_size, enemy_size]) score1 = smallfont.render('Score:', True, white) screen.blit(score1, (width - 120, height - 40)) screen.blit(exit2, (width - 80, 0)) pygame.display.update() # intro def intro( colox_c1, colox_c2, colox, exit1, text1, text, ): intro = True while intro: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() screen.fill((65, 25, 64)) mouse = pygame.mouse.get_pos() # start screen if x < mouse[0] < x + width1 and y < mouse[1] < y + height1: # if mouse is hovered on a button # its colour shade becomes lighter pygame.draw.rect(screen, startl, [x, y, width1, height1]) else: if x < mouse[0] < x + width1 + 40 and y + 70 < mouse[1] < y \ + 70 + height1: pygame.draw.rect(screen, startl, [x, y + 70, width1+40,height1]) else: if x < mouse[0] < width1 + x and y + 140 < mouse[1] < y + 140 + height1: pygame.draw.rect(screen, startl, [x, y + 140,width1,height1]) else: pygame.draw.rect(screen, startd, [x, y, width1,height1]) pygame.draw.rect(screen, startd, [x, y + 70, width1 + 40, height1]) pygame.draw.rect(screen, startd, [x, y + 140,width1, height1]) # start button if event.type == pygame.MOUSEBUTTONDOWN: if x < mouse[0] < x + width1 and y < mouse[1] < y + height1: #music() game(lead_y, lead_x, speed, count) if event.type == pygame.MOUSEBUTTONDOWN: if x < mouse[0] < width1 + x and y + 140 < mouse[1] < y + 140 + height1: pygame.quit() # this handles the colour breezing effect if 0 <= colox_c1 <= 254 or 0 <= colox_c2 <= 254: colox_c1 += 1 colox_c2 += 1 if colox_c1 >= 254 or colox_c2 >= 254: colox_c1 = c3 colox_c2 = c3 pygame.draw.rect(screen, (c2, colox_c1, colox_c2), [0, 0, 40, height]) pygame.draw.rect(screen, (c2, colox_c1, colox_c2), [width - 40, 0, 40, height]) smallfont = pygame.font.SysFont('Corbel', 35) sig = smallfont.render('Designed by :- Antriksh', True, white) text = smallfont.render('Start', True, white) text1 = smallfont.render('Options', True, white) exit1 = smallfont.render('Exit', True, white) colox = smallfont.render('Colox', True, (c1, colox_c1, colox_c2)) screen.blit(colox, (312, 50)) screen.blit(text, (312, 295)) screen.blit(text1, (312, 365)) screen.blit(exit1, (312, 435)) screen.blit(sig, (320, height - 50)) clock.tick(60) pygame.display.update() intro( colox_c1, colox_c2, colox, exit1, text1, text, )
Producción:
Publicación traducida automáticamente
Artículo escrito por antrikshmisri y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA