diff --git a/class/scripts2/guess_number.sh b/class/scripts2/guess_number.sh index 57d7b2d..0b8d943 100755 --- a/class/scripts2/guess_number.sh +++ b/class/scripts2/guess_number.sh @@ -4,6 +4,7 @@ ATTEMPTS_NUM=7 POOL_NUM=100 RE='^[0-9]+$' +# Muestra la ayuda y sale del programa usage () { echo "Usage: ./guess_number.sh -p 50 -a 30" @@ -15,6 +16,7 @@ usage () exit } +# Recoge parámetros al ejecutar el script while getopts a:p:h flag; do case "${flag}" in a) ATTEMPTS_NUM=${OPTARG};; @@ -23,6 +25,7 @@ while getopts a:p:h flag; do esac done +# Muestra la cantidad actual de números y vidas restantes status() { clear cat <<'END_CAT' @@ -39,6 +42,9 @@ END_CAT echo "Intentos restantes: $ATTEMPTS_NUM" } +# Comprueba si el número introducido es correcto, +# si no es correcto, comprueba si es mayor o menos antes +# de devolver el resultado checkWin() { if [[ "$1" == "$RANDOM_NUM" ]]; then echo "Enhorabuena! El número era $RANDOM_NUM!" @@ -51,6 +57,11 @@ checkWin() { ATTEMPTS_NUM=$((ATTEMPTS_NUM - 1)) return 0 fi + + # Ya se que este código podría ser considerablemente + # acortado, pero prefiero Bash lo más explícito posible + # para evitar posibles complicaciones + if [[ $1 -lt $RANDOM_NUM ]]; then echo "El número es demasiado bajo!" ATTEMPTS_NUM=$((ATTEMPTS_NUM - 1)) @@ -59,6 +70,8 @@ checkWin() { fi } +# Comprueba si el número de intentos es igual a cero +# para terminar la partida checkLose() { if [[ $ATTEMPTS_NUM == 0 ]]; then echo "Pierdes! El número era $RANDOM_NUM :/" @@ -66,17 +79,23 @@ checkLose() { fi } +# Función principal main() { + # Genera un número aleatorio desde 0 hasta el número máximo + # configurado por el usuario RANDOM_NUM=$(seq 0 $POOL_NUM | tr " " "\n" | shuf -n1) - for (( ; ; )); do + for (( ; ; )); do status checkLose - - num_attempt="-1" - while [[ ! $num_attempt =~ $RE || $num_attempt > $POOL_NUM ]]; do + # Comprobación de entrada de usuario: + # Prohíbe cualquier entrada que no sea un número y que sea mayor al límite + while true; do read -p "Número: " num_attempt + if [[ $num_attempt =~ $RE ]] && (( $num_attempt <= $POOL_NUM )); then + break + fi done checkWin $num_attempt