Python Snake Game Tutorial

This tutorial provides a step-by-step guide to coding the game, from installing Pygame to implementing game logic, drawing the snake, handling user input, and detecting collisions. Perfect for beginners, this project helps you enhance your Python programming skills with hands-on experience in 2D game development.

Prerequisites

First, you need to install pygame if you haven’t already:

pip install pygame

Snake Game Code

Here is the complete code for a basic Snake game:

import pygame
import time
import random

pygame.init()

# Screen dimensions
width = 800
height = 600

# Colors
black = (0, 0, 0)
white = (255, 255, 255)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# Game settings
snake_block = 10
snake_speed = 15

clock = pygame.time.Clock()

# Font settings
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

# Function to display the player's score
def display_score(score):
    value = score_font.render("Your Score: " + str(score), True, black)
    screen.blit(value, [0, 0])

# Function to draw the snake
def draw_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(screen, green, [x[0], x[1], snake_block, snake_block])

# Function to display messages on the screen
def display_message(msg, color):
    mesg = font_style.render(msg, True, color)
    screen.blit(mesg, [width / 6, height / 3])

# Main game loop
def game_loop():
    game_over = False
    game_close = False

    x1 = width / 2
    y1 = height / 2

    x1_change = 0
    y1_change = 0

    snake_list = []
    length_of_snake = 1

    foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            screen.fill(blue)
            display_message("You Lost! Press Q-Quit or C-Play Again", red)
            display_score(length_of_snake - 1)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        game_loop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= width or x1 < 0 or y1 >= height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        screen.fill(blue)
        pygame.draw.rect(screen, red, [foodx, foody, snake_block, snake_block])
        snake_head = []
        snake_head.append(x1)
        snake_head.append(y1)
        snake_list.append(snake_head)
        if len(snake_list) > length_of_snake:
            del snake_list[0]

        for x in snake_list[:-1]:
            if x == snake_head:
                game_close = True

        draw_snake(snake_block, snake_list)
        display_score(length_of_snake - 1)

        pygame.display.update()

        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
            length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

# Initialize game screen
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Snake Game')

# Start game
game_loop()

Explanation

  1. Initialization: pygame.init() initializes all the modules required for Pygame.
  2. Screen Dimensions and Colors: Set the width, height, and colors used in the game.
  3. Game Settings: Define the size of the snake block and the speed of the snake.
  4. Fonts: Define the fonts used for displaying the score and messages.
  5. Helper Functions:
    • display_score(score): Renders the score on the screen.
    • draw_snake(snake_block, snake_list): Draws the snake on the screen.
    • display_message(msg, color): Displays messages on the screen.
  6. Main Game Loop (game_loop()):
    • Handles events such as key presses and quitting the game.
    • Updates the position of the snake.
    • Checks for collisions with the walls, the snake itself, and the food.
    • Increases the length of the snake when it eats food.
    • Redraws the screen and updates the display.
  7. Game Initialization: Sets up the game window and starts the game loop.