Unleash Your Inner Gamer: Conquer the Snake Game with Python!


Remember the nostalgic days of playing Snake, desperately avoiding the dreaded "Game Over" screen? As youngsters, we sought out cheats to keep the game going indefinitely. But now, as tech enthusiasts, imagine having complete control over that slithering serpent, maneuvering it through ever-changing mazes and feeding it to make it grow longer.


Enter the world of Python programming and embark on a journey of creativity and skill enhancement as we build the iconic Snake game. Python, renowned for its simplicity and versatility, serves as the perfect language for this project. Even if you've never dabbled in Python before, fret not! This comprehensive article will guide you through each step, ensuring your triumph in mastering the Snake Game in Python.


What's in Store: Building the Python Snake Game


In this Python project, we dive into the captivating realm of the 'Snake game,' where players take charge of a slithering serpent. The objective is simple—guide the snake across the screen, devouring food to fuel its growth while skillfully avoiding collisions with the boundaries or its own tail. To bring this game to life, we harness the power of graphical user interface (GUI) tools such as Pygame or Tkinter.


By leveraging these tools, we unlock a multitude of exciting features, including user input integration, seamless snake movement, precise contact detection, mouthwatering food consumption, and an intelligently crafted game loop. Brace yourself for an immersive experience that not only entertains but also serves as an engaging avenue to learn game development and Python programming. Let's embark on this thrilling journey of coding our very own Snake game!


Prerequisites: Building Blocks for the Python Snake Game


Before delving into crafting the Snake game in Python, it's essential to have a solid foundation in programming and familiarity with the Python language. It is highly recommended to possess knowledge of the following key areas:

  1. Python Fundamentals: A grasp of fundamental concepts such as variables, data types, conditionals, loops, functions, and basic file input/output (I/O) in Python.
  2. Object-Oriented Programming (OOP): Understanding OOP principles like classes, objects, inheritance, and encapsulation will play a vital role in organizing the game's code structure effectively.
  3. Pygame or Tkinter: Depending on your choice of graphical package, familiarity with either Pygame or Tkinter is essential. These tools enable the creation of graphical displays and facilitate event handling for an immersive gaming experience.
  4. User Input Handling: To control the snake's movements, it's crucial to know how to capture and process user input, especially computer events, to provide responsive and intuitive gameplay.
  5. Basic Game Development Concepts: Grasping game loop mechanics, managing game states, rendering graphics, and handling collisions are fundamental to building the Snake game.
  6. 2D Arrays and Lists: Proficiency in working with 2D arrays or lists empowers you to construct the game screen and effectively track the snake's position.


While prior experience in these areas is not mandatory, a strong foundation will significantly aid in comprehending the concepts and implementing game rules proficiently. Installing an integrated development environment (IDE) like PyCharm, Visual Studio Code, or IDLE is also recommended, as it facilitates seamless code writing and execution.


Installing Pygame: Setting the Stage for Game Development


Before diving into game development with Pygame, it's crucial to have it installed on your system. Follow these simple steps to get started:


  1. Install Pygame: Execute the following command in your command prompt or terminal: pip install pygameThis command will install Pygame onto your system, enabling you to harness its power for game creation) .
  2. Import Pygame and Begin Development: Once Pygame is successfully installed, import it into your Python script and commence your game development journey. But before you jump in, let's familiarize ourselves with some essential Pygame functions used in this Snake Game, along with their descriptions:

  • init(): Initializes all imported Pygame modules (returns a tuple indicating the success and failure of initializations).
  • display.set_mode(): Creates a surface by taking a tuple or a list as its parameter (preferably a tuple).
  • update(): Updates the screen, reflecting any changes made.
  • quit(): Uninitializes everything and shuts down Pygame.
  • set_caption(): Sets the caption text on the top of the display screen.
  • event.get(): Returns a list of all events that have occurred.
  • Surface.fill(): Fills the surface with a solid color.
  • time.Clock(): Helps track time during gameplay.
  • font.SysFont(): Creates a Pygame font using the system's font resources.

For those unfamiliar with Pygame, it is a collection of cross-module Python codes designed specifically for programming video games using the Python language. With Pygame installed and the functions explained, you're now ready to unleash your creativity and embark on an exciting journey of game development using Pygame!


Creating the Game Screen: A Canvas for Adventure


