As a kid, I am sure everybody has played the famous snake game. As a matter of fact, it was one of the first mobile games that came into the market. Wouldn’t it be cool to build it by yourself? Hell Yeah! I have used Python’s Turtle Module to build the game from scratch.
There are two elements in this game – snake and food. The player has to move the snake such that it touches(eats) the food and grows in size. The snake dies if it touches its own body or the boundaries of the window. On an obvious note, the player needs to win and hence avoid dying.
import turtle
import time
import random
delay = 0.1
# score
score = 0
high_score = 0
#set up the screen
wn = turtle.Screen()
wn.title("snake game")
wn.bgcolor("blue")
wn.setup(width=600, height=600)
wn.tracer(0)
#Snake Head
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("black")
head.penup()
head.goto(0, 100)
head.direction = "stop"
# Snake food
food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("red")
food.penup()
food.shapesize(0.50, 0.50)
food.goto(0, 0)
segments = []
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Score: 0 High Score: {}".format(high_score), align="center", font=("Courier", 24, "normal"))
# Functions
def go_up():
if head.direction != "down":
head.direction = "up"
def go_down():
if head.direction != "up":
head.direction = "down"
def go_right():
if head.direction != "left":
head.direction = "right"
def go_left():
if head.direction != "right":
head.direction = "left"
def move():
if head.direction == "up":
y = head.ycor() #y coordinate of the turtle
head.sety(y + 20)
if head.direction == "down":
y = head.ycor() #y coordinate of the turtle
head.sety(y - 20)
if head.direction == "right":
x = head.xcor() #y coordinate of the turtle
head.setx(x + 20)
if head.direction == "left":
x = head.xcor() #y coordinate of the turtle
head.setx(x - 20)
# keyboard bindings
wn.listen()
wn.onkey(go_up, "w")
wn.onkey(go_down, "s")
wn.onkey(go_right, "d")
wn.onkey(go_left, "a")
# Main game loop
while True:
wn.update()
# Check for collision
if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# clear segment list
segments = []
# reset score
score = 0
# update score
pen.clear()
pen.write("score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))
if head.distance(food) < 15:
# move the food to a random position on screen
x = random.randint(-290, 290)
y = random.randint(-290, 290)
food.goto(x, y)
# add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("grey")
new_segment.penup()
segments.append(new_segment)
# Increase the score
score = score+10
if score > high_score:
high_score = score
# move the end segment in reverse order
for index in range(len(segments)-1, 0, -1):
x = segments[index-1].xcor()
y = segments[index-1].ycor()
segments[index].goto(x, y)
# Move segment 0 to where the head is
if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x, y)
move()
# Check for head collision
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# clear segment list
segment.clear()
# reset score
score = 0
# update score
pen.clear()
pen.write("score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))
time.sleep(delay)
turtle.mainloop()