Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Turtle Speed

My friend and I are working on a Python Game using turtles. Our issue is in the section where it defines the turtles. We are trying to speed each turtle up, but when we do, the default speed runs. Why is this issue occurring?

import turtle


turtle.setup(1000,1000)
wn=turtle.Screen()
wn.title("Snake Game!")

#defines first turtle

t1=turtle.Turtle()
t1.pensize(2)
t1.speed(3)
t1.penup()
t1.goto(0,100)
t1.color("blue", "blue")
t1.pendown()

#defines second turtle

t2=turtle.Turtle()
t2.pensize(2)
t2.speed(3)
t2.penup()
t2.goto(0,-100)
t2.color("red", "red")
t2.pendown()

#defines outline

ol=turtle.Turtle()
ol.pensize(2)
ol.speed(7)
ol.penup()
ol.goto(450,0)
ol.color("black", "black")
ol.pendown()

ol.left(90)
ol.forward(300)
ol.left(90)
ol.forward(900)
ol.left(90)
ol.forward(600)
ol.left(90)
ol.forward(900)
ol.left(90)
ol.forward(300)
ol.hideturtle()

#defines score

score1=int(2)
score2=int(2)

def motion():
    global move, score1, score2
    move = True
    path1 = []
    path2 = []

#prints score


    print("Player 1's score is", str(score1)+"!")
    print("Player 2's score is", str(score2)+"!")

#defines motion

    while move == True:
        global pos1x, pos2x

        t1.forward(1)
        t2.forward(1)

        pos1x = int(t1.xcor())
        pos1y = int(t1.ycor())
        t1xy = (pos1x, pos1y)

        pos2x=int(t2.xcor())
        pos2y=int(t2.ycor())
        t2xy=(pos2x,pos2y)


        path1.append(t1xy)
        path2.append(t2xy)

#calculates score1

        if t1xy in path2:
            score1=int(score1-1)
            print("")
            print("Player 1's score is", str(score1)+"!")
            print("Player 2's score is", str(score2)+"!")
            t1.clear()
            path1 = []
            t2.clear()
            path2 = []
            t1.penup()
            t1.goto(0,100)
            t1.pendown()
            t2.penup()
            t2.goto(0,-100)
            t2.pendown()
            move = False



        if score1==0:
            print("Player 2 wins!")
            exit()
        else:
            move==True



#calculates score2


        if t2xy in path1:
            score2=int(score2-1)
            print("")
            print("Player 1's score is", str(score1)+"!")
            print("Player 2's score is", str(score2)+"!")
            t2.clear()
            path2 = []
            t1.clear()
            path1 = []
            t2.penup()
            t2.goto(0,-100)
            t2.pendown()
            t1.penup()
            t1.goto(0,100)
            t1.pendown()
            move = False

        if score2==0:
           print("Player 1 wins!")
           exit()
        else:
            move==True


#borders

        if pos1x > 450:
            t1.left(135)

        if pos2x > 450:
            t2.left(135)


        if pos1x < -450:
            t1.left(135)

        if pos2x < -450:
            t2.left(135)


        if pos1y > 300:
            t1.left(135)

        if pos2y > 300:
            t2.left(135)

        if pos1y < -300:
            t1.left(135)

        if pos2y < -300:
            t2.left(135)

#defines controls

def left():
    t1.speed(500)
    t1.left(45)
    t1.speed(3)    

def right():
    t1.speed(500)
    t1.right(45)
    t1.speed(3)

def backwards():
    t1.left(180)

def stop():
    global move
    move = False
    t1.forward(0)
    t2.forward(0)


def left2():
    t2.speed(500)
    t2.left(45)
    t2.speed(3)

def right2():
    t2.speed(500)
    t2.right(45)
    t2.speed(3)

def backwards2():
    t2.left(180)

def motion2():

    move = True
    path1 = []
    path2 = []


#onkeys

wn.onkey(left2, "Left")
wn.onkey(right2, "Right")
wn.onkey(backwards2, "Down")

wn.onkey(left, "a")
wn.onkey(right, "d")
wn.onkey(backwards, "s")

wn.onkey(motion, "t")
wn.onkey(stop, "y")
wn.onkey(motion2, "p")



wn.listen()
wn.mainloop()
like image 246
David Bender Avatar asked Aug 27 '26 03:08

David Bender


2 Answers

What do you want to happen here?

def left():
    t1.speed(500)
    t1.left(45)
    t1.speed(3)    

Setting the speed above 10 (fast) sets it to 0 (fastest). And you're setting it to 3 (slow) as soon as the operation is done.

As far as I can tell, you temporarily speed up the turtles on operations that don't get much out of it, e.g. left() but leave the turtles in slow speed for operations that should benefit from it, e.g. motion()

I'd suggest you pull out all your speed() calls and rethink them, preferably using the string arguments "slowest", "slow", "normal", "fast" & "fastest" to help document what you're doing and avoid going out of range.

like image 102
cdlane Avatar answered Aug 29 '26 16:08

cdlane


If it's as simple as changing a turtles speed use:

turtle.speed(number)

Turtle is the turtles name eg. TestTurtle

The number can be from 1 to 10 and has to be a whole number. You cannot have for example 4.7 as the number.

Setting it above 10 will cause the speed to not work.

like image 20
A Display Name Avatar answered Aug 29 '26 15:08

A Display Name



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!