To bring your game to life with Pygame, you'll need to create the game screen using the display.set_mode() function. Additionally, you'll utilize the init() and quit() methods to initialize and uninitialize Pygame at the beginning and end of your code. The update() method is crucial for reflecting any changes made to the screen.

There is another method called flip() that functions similarly to update(). The key distinction is that update() updates only the modified portions of the screen (or the entire screen if no parameters are passed). On the other hand, the flip() method refreshes the entire screen.

By leveraging these methods effectively, you'll have a dynamic canvas ready to showcase your gaming masterpiece. So, let's dive in and create the game screen that will serve as the backdrop for your thrilling adventure!


CODE:

import pygame

def main():
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.update()
pygame.quit()

if __name__ == "__main__":
main()

OUTPUT:


However, executing this code as is will result in the game screen appearing briefly before immediately closing. To address this issue, we need to implement a game loop using a while loop. By doing so, we can ensure that the game remains open until the player decides to quit. Let's enhance our code by incorporating a game loop, as shown below:

import pygame


def main():
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Snake game by Husham Abdalla')

game_over = False
while not game_over:
for event in pygame.event.get():
print(event) # Print all the actions that occur on the screen

pygame.quit()
quit()


if __name__ == "__main__":
main()
When executing this code, you will notice that the previously displayed screen will remain open, and it will also capture and display all the actions that occur on it. This behavior is achieved by utilizing the pygame.event.get() function, which retrieves and outputs the events taking place on the screen.

Furthermore, I have enhanced the user experience by setting the screen's caption as 'Snake Game by Husham Abdalla' through the pygame.display.set_caption() function. This allows players to easily identify and associate the game with its creator.

With these modifications, the game screen persists, providing continuous interactivity and feedback as it captures and displays the various actions occurring within the game.

OUTPUT:



Now that you have successfully created the screen for your Snake Game, you might notice that clicking on the close button does not close the screen as expected. This occurs because you haven't specified that the screen should exit when the close button is clicked.

To resolve this issue, Pygame provides an event called "QUIT" which indicates the user's intention to close the game window. To handle this event and exit the screen appropriately, you should incorporate the following code snippet:

import pygame

def main():
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Snake Game by Husham Abdalla')

game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True

pygame.quit()
quit()

if __name__ == "__main__":
main()

With the screen properly configured, you're ready to move on to the next step: drawing the snake on the screen. This crucial aspect will be covered in the upcoming topic. Stay tuned to discover how to bring your snake to life on the gaming canvas!


Creating the Snake: A Colorful Creature


To bring our snake to life, we will begin by initializing color variables that will be used to define the colors of the snake, food, screen, and more. Pygame follows the RGB color scheme, which stands for "Red Green Blue" By adjusting the values of these variables, you can create a wide range of colors. For example, setting all three values to 0 will result in black, while setting them all to 255 will give you white.


In our case, the snake will be represented by a rectangle. Pygame provides a convenient function called draw.rect() that allows us to draw rectangles with the desired size and color. By utilizing this function, we can easily define and render our snake on the screen, giving it a vibrant appearance.


Stay tuned as we dive into the implementation details and learn how to create a visually appealing, colorful snake using the draw.rect() function in Pygame.

import pygame


def main():
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Snake Game by Husham Abdalla')

blue = (0, 0, 255)
red = (255, 0, 0)

game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True

pygame.draw.rect(screen, blue, [200, 150, 10, 10])
pygame.display.update()

pygame.quit()
quit()


if __name__ == "__main__":
main()


OUTPUT:



As illustrated, we have successfully created the snake's head using a blue rectangle. Now, it's time to bring our snake to life by making it move dynamically on the screen. Stay tuned as we delve into the exciting next step of animating the movement of your snake!


Animating Snake Movement: Unleash the Serpent!


To enable the snake's movement, we will harness the power of key events provided by Pygame's KEYDOWN class. In particular, we will utilize the events K_UP, K_DOWN, K_LEFT, and K_RIGHT to control the snake's upward, downward, leftward, and rightward movement, respectively. By capturing and responding to these events, we can bring the snake to life, allowing players to navigate it across the screen.


Additionally, we will introduce a visual enhancement by changing the display screen from its default black color to a fresh white using the fill() method. This creates a clean canvas for our game.


To facilitate the snake's movement, new variables, x1_change and y1_change, have been introduced. These variables will store the updated values of the x and y coordinates, ensuring smooth and responsive movement of the snake.


