Better handle user input

This commit is contained in:
raul 2025-01-16 20:39:29 +01:00
parent b5c1d62c29
commit ad249106cf
Signed by: raul
GPG Key ID: C1AA797073F17129
1 changed files with 23 additions and 4 deletions

View File

@ -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