cellphone my mom had is carefully associated to the sport it had. Sure, the classical snake recreation, so easy but so addicting. I keep in mind taking part in this recreation on finish on my mom’s cellphone, shedding after which making an attempt many times!
On this article, we are going to study to construct a easy Snake Recreation. We are going to use Python’s turtle module with a view to generate this recreation. Word that it is a inexperienced persons to intermediate degree Python tutorial, and expects the reader to be accustomed to Python fundamentals similar to features and loops, importing and accessing modules, and utilizing conditional statements. It additionally requires one to have a surface-level understanding of Object Oriented Programming, particularly creating objects cases from lessons. For the sake of simplicity, I’ll clarify each line of code. Let’s get began!
Understanding the Recreation
The classical Snake recreation includes a small snake with a plain background. Meals is supplied on the display. Because the snake eats the meals, it grows in dimension, and the rating will increase. As quickly because the snake collides with the boundary wall or itself, the sport ends, and one loses.
With the intention to code this recreation in Python, we might want to tackle the next factors:
- Organising the Recreation Display – within the classical Snake recreation, the background is a uninteresting neon yellow-green display
- Creating the Snake physique – the sport begins with a small black snake, which steadily will increase in dimension because it eats the meals
- Transferring the Snake – the snake can transfer within the 4 instructions: up, down, left, and proper via the arrow keys on the keyboard or corresponding buttons on the cellphone
- Creating the Meals – the meals for the snake seems at random areas on the display
- The Snake consuming the Meals – because the snake’s physique collides with the meals created, the rating is elevated in addition to the size of the snake, and new meals is generated randomly, and the sport continues.
- The Snake Colliding with itself or the Boundary Wall – if the snake’s physique collides with itself or the boundary of the sport display, the sport ends.
Allow us to begin coding.
Organising the Recreation Display
First issues first, we are going to create a brand new mission in our IDE, let’s name it “Snake Game”. I’m utilizing PyCharm to code. Subsequent, we are going to create a brand new “snake game.py” file. Initially, we are going to import the Turtle module, particularly its Display and Turtle lessons.
from turtle import Display, TurtleThe Turtle Module is a built-in Python package deal that permits one to attract shapes, traces, patterns, and animations on a display via code. The module works as if there’s a turtle with a brush on its again, and no matter you command it to go to, it’ll go there, thereby creating drawings. You’ll be able to ask the turtle to maneuver ahead, to show left by a sure angle, draw a circle and so forth. The turtle will draw precisely that, and it’s a simple instrument to visualise one’s code. It helps practising variables, loops, features, coordinates, and primary animation logic with prompt visible outputs.
You’ll be able to take a look at the Turtle Official Documentation right here.
As might be seen within the line of code above, now we have imported two parts: Display and Turtle. These are lessons which are outlined within the module. In Python, a category is a blueprint used to create objects. Turtle and Display are lessons which will likely be used to create corresponding objects. These objects can have attributes (variables) and strategies (features) as outlined of their blueprint, with the availability of customization.
Allow us to first create the background for our recreation. We are going to use the Display class for this objective and customise it in accordance with our necessities. For reference, examine the Display strategies from the official documentation right here.
#Organising the Recreation Display
display = Display()
display.setup(width=600, top=600)
display.bgcolor("green yellow")
display.title("Snake Game")
display.tracer(0)
display.exitonclick()As might be seen within the code above, we first created the display object from the Display Class. Subsequent, now we have used the setup() methodology of the Display class and set the width of the Recreation Display to 600×600. We now have custom-made the background shade to “green yellow” utilizing the bgcolor() methodology. The title of the colour might be discovered via this hyperlink. I chosen the colour that carefully resembled the colour within the authentic recreation. After that, now we have named the display “Snake Game” utilizing the title() methodology. The tracer() methodology from the Turtle class lets us management the animation. By giving an argument of “0”, now we have turned it off. This will likely be higher understood after we create the snake and meals. Lastly, now we have used the exitonclick() methodology to set the window to shut solely after we click on on it. In any other case, the window closes as quickly because it pops up and executes the entire code.
Working the code above would output the next:

