How can we get a work around for the Python raise Terminator error for the screen?

Viewed 21

So guys I would appreciate some help. I am not an expert in python but helping my nephew with his project.

We are getting the raise Terminator error while updating the screen.

We have searched on Google and StackOverflow for queries with a similar error - "raise Terminator error..." but don't seem to progress in getting an answer.

Here is the code.

import turtle  
import time
import random
  
delay = 0.1
 
 
score = 0
 
 
high_score = 0
 
 
 
 
 
 
t=turtle.Screen()
 
 
t.title("Snake Xenzia")
 
 
t.bgcolor("skyblue")
 
 
t.setup(width=600, height=600)
 
 
t.tracer(0)
 
 
# Head of snake
 
 
head = turtle.Turtle()
 
 
head.shape("square")
 
 
head.color("white")
 
 
head.penup()
 
 
head.goto(0, 0)
 
 
head.direction = "Stop"
 
 
# Food
 
 
food = turtle.Turtle()
 
 
colors = random.choice(['red', 'green', 'blue'])
 
 
shapes = random.choice(['square', 'triangle', 'circle'])
 
 
food.speed(0)
 
 
food.shape(shapes)
 
 
food.color(colors)
 
 
food.penup()
 
 
food.goto(0, 100)
 
 
# Adding Segments
 
 
pen = turtle.Turtle()
 
 
pen.speed(0)
 
 
pen.shape("square")
 
 
pen.color("white")
 
 
pen.penup()
 
 
pen.hideturtle()
 
 
pen.goto(0, 250)
 
 
pen.write("Score : 0  High Score : 0", align="center",
 
 
          font=("candara", 24, "bold"))
 
 
 
 
 
 
    # Coding Moving
 
 
def wkey():
 
 
    if head.direction != "down":
 
 
        head.direction = "up"
 
 
 
 
def skey():
 
 
    if head.direction != "up":
 
 
        head.direction = "down"
 
 
 
 
def akey():
 
 
    if head.direction != "right":
 
 
        head.direction = "left"
 
 
 
 
def dkey():
 
 
    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)
 
 
 
 
        
 
 
t.listen()
 
 
t.onkeypress(wkey, "w")
 
 
t.onkeypress(skey, "s")
 
 
t.onkeypress(akey, "a")
 
 
t.onkeypress(dkey, "d")
 
 
segments = []
 
 
 
 
 
 
    # Main Gameplay
 
 
while True:
 
 
    t.update()
 
 
    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"
        colors = random.choice(['red', 'blue', 'green'])
        shapes = random.choice(['square', 'circle'])
 
 
        for segment in segments:
            segment.goto(1000, 1000)
 
 
        segments.clear()
        score = 0
        delay = 0.1
 
 
        pen.clear()
 
 
        pen.write("Score : {} High Score : {} ".format(
 
 
            score, high_score), align="center", font=("candara", 24, "bold"))
 
 
    if head.distance(food) < 20:
 
 
        x = random.randint(-270, 270)
        y = random.randint(-270, 270)
 
 
        food.goto(x, y)
 
 
        # Adding segment
        new_segment = turtle.Turtle()
        new_segment.speed(0)
        new_segment.shape("square")
        new_segment.color("orange")  # tail colour
        new_segment.penup()
        segments.append(new_segment)
 
 
        delay -= 0.001
        score += 10
 
 
        if score > high_score:
            high_score = score
 
 
        pen.clear()
        pen.write("Score : {} High Score : {} ".format(score, high_score), align="center", font=("candara", 24, "bold"))
 
 
    # Collision
 
 
    for index in range(len(segments)-1, 0, -1):
        x = segments[index-1].xcor()
        y = segments[index-1].ycor()
        segments[index].goto(x, y)
 
 
    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"
 
 
            colors = random.choice(['red', 'blue', 'green'])
            shapes = random.choice(['square', 'circle'])
 
 
            for segment in segments:
                segment.goto(1000, 1000)
 
 
            segment.clear()
            score = 0
            delay = 0.1
 
 
            pen.clear()
            pen.write("Score : {} High Score : {} ".format(score, high_score), align="center", font=("candara", 24, "bold"))
 
    time.sleep(delay)
  
