Skip to content

Instantly share code, notes, and snippets.

@ApprikatAI
Forked from wynand1004/snake_game.py
Created June 29, 2024 00:11
Show Gist options
  • Select an option

  • Save ApprikatAI/c326566a29c5c2a2f59949fb5333bb4e to your computer and use it in GitHub Desktop.

Select an option

Save ApprikatAI/c326566a29c5c2a2f59949fb5333bb4e to your computer and use it in GitHub Desktop.

Revisions

  1. @wynand1004 wynand1004 created this gist Sep 2, 2018.
    185 changes: 185 additions & 0 deletions snake_game.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,185 @@
    # Simple Snake Game in Python 3 for Beginners
    # By @TokyoEdTech

    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 by @TokyoEdTech")
    wn.bgcolor("green")
    wn.setup(width=600, height=600)
    wn.tracer(0) # Turns off the screen updates

    # Snake head
    head = turtle.Turtle()
    head.speed(0)
    head.shape("square")
    head.color("black")
    head.penup()
    head.goto(0,0)
    head.direction = "stop"

    # Snake food
    food = turtle.Turtle()
    food.speed(0)
    food.shape("circle")
    food.color("red")
    food.penup()
    food.goto(0,100)

    segments = []

    # Pen
    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: 0", 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_left():
    if head.direction != "right":
    head.direction = "left"

    def go_right():
    if head.direction != "left":
    head.direction = "right"

    def move():
    if head.direction == "up":
    y = head.ycor()
    head.sety(y + 20)

    if head.direction == "down":
    y = head.ycor()
    head.sety(y - 20)

    if head.direction == "left":
    x = head.xcor()
    head.setx(x - 20)

    if head.direction == "right":
    x = head.xcor()
    head.setx(x + 20)

    # Keyboard bindings
    wn.listen()
    wn.onkeypress(go_up, "w")
    wn.onkeypress(go_down, "s")
    wn.onkeypress(go_left, "a")
    wn.onkeypress(go_right, "d")

    # Main game loop
    while True:
    wn.update()

    # Check for a collision with the border
    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 the segments list
    segments.clear()

    # Reset the score
    score = 0

    # Reset the delay
    delay = 0.1

    pen.clear()
    pen.write("Score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))


    # Check for a collision with the food
    if head.distance(food) < 20:
    # Move the food to a random spot
    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)

    # Shorten the delay
    delay -= 0.001

    # Increase the score
    score += 10

    if score > high_score:
    high_score = score

    pen.clear()
    pen.write("Score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))

    # Move the end segments first 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 with the body segments
    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 the segments list
    segments.clear()

    # Reset the score
    score = 0

    # Reset the delay
    delay = 0.1

    # Update the score display
    pen.clear()
    pen.write("Score: {} High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))

    time.sleep(delay)

    wn.mainloop()