Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip 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)
commit2be095e74e1bef85daddbcf33d53bcd00a7b4f3a (patch)
treea224c57a0fb69fe4b735ff74ed2932df2afb2163
parentfd9a0e6715f83fcae54edffba5cabbfbae286eb6 (diff)
Agregar validación de entradas y control de errores en el juegomaster-es
Ahora es completa!
-rw-r--r--maze.py93
1 files changed, 69 insertions, 24 deletions
diff --git a/maze.py b/maze.py
index c540e6c..a4defff 100644
--- a/maze.py
+++ b/maze.py
@@ -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: