Tengo un list con número de índice del 0 al 5. Le digo al usuario que ingrese la posición donde desea marcar ('X') en la lista y luego imprima la lista cada vez que el usuario ingresa un número de índice. Quiero que el usuario ingrese solo una vez en un número de índice de la lista y si el usuario intenta sobrescribir el valor escrito en una lista, quiero enviar un mensaje al usuario como entrada 'no puede ir allí, intente nuevamente en diferentes posición'. Quiero seguir ejecutando la entrada hasta que el usuario ingrese un valor en una posición no escrita en la lista.

Traté de hacerlo en OOP ya que estoy practicando OOP. Hago un tablero y luego lo visualizo con el método print_Board (). En el método input_Value () intenté hacer que se ejecute bajo un ciclo while y romper el ciclo cuando se llenan todas las posiciones ... también utilicé un error de intento de captura ... que verificará si el valor de entrada debe tener el número de índice de 1 solo para 6.

class Overwrite:

    list = ['.', '.', '.', '.', '.', '.']

    def print_Board(self):
        print(self.list[0:3])
        print(self.list[3:6])

    def input_Value(self):
        while True:
            try:
                self.position = input('enter a number between 1 to 6:')     # input a value
                if self.position not in ['1', '2', '3', '4', '5', '6']: # checking if the number is in range(1 to 6) or not
                    print('please try again a number between 1 to 6')
                    continue
                self.position = int(self.position) - 1  # putting -1 so that user input is different than
                self.list[self.position] = 'X'
                self.print_Board()
            except IndexError:
                print('please try again a number between 1 to 6:')
            except ValueError:
                print('please try again a number between 1 to 6:')
            else:
                if '.' not in self.list:  # it will stop the program when all the positions are filled
                    break

    def gameplay(self):
        self.print_Board()
        self.input_Value()
0
Anmol Grewal 29 may. 2020 a las 17:28

3 respuestas

La mejor respuesta

La forma más sencilla en que puedo pensar en hacer esto es incluir otra declaración de selección:

if self.list[self.position] == 'X':
    print("you can't go there please try again in different position")
    continue

Esto verificará si el índice seleccionado ya estaba mutado a 'X', si es así, reiniciará el ciclo while. De lo contrario, continuará a través de su código para cambiar la posición a 'X'

Aunque para la práctica general, tenga cuidado de usar las palabras clave de pitones como nombres de variables (self.list)

1
Brenden Price 29 may. 2020 a las 14:49

Compruebe si ese elemento de la lista ya es igual a X, y si es así, imprima un mensaje y continúe con el ciclo de entrada.

self.position = int(self.position) - 1
if self.list[self.position] == 'X':
    print('you already entered that position, please try again')
    continue
else:
    self.list[self.position] = 'X'
1
John Gordon 29 may. 2020 a las 14:34

Puede definir una nueva clase de lista con un método diferente __setitem__.

class ListNoOverwrite(list):

    def __setitem__(self, key, value):
        if super().__getitem__(key) == 'X':
            print("Sorry, you can't do that")
            return 1
        else:
            super().__setitem__(key, value)
            return 0
1
Eric Jin 29 may. 2020 a las 14:44