import pygame

def main():
pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

dis = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Snake Game by Husham Abdalla')

game_over = False

x1 = 300
y1 = 300

x1_change = 0
y1_change = 0

clock = pygame.time.Clock()

while not game_over:
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 = -10
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 10
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -10
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 10
x1_change = 0

x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, 10, 10])

pygame.display.update()

clock.tick(30)

pygame.quit()
quit()

if __name__ == "__main__":
main()


OUTPUT:



When it comes to this snake game, hitting the boundaries of the screen spells game over for the player. To enforce this rule, I have incorporated an 'if' statement that sets limits on the x and y coordinates of the snake. These limits ensure that the snake's position remains within the boundaries of the screen. Notably, I have replaced hardcoded values with variables, allowing for effortless modification of the game in the future.


import pygame
import time

pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Husham Abdalla')

game_over = False

x1 = dis_width / 2
y1 = dis_height / 2

snake_block = 10

x1_change = 0
y1_change = 0

clock = pygame.time.Clock()
snake_speed = 30

font_style = pygame.font.SysFont(None, 50)


def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 2, dis_height / 2])


while not game_over:
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 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_over = True

x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])

pygame.display.update()

clock.tick(snake_speed)

message("You lost", red)
pygame.display.update()
time.sleep(2)

pygame.quit()
quit()


OUTPUT:


Introducing the Delectable Food: A Treat for the Snake!


In this exciting section,  we will introduce mouth-watering food for our snake to devour. As the snake crosses over the food, a delightful message, 'Yummy!!', will appear, adding an extra layer of satisfaction to the gameplay experience.


Additionally, I have made a small but important change to enhance the user experience. Now, when the player unfortunately loses the game, they will be presented with two options: the ability to gracefully quit the game or to embark on a new challenge by playing again. This empowers the player with more control and offers a chance for redemption.


import pygame
import time
import random

pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)

dis_width = 800
dis_height = 600

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Husham Abdalla')

clock = pygame.time.Clock()

snake_block = 10
snake_speed = 30

font_style = pygame.font.SysFont(None, 30)


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


def gameLoop():
game_over = False
game_close = False

x1 = dis_width // 2
y1 = dis_height // 2

x1_change = 0
y1_change = 0

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

while not game_over:

while game_close:
dis.fill(white)
message("You Lost! Press Q to Quit or C to Play Again", 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 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True

x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
pygame.display.update()

if x1 == foodx and y1 == foody:
print("Yummy!!")
clock.tick(snake_speed)

pygame.quit()
quit()


gameLoop()


OUTPUT:



Terminal:


Expanding the Snake's Length: A Feast for the Senses!


In this exciting code segment, we unlock the ability for our snake to grow in size when it devours the delectable food. With each successful feeding, the snake's length will increase, adding an extra layer of challenge and satisfaction to the gameplay.

However, be wary! If the snake collides with its own body, the game comes to an abrupt end. In such a scenario, a poignant message, 'You Lost! Press Q to Quit or C to Play Again' will be displayed, offering the player a choice to gracefully exit or embark on a new endeavor.

The snake's length is cleverly managed using a list, with the initial size set to one block as specified in the following code. This allows for dynamic growth and a captivating gameplay experience.

import pygame
import random

pygame.init()

# Set up 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 up display dimensions
dis_width = 600
dis_height = 400

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Husham Abdalla')

clock = pygame.time.Clock()

# Set up snake properties
snake_block = 10
snake_speed = 15

# Set up fonts
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)


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


def message(msg, color):
# Display a message on the screen
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])


def gameLoop():
game_over = False
game_close = False

x1 = dis_width / 2
y1 = dis_height / 2

x1_change = 0
y1_change = 0

snake_List = []
Length_of_snake = 1

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

while not game_over:

while game_close:
# Display the game over message
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 >= dis_width or x1 < 0 or y1 >= dis_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:
# Generate new food and increase snake length
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1

clock.tick(snake_speed)

pygame.quit()
quit()


gameLoop()


OUTPUT:


Presenting the Score:

Finally, we arrive at a crucial aspect: showcasing the player's score. For this purpose, I've implemented a new function called "DisplayScore". This function effectively exhibits the length of the snake, subtracting 1 from it as the initial size of the snake.

