Snake Game in Python – Using Pygame module

04 Jan, 2022
Snake game is one of the most popular arcade games of all time. In this game, the main objective of the player is to catch the maximum number of fruits without hitting the wall or itself. Creating a snake game can be taken as a challenge while learning Python or Pygame. It is one of the best beginner-friendly projects that every novice programmer should take as a challenge. Learning to build a video game is kinda interesting and fun learning. 
We will be using Pygame to create this snake game. Pygame is an open-source library that is designed for making video games. It has inbuilt graphics and sounds libraries. It is also beginner-friendly, and cross-platform. 
To install Pygame, you need to open up your terminal or command prompt and type the following command:
pip install pygame
After installing Pygame we are ready to create our cool snake game.
Snake Game Using Python & Pygame | GeeksforGeeks - YouTubeGeeksforGeeks532K subscribersSnake Game Using Python & Pygame | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 51:51•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=SUtHKHwUKT4" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
Step 1: Firstly we are importing the necessary libraries.
After that, we are defining the width and height of the window in which the game will be played.
And define the color in RGB format that we are going to use in our game for displaying text.
Python3
# importing librariesimport pygameimport timeimport random snake_speed = 15 # Window sizewindow_x = 720window_y = 480 # defining colorsblack = pygame.Color(0, 0, 0)white = pygame.Color(255, 255, 255)red = pygame.Color(255, 0, 0)green = pygame.Color(0, 255, 0)blue = pygame.Color(0, 0, 255)
  Step 2: After importing libraries we need to initialize Pygame using pygame.init() method. 
Create a game window using the width and height defined in the previous step.
Here pygame.time.Clock() will be used further in the main logic of the game to change the speed of the snake.
Python3
# Initialising pygamepygame.init() # Initialise game windowpygame.display.set_caption('GeeksforGeeks Snakes')game_window = pygame.display.set_mode((window_x, window_y)) # FPS (frames per second) controllerfps = pygame.time.Clock()
  Step 3: Initialize snake position and its size.
After initializing snake position, initialize the fruit position randomly anywhere in the defined height and width.
By setting direction to RIGHT we ensure that, whenever a user runs the program/game, the snake must move right to the screen.
Python3
# defining snake default positionsnake_position = [100, 50] # defining first 4 blocks of snake# bodysnake_body = [  [100, 50],                [90, 50],                [80, 50],                [70, 50]            ]# fruit positionfruit_position = [random.randrange(1, (window_x//10)) * 10,                  random.randrange(1, (window_y//10)) * 10]fruit_spawn = True # setting default snake direction# towards rightdirection = 'RIGHT'change_to = direction
 Step 4: Create a function to display the score of the player. 
In this function, firstly we’re creating a font object i.e. the font color will go here.
Then we are using render to create a background surface that we are going to change whenever our score updates.
Create a rectangular object for the text surface object (where text will be refreshed)
Then, we are displaying our score using blit. blit takes two argument screen.blit(background,(x,y))
Python3
# initial scorescore = 0 # displaying Score functiondef show_score(choice, color, font, size):       # creating font object score_font    score_font = pygame.font.SysFont(font, size)         # create the display surface object    # score_surface    score_surface = score_font.render('Score : ' + str(score), True, color)         # create a rectangular object for the    # text surface object    score_rect = score_surface.get_rect()         # displaying text    game_window.blit(score_surface, score_rect)
 Step 5: Now create a game over function that will represent the score after the snake is hit by a wall or itself. 
