几秒钟后,一只停下来,另一只走得更快



经过数周的尝试,我还没有想出解决这个问题的方法,其中一只完全停止,另一只的速度快了 2 倍 - 3 倍。我该如何解决这个问题?您必须将它们都移动一点才能遇到问题。这也是在网站上: repl.it

我尝试移动wn.listen()命令,但这只切换了哪只停止了,哪只没有停止。我尝试将forward()命令切换到goto()但没有成功,并且我尝试使用特定于方向的移动(也不成功(:

import turtle
import sys
player1 = turtle.Turtle()
player1.up()
player1.goto(0,350)
player1.right(90)
player1.down()
player2 = turtle.Turtle()
wn = turtle.Screen()
#preGame setup
player2.up()
player2.goto(0,-350)
player2.left(90)
player2.down()
player2.color("blue")
player1.color("red")
#main game loop
player1.speed(0)
player2.speed(0)
k = 0
def kr():
  player1.left(90)
def kl():
  player1.right(90)
wn.onkey(kr, "d")
wn.onkey(kl, "a")
def k1():
  player2.right(90)
def k2(): 
  player2.left(90)   
wn.onkey(k1, "k")
wn.onkey(k2, "l")
wn.listen()
while True:
  player1.forward(1)
  player2.forward(1)
  while player1.xcor() < (-350) or player1.xcor() > (350) or player1.ycor() > (350) or  player1.ycor() < (-350):
   player1.back(30)
  while player2.xcor() < (-350) or player2.xcor() > (350) or player2.ycor() > (350) or player2.ycor() < (-350):
   player2.back(30)
   if player1.pos() == player2.pos():
     print ("DONT CRASH INTO THE OTHER PLAYER")
     sys.exit()

我预计它们都会无限期地继续移动,但一个总是停下来,另一个的速度是原来的 2 倍。

将键侦听器移到循环之外 - 将它们放在 while 循环中将重新附加它们并一直重新定义函数并混淆 turtle。

您需要设置它们一次,而不是每隔几毫秒设置一次

import turtle
player1 = turtle.Turtle()
player2 = turtle.Turtle()
player1.goto(350, 0)
player2.goto(-350, 0)
player1.right(180)
wn = turtle.Screen()
def kl():
    player1.left(90)
def kr():
    player1.right(90)
def k1():
    player2.right(90)
def k2():
    player2.left(90)
wn.onkey(kl, "d")  # changed to lowercase
wn.onkey(kr, "a")
wn.onkey(k1, "j")  # changed to other letters
wn.onkey(k2, "l")
wn.listen()
while True: # not changing k so just use while True
    player1.forward(1)  # changed speed
    player2.forward(1)

您的嵌套while循环结构对您不利,并且对像 turtle 这样的事件驱动环境无效。 以下是程序的返工,用于解决此问题并清理代码:

from turtle import Screen, Turtle
import sys
# preGame setup
player1 = Turtle()
player1.hideturtle()
player1.up()
player1.goto(0, 350)
player1.down()
player1.right(90)
player1.color('red')
player1.speed('fastest')
player1.showturtle()
def r1():
    player1.left(90)
def l1():
    player1.right(90)
player2 = Turtle()
player2.hideturtle()
player2.up()
player2.goto(0, -350)
player2.down()
player2.left(90)
player2.color('blue')
player2.speed('fastest')
player2.showturtle()
def r2():
    player2.right(90)
def l2():
    player2.left(90)
# main game loop
def move():
    player1.forward(5)
    if not (-350 < player1.xcor() < 350 and -350 < player1.ycor() < 350):
        player1.backward(30)
    player2.forward(5)
    if not (-350 < player2.xcor() < 350 and -350 < player2.ycor() < 350):
        player2.backward(30)
    if player1.distance(player2) < 5:
        print("DON'T CRASH INTO THE OTHER PLAYER!")
        sys.exit()
    screen.ontimer(move, 100)
screen = Screen()
screen.onkey(r1, 'd')
screen.onkey(l1, 'a')
screen.onkey(r2, 'k')
screen.onkey(l2, 'l')
screen.listen()
move()
screen.mainloop()

看看这是否表现得更像你期望/渴望的。

最新更新