By integrating the "DisplayScore" function into our game, players can easily keep track of their progress and accomplishments throughout their gameplay journey. It adds an extra layer of motivation and competition, fostering an immersive and engaging experience.


import pygame
import random

pygame.init()

# Set up 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 up display dimensions
DIS_WIDTH = 600
DIS_HEIGHT = 400

DIS = pygame.display.set_mode((DIS_WIDTH, DIS_HEIGHT))
pygame.display.set_caption('Snake Game by Husham Abdalla')

CLOCK = pygame.time.Clock()

# Set up snake properties
SNAKE_BLOCK = 10
SNAKE_SPEED = 15

# Set up fonts
FONT_STYLE = pygame.font.SysFont("bahnschrift", 25)
SCORE_FONT = pygame.font.SysFont("comicsansms", 35)


def display_score(score):
# Display the player's score
value = SCORE_FONT.render("Your Score: " + str(score), True, YELLOW)
DIS.blit(value, [0, 0])


def draw_snake(snake_block, snake_list):
# Draw the snake on the screen
for x in snake_list:
pygame.draw.rect(DIS, BLACK, [x[0], x[1], snake_block, snake_block])


def display_message(msg, color):
# Display a message on the screen
mesg = FONT_STYLE.render(msg, True, color)
DIS.blit(mesg, [DIS_WIDTH / 6, DIS_HEIGHT / 3])


def game_loop():
game_over = False
game_close = False

x1 = DIS_WIDTH / 2
y1 = DIS_HEIGHT / 2

x1_change = 0
y1_change = 0

snake_list = []
length_of_snake = 1

foodx = round(random.randrange(0, DIS_WIDTH - SNAKE_BLOCK) / 10.0) * 10.0
foody = round(random.randrange(0, DIS_HEIGHT - SNAKE_BLOCK) / 10.0) * 10.0

while not game_over:

while game_close:
# Display the game over message
DIS.fill(BLUE)
display_message("You Lost! Press C-Play Again or Q-Quit", 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 >= DIS_WIDTH or x1 < 0 or y1 >= DIS_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

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

pygame.display.update()

if x1 == foodx and y1 == foody:
# Generate new food and increase snake length
foodx = round(random.randrange(0, DIS_WIDTH - SNAKE_BLOCK) / 10.0) * 10.0
foody = round(random.randrange(0, DIS_HEIGHT - SNAKE_BLOCK) / 10.0) * 10.0
length_of_snake += 1

CLOCK.tick(SNAKE_SPEED)

pygame.quit()
quit()


game_loop()

OUTPUT :


Enhance Your Game: Exciting Features to Elevate the Snake Game Experience


Looking to make your Snake game more captivating and enjoyable? Here are some fantastic suggestions to consider:

  • Progressive Challenges: Incorporate different levels with increasing difficulty. Introduce barriers or boost the snake's speed as the game progresses.
  • Power-ups: Introduce special items that temporarily benefit the player, such as speeding up the snake, increasing its length, or allowing it to pass through walls.
  • Special Food: Create occasional appearances of unique food items that grant the snake extra points or special abilities when consumed.
  • Leaderboard: Implement a system to track and display the highest scores. Store the scores in a file or database and present a ranking of top performers.
  • Sound Effects and Music: Enhance the game's audio experience by adding sound effects for different actions, like eating food, collisions, or level completion. Consider background music to further immerse players.
  • Customizable Options: Offer players the ability to personalize game settings, such as snake speed, screen size, or color schemes, to suit their preferences.
  • Two-Player Mode: Introduce a multiplayer mode where two individuals can compete on the same screen, each controlling their own snake.
  • Game Over Animations: When the game concludes, incorporate animations or visual effects like explosions or a score display to add excitement and visual appeal.
  • Bonus Challenge: Integrate bonus tasks or mini-games within the main game, allowing players to earn extra points or prizes.
  • Mobile Compatibility: Optimize the game's settings and layout to ensure seamless gameplay on touchscreen devices.


Remember, the feasibility of implementing these features depends on your computer skills, time availability, and chosen graphics library. Start by ensuring the core functionality of the game and gradually introduce these enhancements to create an exceptional gaming experience.


We hope you found this article on Snake Game in Python informative and insightful. Practice extensively and share your experiences with us. If you have any questions, feel free to leave them in the comments section, and we'll respond promptly.