diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2013-08-26 20:05:37 (GMT) |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2013-09-02 16:07:46 (GMT) |
commit | 2be095e74e1bef85daddbcf33d53bcd00a7b4f3a (patch) | |
tree | a224c57a0fb69fe4b735ff74ed2932df2afb2163 | |
parent | fd9a0e6715f83fcae54edffba5cabbfbae286eb6 (diff) |
Agregar validación de entradas y control de errores en el juegomaster-es
Ahora es completa!
-rw-r--r-- | maze.py | 93 |
1 files changed, 69 insertions, 24 deletions
@@ -17,23 +17,26 @@ una cuadrícula entera de tamaño dado. (0, 0) es el nodo de inicio y (size, size) es el nodo de acabado. Esta es una forma estándar para representar un grafo en un programa. -Por último, la clase MazeGame debe ser escrito para unir ambas Maze y Player. -Esta clase debe implementar la interfaz de usuario, preguntando repetidamente -el jugador que se mueven van a hacer, a continuación, actualizar la ubicación -del jugador en consecuencia. - -La implementación de este requiere un método que se añade a Maze para recuperar -una lista de los nodos que legítimamente el jugador puede mover a partir de su -ubicación actual. Para evitar romper la compartimentación y la codificación de -la conducta del jugador en la clase Maze, el método toma un nodo como un -parámetro en lugar de acceder a la ubicación del reproductor directamente. - -Una característica del lenguaje a destacar es el uso de "while...else" in -MazeGame.run(). El código en el bloque 'else' se ejecutará inmediatamente -después de la última iteración del bucle 'while', pero no se ejecutará si la -ejecución sale de la curva mediante la ejecución de la instrucción 'break'. -Esto significa que el "que ha ganado" el mensaje no se imprimirá si el usuario -sale el juego antes de tiempo. +Para ser un programa estable y robusto, el juego debe hacer frente a la entrada +del usuario inesperada o incorrecta. ¿Qué sucede si el usuario introduce una +cadena en lugar de un entero cuando se le preguntó por el tamaño laberinto, o +para su próximo destino? ¿Qué sucede si presiona Ctrl+C (una señal de +terminación en Linux), mientras que el programa está a la espera para la +entrada? Trate de hacer estas cosas con la versión anterior del programa y ver +qué salvedades. Con el fin de hacer que el programa más robusto, estas +excepciones deben ser manejados de forma explícita. + +El código para manejarlos se ha añadido a continuación. Tenga en cuenta que el +tamaño del laberinto se valida dos veces: una vez cuando el usuario introduce +el tamaño, comprobando que se trata de un entero válido y se encuentra entre +los límites establecidos para que el juego sea divertido, y una vez cuando se +crea una instancia del objeto Maze, comprobando que el tamaño no viola ninguna +de las restricciones algorítmicas en la aplicación Maze. Para hacer todo el +control en la entrada significaría tendría que ser reescrita si la clase Maze +fue reutilizado en otro programa de los controles algorítmicos. Para hacer todo +el control de la clase Maze ataría muy de cerca a este juego en particular, +rechazando todos los tamaños laberinto que no encajan en este juego en +particular. """ import random @@ -78,6 +81,10 @@ class Maze(object): lo menos 1. """ def __init__(self, size): + # Validate the size. + if size < 1: + raise AttributeError('size must be at least 1') + self._links = {} self._finish_node = (size, size) self.__generate_maze(size) @@ -200,8 +207,33 @@ class MazeGame(object): opciones de movimiento del jugador. """ def __init__(self): - name = raw_input('Introduzca su nombre: ') - size = int(raw_input('Introduzca el tamaño del laberinto (5–20): ')) + self._player = None + self._maze = None + + # Obtener el nombre del jugador. + while True: + try: + name = raw_input('Introduzca su nombre: ') + if name != '': + break + except KeyboardInterrupt: + # Usuario presiona Ctrl+C, continuar hasta que llegamos a run() + print('') + return None + + # Obtener el tamaño del laberinto. + while True: + try: + size = int( + raw_input('Introduzca el tamaño del laberinto (5–20): ')) + if 1 <= size <= 20: + break + except ValueError: + continue # usuario haya introducido un número entero válido + except KeyboardInterrupt: + # Usuario presiona Ctrl+C, continuar hasta que llegamos a run() + print('') + return None self._player = Player(name) self._maze = Maze(size) @@ -230,14 +262,27 @@ class MazeGame(object): print(' 0) Salir del juego') # Pida al usuario la opción que quieran. - chosen_option = int(raw_input('Ingrese el número de su elección: ')) - if chosen_option == 0: - return None # salir del juego - else: - return adjacent_nodes[chosen_option - 1] + while True: + try: + chosen_option = \ + int(raw_input('Ingrese el número de su elección: ')) + if chosen_option == 0: + return None # salir del juego + elif 0 <= chosen_option - 1 < len(adjacent_nodes): + return adjacent_nodes[chosen_option - 1] + except ValueError: + continue # sin número introducido + except KeyboardInterrupt: + print('') + return None # jugador presionó Ctrl+C: salir del juego def run(self): """Ejecutar el juego hasta que el jugador gana o se cierra.""" + # Compruebe que la inicialización se ha realizado correctamente, y si + # no, salga inmediatamente. + if self._player is None or self._maze is None: + return # salir del juego + while self._player.location != self._maze.finish_node: chosen_node = self.__choose_next_location() if chosen_node is None: |