Debugging the Slither: My Journey to Build a Basic Snake Game in Python (and Why It Keeps Crashing)

Struggling to code a basic Snake game in Python? Dive into common pitfalls, debugging tips, and solutions to keep your game from crashing and level up your programming skills!
Debugging the Slither: My Journey to Build a Basic Snake Game in Python (and Why It Keeps Crashing)

Creating a Basic Snake Game in Python

Introduction

Programming a simple snake game in Python is an exciting project that can help you develop your coding skills. However, many beginners face challenges, such as crashes or bugs, when trying to implement their first game. In this guide, we will present a straightforward approach to creating a snake game using the Pygame library, while also addressing common issues that might cause your game to crash.

Setting Up Your Environment

Before diving into the code, ensure you have Python installed on your system. If you haven't installed Pygame yet, you can do so using pip. Open your command line interface and type:

pip install pygame

This command will download and install Pygame, a popular library for building games in Python.

Basic Structure of the Game

The snake game consists of a few key components: the game window, the snake, the food, and the game loop. Below is a simplified version of the code:


import pygame
import time
import random

pygame.init()

# Define colors
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# Set display dimensions
width = 600
height = 400
dis = pygame.display.set_mode((width, height))
pygame.display.set_caption('Snake Game')

# Game clock
clock = pygame.time.Clock()

# Snake settings
snake_block = 10
snake_speed = 15

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

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [width / 6, height / 3])

def gameLoop():
    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:
            dis.fill(blue)
            message("You Lost! Press C-Play Again or Q-Quit", red)
            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:
                        gameLoop()

        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
        dis.fill(blue)
        pygame.draw.rect(dis, green, [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

        our_snake(snake_block, snake_List)
        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()

gameLoop()

Troubleshooting Common Issues

If your game crashes, check for the following common issues:

  • Indents and Syntax: Ensure your code is properly indented. Python relies on indentation to define code blocks.
  • Pygame Initialization: Always initialize Pygame with pygame.init() before any other Pygame functions.
  • Event Loop: Ensure your event loop is correctly set up to handle quit events and keypresses.
  • Game Logic: Make sure your game logic properly handles collisions and boundaries to avoid crashing.

Conclusion

Creating a simple snake game in Python is a great way to practice your programming skills. By following the steps outlined above and paying attention to common pitfalls, you can create a fun and functional game. Don't hesitate to modify the code to add features like scoring, levels, or enhanced graphics. Happy coding!