In the first line, we are creating a font object to display scores.
Then we are creating text surfaces to render scores.
After that, we are setting the position of the text in the middle of the playable area.
Display the scores using blit and updating the score by updating the surface using flip().
We are using sleep(2) to wait for 2 seconds before closing the window using quit().
Python3
# game over functiondef game_over():       # creating font object my_font    my_font = pygame.font.SysFont('times new roman', 50)         # creating a text surface on which text    # will be drawn    game_over_surface = my_font.render('Your Score is : ' + str(score), True, red)         # create a rectangular object for the text    # surface object    game_over_rect = game_over_surface.get_rect()         # setting position of the text    game_over_rect.midtop = (window_x/2, window_y/4)         # blit will draw the text on screen    game_window.blit(game_over_surface, game_over_rect)    pygame.display.flip()         # after 2 seconds we will quit the    # program    time.sleep(2)         # deactivating pygame library    pygame.quit()         # quit the program    quit()
Step 6: Now we will be creating our main function that will do the following things:
We will be validating the keys that will be responsible for the movement of the snake, then we will be creating a special condition that the snake should not be allowed to move in the opposite direction instantaneously.
After that, if snake and fruit collide we will be incrementing the score by 10 and new fruit will be spanned.
After that, we are checking that is the snake hit with a wall or not. If a snake hits a wall we will call game over function.
If the snake hits itself, the game over function will be called.
And in the end, we will be displaying the scores using the show_score function created earlier.
Python3
# Main Functionwhile True:       # handling key events    for event in pygame.event.get():        if event.type == pygame.KEYDOWN:            if event.key == pygame.K_UP:                change_to = 'UP'            if event.key == pygame.K_DOWN:                change_to = 'DOWN'            if event.key == pygame.K_LEFT:                change_to = 'LEFT'            if event.key == pygame.K_RIGHT:                change_to = 'RIGHT'     # If two keys pressed simultaneously    # we don't want snake to move into two directions    # simultaneously    if change_to == 'UP' and direction != 'DOWN':        direction = 'UP'    if change_to == 'DOWN' and direction != 'UP':        direction = 'DOWN'    if change_to == 'LEFT' and direction != 'RIGHT':        direction = 'LEFT'    if change_to == 'RIGHT' and direction != 'LEFT':        direction = 'RIGHT'     # Moving the snake    if direction == 'UP':        snake_position[1] -= 10    if direction == 'DOWN':        snake_position[1] += 10    if direction == 'LEFT':        snake_position[0] -= 10    if direction == 'RIGHT':        snake_position[0] += 10     # Snake body growing mechanism    # if fruits and snakes collide then scores will be    # incremented by 10    snake_body.insert(0, list(snake_position))    if snake_position[0] == fruit_position[0] and snake_position[1] == fruit_position[1]:        score += 10        fruit_spawn = False    else:        snake_body.pop()             if not fruit_spawn:        fruit_position = [random.randrange(1, (window_x//10)) * 10,                          random.randrange(1, (window_y//10)) * 10]             fruit_spawn = True    game_window.fill(black)         for pos in snake_body:        pygame.draw.rect(game_window, green, pygame.Rect(          pos[0], pos[1], 10, 10))             pygame.draw.rect(game_window, white, pygame.Rect(      fruit_position[0], fruit_position[1], 10, 10))     # Game Over conditions    if snake_position[0] < 0 or snake_position[0] > window_x-10:        game_over()    if snake_position[1] < 0 or snake_position[1] > window_y-10:        game_over()         # Touching the snake body    for block in snake_body[1:]:        if snake_position[0] == block[0] and snake_position[1] == block[1]:            game_over()         # displaying score countinuously    show_score(1, white, 'times new roman', 20)         # Refresh game screen    pygame.display.update()     # Frame Per Second /Refresh Rate    fps.tick(snake_speed)
 Below is the Implementation 
