我是乌龟和编程的新手,并且想制作一个标签游戏。有两个用户,一个是跑步者,一个是追逐者(鲍勃和菲尔(。当追逐者靠近跑步者(使用距离公式检测到(时,程序将其设置回原始的起始位置。但是,每当我运行该程序时,Turtle图形窗口都会冻结并停止响应,最终导致我关闭程序。谁能帮助我确定这个问题?
import turtle
import math
bob = turtle.Turtle()
wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width = 700, height = 700)
wn.tracer()
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-300)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
border_pen.fd(600)
border_pen.lt(90)
border_pen.hideturtle()
bob.shape("triangle")
bob.speed(0)
bob.color("blue")
bob.penup()
bob.setpos(-50, 0)
def draw():
bob.penup()
def nodraw():
bob.pendown()
def fd():
bob.fd(20)
if bob.xcor() > 280:
bob.setx(280)
if bob.ycor() > 280:
bob.sety(280)
if bob.xcor() < -280:
bob.setx(-280)
if bob.ycor() <- 280:
bob.sety(-280)
def right():
bob.right(90)
def left():
bob.left(90)
turtle.listen()
turtle.onkey(left, "Left")
turtle.onkey(fd, "Up")
turtle.onkey(right, "Right")
phil = turtle.Turtle()
phil.speed(0)
phil.penup()
phil.shape("triangle")
phil.color("red")
phil.setpos(50, 0)
def fdp():
phil.fd(20)
if phil.xcor() > 280:
phil.setx(280)
if phil.ycor() > 280:
phil.sety(280)
if phil.xcor() < -280:
phil.setx(-280)
if phil.ycor() <- 280:
phil.sety(-280)
def rightp():
phil.right(90)
def leftp():
phil.left(90)
turtle.listen()
turtle.onkey(leftp, "a")
turtle.onkey(fdp, "w")
turtle.onkey(rightp, "d")
def isCollision(t1, t2):
distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
if distance < 20:
return True
else:
return False
while True:
if isCollision(bob, phil):
bob.setposition(-50, 0)
phil.setposition(50, 0)
turtle.done()
您的原始代码和我尝试在下面尝试解决的建议答案存在问题。具体来说:您不需要计算海龟之间的距离,他们已经知道如何做。您和其他人的使用tracer()
毫无意义,因为您没有update()
调用;鲍勃和菲尔之间的碰撞应该是对称的,但答案之一考虑到鲍勃碰撞菲尔,但菲尔与鲍勃相撞。答案之一似乎不了解turtle.done()
的性质。
from turtle import Screen, Turtle, mainloop
def bob_left():
bob.left(90)
def bob_forward():
bob.forward(20)
if bob.xcor() > 280:
bob.setx(280)
elif bob.xcor() < -280:
bob.setx(-280)
if bob.ycor() > 280:
bob.sety(280)
elif bob.ycor() < -280:
bob.sety(-280)
checkCollision()
def bob_right():
bob.right(90)
def phil_left():
phil.left(90)
def phil_forward():
phil.forward(20)
if phil.xcor() > 280:
phil.setx(280)
elif phil.xcor() < -280:
phil.setx(-280)
if phil.ycor() > 280:
phil.sety(280)
elif phil.ycor() < -280:
phil.sety(-280)
checkCollision()
def phil_right():
phil.right(90)
def isCollision(t1, t2):
return t1.distance(t2) < 20
def checkCollision():
if isCollision(bob, phil):
bob.setposition(-50, 0)
phil.setposition(50, 0)
screen = Screen()
screen.bgcolor('black')
screen.setup(width=700, height=700)
border_pen = Turtle(visible=False)
border_pen.speed('fastest')
border_pen.color('white')
border_pen.pensize(3)
border_pen.penup()
border_pen.setposition(-300, -300)
border_pen.pendown()
for _ in range(4):
border_pen.fd(600)
border_pen.lt(90)
bob = Turtle('triangle')
bob.speed('fastest')
bob.color('blue')
bob.penup()
bob.setpos(-50, 0)
phil = Turtle('triangle')
phil.speed('fastest')
phil.color('red')
phil.penup()
phil.setposition(50, 0)
screen.onkey(bob_left, 'Left')
screen.onkey(bob_forward, 'Up')
screen.onkey(bob_right, 'Right')
screen.onkey(phil_left, 'a')
screen.onkey(phil_forward, 'w')
screen.onkey(phil_right, 'd')
screen.listen()
mainloop()
审查后,这应该有效:
import turtle
import math
bob = turtle.Turtle()
wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width = 700, height = 700)
wn.tracer()
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-300)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
border_pen.fd(600)
border_pen.lt(90)
border_pen.hideturtle()
bob.shape("triangle")
bob.speed(0)
bob.color("blue")
bob.penup()
bob.setpos(-50, 0)
def draw():
bob.penup()
def nodraw():
bob.pendown()
def fd():
bob.fd(20)
if bob.xcor() > 280:
bob.setx(280)
if bob.ycor() > 280:
bob.sety(280)
if bob.xcor() < -280:
bob.setx(-280)
if bob.ycor() <- 280:
bob.sety(-280)
distance = math.sqrt(math.pow(bob.xcor()-phil.xcor(),2)+math.pow(bob.ycor()-phil.ycor(),2))
print(distance)
if distance < 20:
bob.setposition(-50, 0)
phil.setposition(50, 0)
def right():
bob.right(90)
def left():
bob.left(90)
turtle.listen()
turtle.onkey(left, "Left")
turtle.onkey(fd, "Up")
turtle.onkey(right, "Right")
phil = turtle.Turtle()
phil.speed(0)
phil.penup()
phil.shape("triangle")
phil.color("red")
phil.setpos(50, 0)
def fdp():
phil.fd(20)
if phil.xcor() > 280:
phil.setx(280)
if phil.ycor() > 280:
phil.sety(280)
if phil.xcor() < -280:
phil.setx(-280)
if phil.ycor() <- 280:
phil.sety(-280)
def rightp():
phil.right(90)
def leftp():
phil.left(90)
turtle.listen()
turtle.onkey(leftp, "a")
turtle.onkey(fdp, "w")
turtle.onkey(rightp, "d")
turtle.done()
缩进您的 turtle.done()
在while
循环内。这将解决您的冻结问题。这样:
while True:
if isCollision(bob, phil):
bob.setposition(-50, 0)
phil.setposition(50, 0)
turtle.done()
您也可以删除while
循环,因为您实际上不需要它才能使用if
语句。这样:
if isCollision(bob, phil):
bob.setposition(-50, 0)
phil.setposition(50, 0)
turtle.done()