t.mainloop()

Any help would be appreciated. Thanks.

1 Answers

I was not able to reproduce the error you describe. However, there are some issues with the code that once addressed might fix your problem.

The most obvious issue is a while True: loop, which has no place in an event-driven environment like turtle, and a mainloop() call that's never reached. We should be using an ontimer() event instead.

Another issue is you have two different letter cases for your "stop" and at times "Stop" token. Not an immediate issue, but could easily become one.

You call segment.clear() on a segment that hasn't drawn anything. This looks like a copy & paste artifact from segments.clear() in an earlier loop.

You set colors and shapes at times when you don't actually use them. Your wall collision and body collision code are pretty much identical and can be consolidated into one.

Below is my rework of your code. See if the changes make sense to you and if it solves your problem:

from turtle import Screen, Turtle
from random import choice, randint

SCORE_FONT = ('candara', 24, 'bold')

# Moving

def wkey():
    if head.direction != 'down':
        head.direction = 'up'

def skey():
    if head.direction != 'up':
        head.direction = 'down'

def akey():
    if head.direction != 'right':
        head.direction = 'left'

def dkey():
    if head.direction != 'left':
        head.direction = 'right'

def move():
    x, y = head.position()

    if head.direction == 'up':
        head.sety(y + 20)
    elif head.direction == 'down':
        head.sety(y - 20)
    elif head.direction == 'left':
        head.setx(x - 20)
    elif head.direction == 'right':
        head.setx(x + 20)

    if segments:
        for index in range(len(segments) - 1, 0, -1):
            previous = segments[index-1]
            segments[index].goto(previous.position())

        segments[0].goto(x, y)

# Main Gameplay

delay = 0.1
score = 0
high_score = 0

def play():
    global high_score, score, delay

    # Check for head collision with wall or own body segments
    if not (-290 < head.xcor() < 290 and -290 < head.ycor() < 290) or any(head.distance(segment) < 20 for segment in segments):
        head.home()
        head.direction = 'stop'

        for segment in segments:
            segment.hideturtle()

        segments.clear()

        score = 0
        delay = 0.1

        pen.clear()
        pen.write("Score : {} High Score : {} ".format(score, high_score), align='center', font=SCORE_FONT)
    elif head.distance(food) < 20:
        shape = choice(['square', 'triangle', 'circle'])
        color = choice(['red', 'green', 'blue'])
        x, y = randint(-270, 270), randint(-270, 270)

        food.shape(shape)
        food.color(color)
        food.goto(x, y)

        # Adding segment
        new_segment = head.clone()
        new_segment.color('orange')  # tail colour

        segments.append(new_segment)

        delay -= 0.001
        score += 10

        if score > high_score:
            high_score = score

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

    move()

    screen.update()
    screen.ontimer(play, int(delay * 1000))

screen = Screen()
screen.title("Snake Xenzia")
screen.bgcolor('skyblue')
screen.setup(width=600, height=600)
screen.tracer(False)

# Head of snake

head = Turtle()
head.shape('square')
head.color('white')
head.penup()

head.direction = 'stop'  # user-defined property

# Food

color = choice(['red', 'green', 'blue'])
shape = choice(['square', 'triangle', 'circle'])

food = Turtle()
food.shape(shape)
food.color(color)
food.penup()
food.sety(100)

# Scoring

pen = Turtle()
pen.hideturtle()
pen.color('white')
pen.penup()

pen.sety(250)
pen.write("Score : 0  High Score : 0", align='center', font=SCORE_FONT)

segments = []

screen.onkeypress(wkey, 'w')
screen.onkeypress(skey, 's')
screen.onkeypress(akey, 'a')
screen.onkeypress(dkey, 'd')
screen.listen()

play()

screen.mainloop()

Note that once you turn off tracer(), calls to the speed() method do nothing as we're running full out.

Related