问题
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()
回答1:
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.
回答2:
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.
回答3:
No point in setting the turtle speed any higher than 10. If you don't use animation, set the speed to 0: speed(0). Otherwise use speed(10).
来源:https://stackoverflow.com/questions/37191039/python-turtle-speed