#!/bin/bash RANDOM_NUM=0 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" echo "" echo "PARAMETERS" echo " -h (Show this help prompt)" echo " -a $ (set the amount of available attempts)" echo " -p $ (set the amount of numbers that will be generated)" exit } # Recoge parámetros al ejecutar el script while getopts a:p:h flag; do case "${flag}" in a) ATTEMPTS_NUM=${OPTARG};; p) POOL_NUM=${OPTARG};; h) usage;; esac done # Muestra la cantidad actual de números y vidas restantes status() { clear cat <<'END_CAT' ______________ < Buena suerte > -------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || END_CAT echo "Intenta adivinar el número entre 0 y $POOL_NUM!" 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!" exit fi if [[ "$1" != "$RANDOM_NUM" ]]; then if [[ $1 -gt $RANDOM_NUM ]]; then echo "El número es demasiado alto!" 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)) return 0 fi 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 :/" exit 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 status checkLose # 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 read -p "Pulse enter para continuar: " done } main