Через несколько секунд одна черепаха останавливается, а другая идет быстрее - PullRequest
2 голосов
/ 01 июня 2019

После нескольких недель попыток я так и не нашел решения этой проблемы, при котором одна черепаха останавливается полностью, а другая - в 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 раза быстрее.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Ваша вложенная структура петли while работает против вас и недопустима для среды, управляемой событиями, такой как черепаха. Вот доработка вашей программы для исправления этой проблемы и очистки кода:

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()

Посмотрите, будет ли это вести себя так, как вы ожидаете / желаете.

0 голосов
/ 01 июня 2019

Переместите списки ключей за пределы вашего цикла - наличие их внутри цикла while позволит снова присоединить их и переопределить функции все время и сбить с толку черепаху.

Вам нужно установить их один раз не каждые несколько миллисекунд:

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)
...