8-bit game using pygame - GeeksforGeeks

02 Sep, 2021
Pygame is a python library that can be used specifically to design and build games. Pygame supports only 2d games that are built using different sprites. Pygame is not particularly best for designing games as it is very complex to use doesn’t have a proper GUI like unity but it definitely builds logic for further complex projects.We’ll be creating a simple game with the following rules:- 
The player can only move vertically.  
Other than player block there will be two other blocks.  
One of them will be the enemy block and one of them will be score block.  
If the player collides with the enemy block then the game over screen pops up, if the player collides with the score block the score is incremented and it is compulsory to collect all score blocks.  
We’ll be using various techniques such as the use of functions, random variables, various pygame functions etc. 
Before initializing pygame library we need to install it. To install it type the below command in the terminal. 
pip install pygame
After installing the pygame library we need to write the following lines to initialize the pygame library:- 
import pygame
pygame.init()
These lines are pretty self explanatory. The pygame.init() function initiates the pygame library.Then we need to initialize the screen where we want to place our blocks. This can be done by writing following lines:- 
res = (720, 720)
screen = pygame.display.set_mode(res)
The tuple res holds two values that will define the resolution of our game. Then we need to define another variable screen that will actually act as our workbench. This can be done by using pygame.display.set_mode((arg, arg)). The tuple (arg, arg) can be stored into a variable res to reduce processor load.Now we need an actual screen to pop up when we run the code this can be done by a for and while loop in following way:- 
while True:
for ev in pygame.event.get():
if ev.type==pygame.QUIT:
pygame.quit()
The while loop used here run till the condition is true. We define a variable ev that in pygame.event. Now if the user clicks on the cross button of the window the condition is changed to false and the while loop ends killing the current window.Below is the implementation.  
Python3
# Python program to demonstrate# 8 bit game  import pygameimport sysimport random  # initialize the constructorpygame.init()res = (720, 720) # randomly assigns a value to variables# ranging from lower limit to upperc1 = 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 = 0colox_c2 = 0colox_c3 = 254colox_c4 = 254 # randomly assigns a colour from color_list# to playerplayer_c = random.choice(color_list) # light shade of menu buttonsstartl = (169, 169, 169)  # dark shade of menu buttonsstartd = (100, 100, 100) white = (255, 255, 255)start = (255, 255, 255)width = screen.get_width()height = screen.get_height() # initial X position of playerlead_x = 40 # initial y position of playerlead_y = height / 2x = 300y = 290width1 = 100height1 = 40enemy_size = 50 # defining a fontsmallfont = pygame.font.SysFont('Corbel', 35) # texts to be rendered on screentext = smallfont.render('Start', True, white)text1 = smallfont.render('Options', True, white)exit1 = smallfont.render('Exit', True, white) # game titlecolox = smallfont.render('Colox', True, (c3, c2, c1)) x1 = random.randint(width / 2, width)y1 = random.randint(100, height / 2)x2 = 40y2 = 40speed = 15 # score of the playercount = 0 rgb = random.choice(color_list) # enemy positione_p = [width, random.randint(50, height - 50)] e1_p = [random.randint(width, width + 100), random.randint(50, height        - 100)]   # function for game_overdef 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 gamedef 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()    # introdef 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,    )
Output: 
Media error: Format(s) not supported or source(s) not found
 
sagartomar9927
Python-PyGame
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python Dictionary
Read a file line by line in Python
How to Install PIP on Windows ?
Enumerate() in Python
Different ways to create Pandas Dataframe
Iterate over a list in Python
Python String | replace()
*args and **kwargs in Python
Reading and Writing to text files in Python
Create a Pandas DataFrame from Lists