Estoy escribiendo código Python para el juego Tic Tac Toe, sin embargo, ya me he topado con un obstáculo y parece que no puedo salir de un bucle While:

print("Welcome to Tic Toe!")

Player1_Tag=input("Player 1: Choose between X and 0: ")

while Player1_Tag != "X" or Player1_Tag != "0":
    print("Invalid input")
    Player1_Tag=input("Player 1: Choose between X and 0: ")
else:
    if Player1_Tag=="X":
        Player2_Tag="0"
    else:
        Player2_Tag="X"

Cuando ejecuto este programa, me pregunta si quiero ser "X" o "0"; si elijo '#', por ejemplo, obtengo "Entrada no válida" y me pregunta nuevamente, en cuyo caso elijo "X" pero nuevamente me da "Invalid input" y me pregunta de nuevo ... que por supuesto no es lo que quiero. Estoy confundido ya que no entiendo por qué el ciclo continúa a pesar de que elijo una entrada válida.

He intentado poner un "descanso" en el bucle while, pero el bucle se rompe si elijo una entrada no válida dos veces consecutivas ... que no es lo que quiero, quiero que me pregunte nuevamente por tercera vez, cuarta vez hasta que hazlo bien.

0
Sorath 1 oct. 2019 a las 22:32

3 respuestas

La mejor respuesta

Player1_Tag != "X" or Player1_Tag != "0" siempre será verdadero.

Considere 3 posibilidades:

  1. Si Player1_Tag == "X", entonces Player1_Tag != "0"
  2. Si Player1_Tag == "0", entonces Player1_Tag != "X"
  3. Si Player1_Tag es otra cosa, no es "X" ni "0".

Una forma más clara de escribir esto sería while Player1_Tag not in ("X","0"):

1
Scott Hunter 1 oct. 2019 a las 19:42

Su problema es causado por un error lógico en la condición que está probando en su bucle. Actualmente estás probando Player1_Tag != "X" or Player1_Tag != "0", que siempre es True, independientemente de lo que sea Player1_Tag. Si la variable es igual a una de las cadenas, no será igual a la otra. Como unirá las dos comparaciones con or, nunca saldrá del ciclo.

Debe unir las piezas de su prueba con and en lugar de or (Player1_Tag != "X" and Player1_Tag != "0"), o negar las comparaciones (cambiando != a ==) y haga una negación de la expresión completa: not (Player1_Tag == "X" or Player1_Tag == "0"). Según las leyes de De Morgan, son equivalentes.

1
Blckknght 1 oct. 2019 a las 19:41

El problema es que has usado or cuando deberías haber usado and

Si Player1_Tag es igual a 0 al mismo tiempo no es igual a X Y or comprueba si alguno de ellos es 'Verdadero'

0
Bendik Knapstad 1 oct. 2019 a las 19:39
58191206