Creating the Snake Physique
As soon as now we have created the Recreation Display, the subsequent job is to create the snake. The snake will even be created utilizing the Turtle class. We are going to create 3 turtle objects that received’t resemble a turtle in any respect. Quite, they are going to be sq. segments, and when positioned collectively, will resemble a snake’s physique, similar to within the recreation. For this objective, we are going to use a for loop to create the three segments. Every phase will likely be positioned at a specified place. Allow us to code this:
#Creating the Snake
segments = []
starting_positions = [(0,0), (-20,0), (-40,0)]
for place in starting_positions:
new_segment = Turtle("square")
new_segment.shade("black")
new_segment.penup()
new_segment.shapesize(1,1)
new_segment.goto(place)
segments.append(new_segment)
display.replace()Within the code above, we first created an empty checklist of segments. This checklist will comprise the snake segments. As soon as the snake segments are created, it’ll consist of three segments, and each time the snake eats its meals, the variety of segments will improve. We now have created a tuple starting_positions. It will comprise 3 positions specified by way of their x and y coordinates, and would be the positions the place the snake segments will likely be created. We are going to create the primary phase at (0,0), the second at (-20,0), and the third phase at (-40,0). Utilizing the for loop, now we have created 3 segments from the variable new_segment as a turtle object, of sq. form and commonplace dimension 20×20. The arguments to shapesize() methodology is given as 1×1 because it stretches the scale of the drawing cursor relative to its default 20×20 pixel dimension. The penup() methodology permits us to cover the pen, and simply output the form of the turtle object. The goto() methodology permits us to create the form ranging from that place. Lastly, now we have appended the newly created phase to the empty checklist we created at first of this code block. On this manner, 2 extra segments will likely be created as there are 2 extra positions within the starting_positions tuple.
In the long run, we are going to replace our display in order that it now exhibits each the custom-made display and the newly created snake. This would be the output:

Discover that now we have created the segments utilizing simply the for loop. As we go forward in our program, we might want to improve the snake’s segments because it eats the meals. With the intention to make this addition handy to us, allow us to modify the code block and add a operate referred to as add_segments, to create the snake in addition to use it later when including segments to the snake when it eats the meals. This will likely be a greater strategy to programming within the present state of affairs:
#Creating the Snake
segments = []
starting_positions = [(0,0), (-20,0), (-40,0)]
#Including Segments Perform
def add_segments(place):
new_segment = Turtle("square")
new_segment.shade("black")
new_segment.penup()
new_segment.goto(place)
segments.append(new_segment)
for place in starting_positions:
add_segments(place)
display.replace()Within the above code block, now we have completed precisely what we have been beforehand doing, that’s, creating the snake physique, besides that now we have used a Python operate to take action. We now have outlined a operate referred to as add_segments, whose objective is simply so as to add the segments to the snake’s physique, and the segments checklist. Furthermore, now’s the place the display’s tracer() methodology comes to make use of. In case you remark out the display.tracer() line that we added within the begining you will note the animation of the snake’s physique being created one phase at a time (and we don’t need that in our recreation!). This may higher be visualized by first importing the time module and utilizing the sleep() operate. The animation will likely be extra seen.
import time
#Maintain the remainder of the code similar
for place in starting_positions:
add_segments(place)
time.sleep(1)
display.replace()Snake Motion
The following job is to code the snake’s motion. To start with, allow us to simply make the snake transfer ahead. We are going to first create a variable game_is_on that will likely be True so long as the sport is working, and will likely be switched to False as soon as we lose or the sport ends. This variable will likely be used within the whereas loop. So long as the sport is on, the snake will proceed shifting, and we are going to solely be capable to change its path utilizing the arrow keys. That is going to be the a part of our program that may maintain the sport on.
Now comes the complicated half. To maneuver the snake ahead, we have to transfer all of its segments forward. The way in which to make your complete snake physique transfer ahead is by making every phase, apart from the primary one, to maneuver to the one earlier than it. Which means that firstly, when the snake is simply 3 segments lengthy, phase 3 will transfer to the place of phase 2, and phase 2 will transfer to the place of phase 1, and phase 1 will transfer ahead utilizing the turtle ahead() methodology. This may be coded within the for loop, by giving it a beginning worth of the final factor of the checklist, which is the factor on the 2nd place (checklist parts begin from 0, thus 0, 1, 2) when the snake is created (having 3 segments) or in any other case calculated because the size of the segments, minus 1. The for loop will finish at place 0, and as it’s shifting in reverse, we are going to give it a step dimension of -1. This entire state of affairs is coded as beneath:
game_is_on = True
whereas game_is_on:
display.replace()
time.sleep(0.1)
for seg_num in vary(len(segments)-1, 0, -1):
new_x = segments[seg_num - 1].xcor()
new_y = segments[seg_num - 1].ycor()
segments[seg_num].goto(new_x, new_y)
segments[0].ahead(20)Discover that now we have added the display’s replace() methodology, in addition to outlined the pace of the snake utilizing the time module’s sleep() operate. By giving it an argument of 0.1, the snake segments will transfer ahead with a time delay of 0.1 seconds, and this pace might be adjusted. If given an argument of 1, the time delay will likely be 1 second, and the pace of the snake will likely be gradual. You’ll be able to experiment with the snake’s pace by altering the values given to the sleep() operate.
The within of the for loop elaborates how the segments will transfer to the earlier segments’ place utilizing its coordinates. And on the finish, now we have the primary phase of our snake shifting forward by 20 utilizing the turtle’s ahead() methodology. Working our code would output a shifting snake:

Controlling the Snake
Now that now we have seen find out how to make the snake transfer, the subsequent factor is to manage the up/down/left/proper actions of the snake. For this, we are going to use the display listeners. We are going to code this system in order that on urgent the up, down, left, and proper keys, the snake will transfer accordingly by altering its head.
Yet another characteristic that we have to add, taking it from the unique snake recreation, is that when the snake is shifting left, it can’t instantly flip proper, when it’s shifting up, it can’t instantly flip downwards. In brief, the snake can’t flip 180 levels from the place it’s shifting. Allow us to add this characteristic to our code. Be certain that so as to add these traces of code earlier than the sport’s whereas loop we coded earlier.
#Controlling the Snake
display.pay attention()
def turn_up():
if segments[0].heading() != 270:
segments[0].setheading(90)
def turn_down():
if segments[0].heading() != 90:
segments[0].setheading(270)
def turn_left():
if segments[0].heading() != 0:
segments[0].setheading(180)
def turn_right():
if segments[0].heading() != 180:
segments[0].setheading(0)
display.onkey(turn_up, "Up")
display.onkey(turn_down, "Down")
display.onkey(turn_left, "Left")
display.onkey(turn_right, "Right")As might be seen above, we first used the display’s pay attention() methodology that lets us take heed to the display’s enter keys. Subsequent, now we have outlined features which will likely be referred to as later within the display’s onkey() methodology, which calls a operate based mostly on a keyboard key pressed. We now have outlined 4 features, every to show to a path apart from the exact opposite, utilizing the turtle’s methodology setheading(). This methodology units the top of the turtle, which is the primary phase or phase[0] to 0, 90, 180, or 270, that’s, proper, up, left, or down. The if conditional statements in every operate ensure that the snake doesn’t flip in its wrong way, as we will see within the authentic recreation.
Working the whole code with this code block addition will allow us to transfer our snake:

Meals Creation
As soon as the snake has been created and programmed to maneuver utilizing the arrow keys, the subsequent job is to create the meals which the snake will eat and develop. This meals will even be created as a turtle object in a round form, in purple. We are going to set the shapesize to 0.5 so the meals is 10×10 pixels on the display. We now have additionally set the pace() to “fastest” so the animation is quick, and there’s no delay in meals creation. Right here, we are going to import Python’s random module to create the meals at random positions on the sport display. We now have set the boundary of meals as -275 to 275 on each the x and y axes. That is in order that it’s simpler for the snake to eat its meals with out colliding with the outer display boundary.
Furthermore, each time the snake eats its meals, new meals must be generated. For this objective, we are going to outline a operate refresh() and generate new random coordinates the place the turtle object referred to as meals will transfer to. Take a look at the code beneath:
#Creating the Meals
import random
meals = Turtle()
meals.shade("red")
meals.form("circle")
meals.penup()
meals.shapesize(stretch_len=0.5, stretch_wid=0.5)
meals.pace("fastest")
random_x = random.randint(-275, 275)
random_y = random.randint(-275, 275)
meals.goto(random_x, random_y)
def refresh():
random_x = random.randint(-275, 275)
random_y = random.randint(-275, 275)
meals.goto(random_x, random_y)
Detect Collision with Meals
As soon as now we have created the meals, we now must create a mechanism whereby the snake eats the meals. Which means that each time the snake touches the meals, the meals vanishes, and the snake grows by one phase. We are going to code this state of affairs such that each time the snake and meals are in shut proximity, in order that their distance is lower than 15, it means the snake has eaten the meals. We are going to make use of the turtle module’s distance() methodology that calculates the space between a turtle and a selected level or one other turtle object. If this distance is lower than 15 (via trial and error), it might imply the snake has touched or eaten its meals, and the meals ought to now transfer to a brand new location for recreation continuity. Therefore, we are going to now name the refresh() operate that we outlined earlier to maneuver the meals object to a brand new location. Consuming the meals ought to improve the snake’s dimension by a phase. For this, we are going to outline a operate referred to as prolong() exterior the whereas loop and name it contained in the if conditional assertion when the snake eats the meals.
#Snake extending
def prolong():
add_segments(segments[-1].place())As might be seen, the prolong() operate will add a brand new phase to the final phase of the snake’s physique. Now shifting on to the principle recreation’s loop:
game_is_on = True
whereas game_is_on:
...
#Retain the unique code right here
...
#Detect Collision with Meals
if segments[0].distance(meals) < 15:
refresh()
prolong()
Scoreboard and Rating Updation
Subsequent is to create a scoreboard that may show the rating. To do that, we are going to code exterior the whereas loop. We are going to create this scoreboard and the rating as 2 turtle objects utilizing turtle’s write() methodology, which permits us to show textual content on display. First, we are going to initialize a variable referred to as rating as 0. Because the snake eats its meals, the rating variable will likely be elevated by 1 every time. Subsequent, we are going to create 2 turtle cases, scoreboard and my_score. The scoreboard object will show the textual content on display “Rating = “, whereas the my_score object will show the rating variable, which can change because the snake eats its meals. As might be seen within the code beneath, each of those turtle objects have been custom-made for the display textual content show in accordance with the necessity.
#Creating the Scoreboard & Rating
rating = 0
scoreboard = Turtle()
scoreboard.shade("black")
scoreboard.penup()
scoreboard.hideturtle()
scoreboard.goto(0,250)
scoreboard.write("Score = ", True, align="center", font=("Arial", 12, "normal"))
my_score = Turtle()
my_score.shade("black")
my_score.penup()
my_score.hideturtle()
As soon as now we have created the above, we are going to now proceed so as to add the availability of adjusting the core throughout the whereas loop of the sport, contained in the if conditional assertion when the snake collides with the meals. Test the code beneath and replace the precise traces of code:
game_is_on = True
whereas game_is_on:
...
#Retain the unique code right here
...
#Detect Collision with Meals
if segments[0].distance(meals) < 20:
refresh()
prolong()
rating = rating + 1
my_score.goto(40, 250)
my_score.clear()
my_score.write(rating, True, align="center", font=("Arial", 12, "normal"))The next is displayed on the display after working this system with the above additions:

