Usando más de un ciclo While True en Python Turtle

0

Actualmente tengo un problema en el que cada vez que intento usar más de un bucle While True en mi código, el sitio web se bloquea. Estoy codificando contortuga, una buena forma para principiantes de comenzar a codificar con Python. Básicamente, estoy tratando de que un objeto tortuga gire en un círculo infinitamente hasta que el jugador presione la barra espaciadora. La tortuga se activa para girar cuando el objeto de la tortuga es de color azul. Una vez que el jugador presiona el botón, el objeto tortuga se volverá verde para que deje de girar y avance 300 px en la dirección en la que miraba el objeto tortuga antes de presionar la barra espaciadora. El objetivo de este pequeño minijuego es golpear la bola roja conocida como el objetivo. Este objetivo se genera en una ubicación aleatoria en el lienzo, cada vez que se ejecuta el código. Una vez que el objeto tortuga choca con el objetivo, la puntuación en la parte superior de la pantalla cambiará de 0 a 1.

import turtle
import random

t = turtle.Turtle()
target = turtle.Turtle()
scoreBoard = turtle.Turtle()
scoreBoard.ht()
target.ht()
screen = turtle.Screen()
x = random.randint(-300,300)
y = random.randint(-300,300)
scoreNum = 0
turnSpeed = 2

t.shape('turtle')
t.color('blue')

target.speed(0)
target.penup()
target.goto(30,0)
target.shape('circle')
target.color('red')
target.st()

scoreBoard.color('orange')
scoreBoard.speed(0)
scoreBoard.penup()
scoreBoard.goto(-75,310)
scoreBoard.write('Score:' + str(scoreNum),font=('Arial',15, 'normal'))

def turnStop():
  t.color('green')
  t.forward(300)

def checkCollision():
  if abs(t.xcor() - target.xcor()) < 10 and abs(t.ycor() - target.ycor()) < 10:
    return True
  else:
    return False

screen.onkey(turnStop,'space')
screen.listen()

while t.color()[0] == 'blue':
  t.right(turnSpeed)

while t.color()[0] == 'green':  
  if checkCollision():
    scoreNum = scoreNum + 1
    scoreBoard.clear()
    scoreBoard.write('Score:' + str(scoreNum),font=('Arial',15, 'normal'))

Como puede ver, tengo dos bucles while True. Uno para cuando el jugador está azul al comienzo del juego. Esto permite que el objeto tortuga gire para siempre hasta que el jugador presione la barra espaciadora. Y el otro ciclo mientras el jugador se pone verde al presionar la barra espaciadora, para verificar si hay colisiones con el objetivo de la bola roja. Pero cada vez que presiono la barra espaciadora después de ejecutar el código, el sitio web se bloquea. ¿Alguna idea? ¡Gracias de antemano!

PD: Soy un estudiante de juni learning. Es una clase en línea donde puedes ir y aprender a codificar con un profesor en tiempo real. Y viene con su propio editor de texto, así que es con lo que he estado codificando.

PS PS ¿Y hay una mejor manera de pegar tu código en este foro? Tuve que pegar mi código para apilar el desbordamiento y sangrar cada línea de código 4 veces, lo cual es un poco tedioso.

2
  • EN respuesta a su última pregunta: Por supuesto que sí. Podrás ver una vez que se acepten mis ediciones. 22 mar.20 a las 19:04
  • ¿Así que agregué '' 'a mi código? Ejemplo: '' 'tortuga de importación' '' Lo siento si esto parece tonto. Esta es mi primera vez en este foro. :( 22/03/20 a las 19:35
0

Cuando tenga dos bucles for, uno nunca se alcanzará hasta que el otro haya terminado. ¿Por qué no usas otra condición if en tu mainloop?

while t.color()[0] == 'blue':  
    if t.color()[0] == 'green':
        t.right(turnSpeed)

PD: primero pegue, luego marque todo como código

3
  • Probé tu código, pero ahora el objeto tortuga no parece moverse en absoluto. Eso sí, mi tortuga comienza en azul y una vez que el jugador presiona la barra espaciadora, se vuelve verde. 22/03/20 a las 18:43
  • oh lo siento, entonces debería cambiar las condiciones 22 mar.20 a las 18:57
  • Entonces, cambié los colores y ahora parece que el sitio web se bloquea cada vez que presione la barra espaciadora, al igual que lo hizo con dos bucles While True. Puede que sea solo un problema del sitio web, no estoy seguro. Eso sí, comenté ambos bucles While True antes de agregar su variación. 22/03/20 a las 19:32
0

Muy bien, mi maestro y yo repasamos el problema que tuve con el código. Lo arreglamos y ahora está funcionando como se esperaba.

import turtle
import random

t = turtle.Turtle()
target = turtle.Turtle()
scoreBoard = turtle.Turtle()
scoreBoard.ht()
target.ht()
screen = turtle.Screen()
x = random.randint(-300,300)
y = random.randint(-300,300)
scoreNum = 0
turnSpeed = 2

t.shape('turtle')
t.color('blue')

target.speed(0)
target.penup()
target.goto(30,0)
target.shape('circle')
target.color('red')
target.st()

scoreBoard.color('orange')
scoreBoard.speed(0)
scoreBoard.penup()
scoreBoard.goto(-75,310)
scoreBoard.write('Score:' + str(scoreNum),font=('Arial',15, 'normal'))

def turnStop():
  t.color('green')

def checkCollision():
  if abs(t.xcor() - target.xcor()) < 10 and abs(t.ycor() - target.ycor()) < 10:
    return True
  else:
    return False

screen.onkey(turnStop,'space')
screen.listen()

while True:
  while t.color()[0] == 'blue':
    t.right(turnSpeed)

  if t.color()[0] == 'green':  
    for i in range(30):
      t.forward(10)
      if checkCollision():
        x = random.randint(-300,300)
        y = random.randint(-300,300)
        scoreNum = scoreNum + 1
        scoreBoard.clear()
        scoreBoard.write('Score:' + str(scoreNum),font=('Arial',15, 'normal'))
        target.goto(x,y)
        t.penup()
        t.goto(0,0)
        t.color('blue')
        t.pendown()
        break
    else:
      break

Básicamente, tuve que anidar un bucle verdadero while en mi bucle while el color es azul junto con mi condicional para verificar si el código es verde. ¡Gracias a todos los que respondieron, por intentar ayudarme con mi problema! ¡Realmente lo aprecio!