Snake Game Code (annotated)

from turtle import Screen
from time import sleep
from Snake import Snake
from Food import Food
from Scoreboard import Scoreboard

screen = Screen()
screen.setup(width=600, height=600)
screen.bgcolor('black')
screen.title('Snake Game')
screen.tracer(0)

jake = Snake()
food = Food()
scoreboard = Scoreboard()

screen.listen()
screen.onkey(key='Up', fun=jake.up)
screen.onkey(key='Down', fun=jake.down)
screen.onkey(key='Left', fun=jake.left)
screen.onkey(key='Right', fun=jake.right)

game_on = True

while game_on:
    sleep(.06)
    screen.update()
    jake.move()

    # detect collision with food
    if jake.head.distance(food) < 15:
        food.refresh()
        scoreboard.add_one()
        jake.extend()

    # detect going outside of b
    if jake.head.xcor() >= 310 or jake.head.xcor() <= -310 or jake.head.ycor() >= 310 or jake.head.ycor() <= -310:
        scoreboard.reset()
        jake.reset()

    # detect snake eating itself
    for x in jake.segments[1:]:
        if jake.head.distance(x) < 10:
            scoreboard.reset()
            jake.reset()

screen.exitonclick()

Snake Class Code

from turtle import Turtle
from time import sleep

STARTING_CORDS = [(0, 0), (-20, 0), (-40, 0)]
MOVE_DISTANCE = 20
UP = 90
DOWN = 270
LEFT = 180
RIGHT = 0


class Snake:

    def __init__(self):
        self.segments = []

        for x in STARTING_CORDS:
            block1 = Turtle(shape='square')
            block1.color('white')
            block1.penup()
            block1.goto(x=x[0],y=x[1])
            self.segments.append(block1)
        self.head = self.segments[0]

    def create_snake(self):

        for x in STARTING_CORDS:
            block1 = Turtle(shape='square')
            block1.color('white')
            block1.penup()
            block1.goto(x=x[0],y=x[1])
            self.segments.append(block1)
        self.head = self.segments[0]

    def extend(self):
        new_segment = Turtle(shape='square')
        new_segment.color('white')
        new_segment.penup()
        x = self.segments[-1].xcor()
        y = self.segments[-1].ycor()
        new_segment.goto(x=x, y=y)
        self.segments.append(new_segment)

    def move(self):
        for seg_num in range(len(self.segments) - 1, 0, -1):
            x = self.segments[seg_num - 1].xcor()
            y = self.segments[seg_num - 1].ycor()
            self.segments[seg_num].goto(x, y)
        self.head.forward(MOVE_DISTANCE)

    def reset(self):
        for segment in self.segments:
            segment.goto(1000, 1000)
        self.segments.clear()
        self.create_snake()
        sleep(1)

    def up(self):
        if self.head.heading() != DOWN:
            self.head.setheading(UP)

    def left(self):
        if self.head.heading() != RIGHT:
            self.head.setheading(LEFT)

    def down(self):
        if self.head.heading() != UP:
            self.head.setheading(DOWN)

    def right(self):
        if self.head.heading() != LEFT:
            self.head.setheading(RIGHT)

Scoreboard Class Code

from turtle import Turtle
alignment = 'center'
font = ('arial', 24)


class Scoreboard(Turtle):
    def __init__(self):
        super().__init__()
        self.score = 0
        with open('High_Score.txt') as file:
            self.high_score = int(file.read())
        self.hideturtle()
        self.sety(275)
        self.color('white')
        self.write(arg=f'Score: {self.score}. High Score {self.high_score}', align=alignment, font=font)

    def update_scoreboard(self):
        self.clear()
        self.write(arg=f'Score: {self.score}. High Score {self.high_score}', align=alignment, font=font)

    def reset(self):
        self.clear()
        if self.score > self.high_score:
            self.high_score = self.score
            with open('High_Score.txt', mode='w') as file:
                file.write(str(self.score))
        self.score = 0
        self.write(arg=f'Score: {self.score}. High Score {self.high_score}', align=alignment, font=font)

    def add_one(self):
        self.clear()
        self.score += 1
        self.update_scoreboard()