Recreation Ending
When the sport ends, we have to inform the consumer that the sport is over, slightly than simply closing the show display. For this we are going to outline a operate and name it each time the sport ends: both by collision with a wall or by collision with tail. We are going to use the turtle object for this as properly. That is the operate, and will probably be referred to as when game_is_on variable turns to False.
#Recreation Over Pop Up
def game_over():
game_over = Turtle()
game_over.shade("black")
game_over.penup()
game_over.hideturtle()
game_over.write("GAME OVER", True, align="center", font=("Arial", 40, "normal"))
Detect Collision with Wall
One other situation of the sport’s continuity is to verify the snake doesn’t collide with the boundary wall of the display. With the intention to code this, and realizing that the sport’s display is 600×600, we are going to think about the boundary wall a sq. with its corners to be at these factors: (290, 290), (290, -290), (-290, -290) and (-290, 290). The wall detection block will likely be throughout the recreation loop in a separate if conditional assertion as follows:
game_is_on = True
whereas game_is_on:
...
#Retain the unique code right here
...
# Detect Collision with Wall
if segments[0].xcor() > 290 or segments[0].xcor() < -290 or segments[0].ycor() > 290 or segments[0].ycor() < -290:
game_is_on = False
game_over()
Within the above traces of code, now we have accessed the x and y coordinates of the primary phase of the snake and checked whether or not it falls inside or exterior of the boundary wall.
Detect Collision with Tail
Lastly, we are going to finish this program with one other situation of the sport, which is that if the snake’s head collides with itself, that’s, the primary phase collides with every other phase, the sport ends. We are going to use the for loop to code this state of affairs:
game_is_on = True
whereas game_is_on:
...
#Retain the unique code right here
...
# Detect Tail Collision
for phase in segments[1:]:
if segments[0].distance(phase) < 10:
game_is_on = False
game_over()
When the sport ends, we have to inform the consumer that the sport is over, slightly than simply closing the show display. For this, we are going to name the game_over operate we outlined earlier.

Conclusion
On this tutorial, now we have efficiently carried out the snake recreation in Python. We now have used our understanding of Python fundamentals, similar to defining and calling features, utilizing lists and tuples, utilizing for and whereas loops in addition to conditional statements. We now have additionally carried out our primary understanding of Object Oriented Programming to create objects from a module’s lessons. In case you have any queries concerning any piece of code or a suggestion to make the code extra strong and environment friendly, be happy to remark and share your concepts. Till then, code, play, and problem your folks to the Snake Recreation you’ve gotten designed!