Python3
# importing librariesimport pygameimport timeimport random snake_speed = 15 # Window sizewindow_x = 720window_y = 480 # defining colorsblack = pygame.Color(0, 0, 0)white = pygame.Color(255, 255, 255)red = pygame.Color(255, 0, 0)green = pygame.Color(0, 255, 0)blue = pygame.Color(0, 0, 255) # Initialising pygamepygame.init() # Initialise game windowpygame.display.set_caption('GeeksforGeeks Snakes')game_window = pygame.display.set_mode((window_x, window_y)) # FPS (frames per second) controllerfps = pygame.time.Clock() # defining snake default positionsnake_position = [100, 50] # defining first 4 blocks of snake bodysnake_body = [[100, 50],              [90, 50],              [80, 50],              [70, 50]              ]# fruit positionfruit_position = [random.randrange(1, (window_x//10)) * 10,                  random.randrange(1, (window_y//10)) * 10] fruit_spawn = True # setting default snake direction towards# rightdirection = 'RIGHT'change_to = direction # initial scorescore = 0 # displaying Score functiondef show_score(choice, color, font, size):       # creating font object score_font    score_font = pygame.font.SysFont(font, size)         # create the display surface object    # score_surface    score_surface = score_font.render('Score : ' + str(score), True, color)         # create a rectangular object for the text    # surface object    score_rect = score_surface.get_rect()         # displaying text    game_window.blit(score_surface, score_rect) # game over functiondef game_over():       # creating font object my_font    my_font = pygame.font.SysFont('times new roman', 50)         # creating a text surface on which text    # will be drawn    game_over_surface = my_font.render(        'Your Score is : ' + str(score), True, red)         # create a rectangular object for the text    # surface object    game_over_rect = game_over_surface.get_rect()         # setting position of the text    game_over_rect.midtop = (window_x/2, window_y/4)         # blit will draw the text on screen    game_window.blit(game_over_surface, game_over_rect)    pygame.display.flip()         # after 2 seconds we will quit the program    time.sleep(2)         # deactivating pygame library    pygame.quit()         # quit the program    quit()  # Main Functionwhile True:         # handling key events    for event in pygame.event.get():        if event.type == pygame.KEYDOWN:            if event.key == pygame.K_UP:                change_to = 'UP'            if event.key == pygame.K_DOWN:                change_to = 'DOWN'            if event.key == pygame.K_LEFT:                change_to = 'LEFT'            if event.key == pygame.K_RIGHT:                change_to = 'RIGHT'     # If two keys pressed simultaneously    # we don't want snake to move into two    # directions simultaneously    if change_to == 'UP' and direction != 'DOWN':        direction = 'UP'    if change_to == 'DOWN' and direction != 'UP':        direction = 'DOWN'    if change_to == 'LEFT' and direction != 'RIGHT':        direction = 'LEFT'    if change_to == 'RIGHT' and direction != 'LEFT':        direction = 'RIGHT'     # Moving the snake    if direction == 'UP':        snake_position[1] -= 10    if direction == 'DOWN':        snake_position[1] += 10    if direction == 'LEFT':        snake_position[0] -= 10    if direction == 'RIGHT':        snake_position[0] += 10     # Snake body growing mechanism    # if fruits and snakes collide then scores    # will be incremented by 10    snake_body.insert(0, list(snake_position))    if snake_position[0] == fruit_position[0] and snake_position[1] == fruit_position[1]:        score += 10        fruit_spawn = False    else:        snake_body.pop()             if not fruit_spawn:        fruit_position = [random.randrange(1, (window_x//10)) * 10,                          random.randrange(1, (window_y//10)) * 10]             fruit_spawn = True    game_window.fill(black)         for pos in snake_body:        pygame.draw.rect(game_window, green,                         pygame.Rect(pos[0], pos[1], 10, 10))    pygame.draw.rect(game_window, white, pygame.Rect(        fruit_position[0], fruit_position[1], 10, 10))     # Game Over conditions    if snake_position[0] < 0 or snake_position[0] > window_x-10:        game_over()    if snake_position[1] < 0 or snake_position[1] > window_y-10:        game_over()     # Touching the snake body    for block in snake_body[1:]:        if snake_position[0] == block[0] and snake_position[1] == block[1]:            game_over()     # displaying score countinuously    show_score(1, white, 'times new roman', 20)     # Refresh game screen    pygame.display.update()     # Frame Per Second /Refresh Rate    fps.tick(snake_speed)
Output:
Snake using Pygame
sagartomar9927
sumitgumber28
simmytarika5
as5853535
Picked
Python-projects
Python-PyGame
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.