【问题标题】:After a few seconds, one turtle stops and the other goes faster几秒钟后,一只乌龟停下来,另一只跑得更快
【发布时间】:2019-10-17 12:16:43
【问题描述】:

经过数周的尝试,我还没有想出解决这个问题的方法,其中一只乌龟完全停止,另一只快 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 倍的速度前进。

【问题讨论】:

    标签: python python-3.x turtle-graphics


    【解决方案1】:

    将 keylisteners 移到循环之外 - 将它们放在 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)
    

    【讨论】:

    • 我已将代码更改为我遇到问题的代码,希望它能有所作为
    • @xu 我不知道你在尝试什么。不过,最后的这个逻辑是有缺陷的:if player1.xcor() &lt; (-350) 你不应该往后走,而是往前走。否则你会变得更加消极。后退和前进取决于海龟所看的方向 - 将其位置设置为绝对可能更好:如果 350 将其设置为 350。
    【解决方案2】:

    您的嵌套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()
    

    看看这是否更像你的期望/期望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多