Juego del Ahorcado.

d
Nombre: Ahorcado.bash
Autor: blackman
Descripción: Script que permite jugar "Ahorcado" en la terminal
Visto en Espacio Linux
El script hace uso de un archivo de texto donde va sacando las palabras a adivinar
#!/bin/bash

function message() {
    case $mensage in
 game_banner) #tput cup 1 $cols
   echo
   tput rev
   echo "$(tput setaf 4)EL JUEGO DEL AHORCADO EN BASH SCRIPT$(tput sgr0)"
   echo
   echo "$(tput setaf 7)$(tput bold)Contiene $(tput setaf 1)$(( $long_palabra-$espacios ))$(tput setaf 7) caracteres sin contar los espacios"
   echo "$(tput setaf 7)Puedes usar los comodines. Dispones de $(tput setaf 1)$comodines$(tput setaf 7). Para usarlos pulsa $(tput setaf 1)+"
   [[ $(( 6-intentos )) -lt 2 ]] && vida="vida" || vida="vidas"
   echo "$(tput setaf 7)Dispones de $(tput setaf 1)$(( 6-intentos )) $vida"
   #echo "$(tput setaf 7)El nombre de este país es $(tput setaf 1)$palabra"¡
   echo
   echo "$(tput setaf 7)El nombre de este país es: $(tput setaf 1)$word"
   echo -n "$(tput setaf 7)Vidas: $(tput setaf 1)"
   for (( i=1; i<=$(( 6-intentos )); i++ )); do echo -n $'\342\231\245'; done; echo
   echo -n "$(tput setaf 7)Comodines: $(tput setaf 1)"
   for (( i=1; i<=$comodines; i++ )); do echo -n $'\342\230\245'; done; echo
   echo "$(tput setaf 7)Caracteres restantes: $(tput setaf 1)$(( ($long_palabra-$espacios)-$aciertos ))"
   echo "$(tput setaf 7)Puntuación: $(tput setaf 1)$score";;
 game_over)  echo "$(tput setaf 2)Fenomenal, eres un crack";;
 game_read) read -n1 -p "$(tput setaf 7)Vida $(tput setaf 1)$intentos $(tput setaf 7)de $(tput setaf 1)5$(tput setaf 7). Introduce una letra: $(tput setaf 1)" caracter
   echo;;
 salir)  echo
   tput rev
   echo "$(tput setaf 1)GameOver$(tput sgr0)"
   echo "$(tput setaf 7)$(tput bold)Tu mejor puntuación es: $(tput setaf 1)$best_score"
   echo "$(tput setaf 7)Tu puntuación acumulada es: $(tput setaf 1)$acumulado"
   echo
   echo "$(tput setaf 7)La solución es: $(tput setaf 1)$palabra"
   echo "$(tput setaf 7)Que deseas hacer?"
   read -n1 -p "$(tput setaf 7)Pulsa $(tput setaf 1)Q $(tput setaf 7)para $(tput setaf 1)salir $(tput setaf 7)o $(tput setaf 1)G $(tput setaf 7)para $(tput setaf 1)volver a jugar$(tput setaf 7). Introduce una letra: $(tput setaf 1)" caracter
   echo "$(tput setaf 7)";;
 comodines_restantes) echo "$(tput setaf 4)Te dispones a usar un comodín. Suerte, sólo dispones de $(tput setaf 1)$comodines"
    echo "$(tput setaf 2)Comodín = $(tput setaf 1)$caracter";;
 comodines_finalizados) echo "$(tput setaf 4)Ups, has gastado todos los comodines";;
 continuar) read -n1 -p "$(tput setaf 1)Pulsar cualquier tecla para continuar$(tput setaf 7)";;
 acierto_mal) echo "$(tput setaf 4)Has fallado, ahora tienes un intento menos";;
 #acierto_letra) echo "$(tput setaf 7)Letra introducida: $(tput setaf 1)$letra";;
 acierto_bien) echo "$(tput setaf 2)Muy bien, ya casi lo tienes";;
 acierto_repetido) echo "$(tput setaf 3)Upps, Esa letra ya la has introducido";;
    esac
}
function init {
#file="diccionario"
    file="paises"
    max=$(cat $file | wc -l)
    num=$(( $RANDOM%$max ))
    palabra=$(head -$num $file | tail -1)
    aciertos=0
    #diccionario
    #palabra=$(echo ${palabra%% *,,} | sed 's/á/a/g;s/é/e/g;s/í/i/g;s/ó/o/g;s/ú/u/g')

    palabra=$(echo ${palabra,,} | sed 's/á/a/g;s/é/e/g;s/í/i/g;s/ó/o/g;s/ú/u/g;s/-/ /g;s/Á/a/g')
    long_palabra=${#palabra}
    comodines=$(( long_palabra/4 ))
    score=$(( (comodines*50)+500 ))
    #PROVISIONAL
    ###########################
    #[[ $long_palabra -lt 15 ]] && main;
    ###########################
    unset array[*]
    i=0; espacios=0; unset word
    while [[ $i -le $(( $long_palabra-1 )) ]]
 do
     caracter="${palabra:$i:1}"
     if [[ $caracter = " "  ]]
  then
      (( espacios++ ))
      caracter=" "
  else
      array=( ${array[*]} $caracter )
      caracter="-"
     fi
     word="$word $caracter"
     (( i++ ))
    done
}

function comodin {
    if [[ $comodines -gt 0 ]]
 then
     long_array=$(( ${#array[*]}-1 ))
     index=$(( $RANDOM%${#array[*]} ))
     caracter=${array[$index]}
     i=0
     while [[ $i -le $long_array ]]
  do
      if [[ ${array[$i]} = $caracter ]]
   then
       unset array[$i]
       array2=( ${array2[*]} $caracter )
       (( aciertos++ ))
       score=$(( score+50 ))
      fi
      (( i++ ))
     done
     array=( ${array[*]} )
     array2=( ${array2[*]} )
     (( comodines-- ))
     (( intentos-- ))
     mensage="comodines_restantes"; message mensage
    else
 (( intentos-- ))
 mensage="comodines_finalizados"; message mensage
    fi
    mensage="continuar"; message mensage
    game
}

function acierto {
    unset find
    long_array=$(( ${#array[*]}-1 ))
    i=0
    while [[ $i -le $long_array ]]
 do
     if [[ ${array[$i]} = $caracter ]]
  then
      unset array[$i]
      find="true"
      array2=( ${array2[*]} $caracter )
      (( aciertos++ ))
      score=$(( score+100 ))
     fi
     (( i++ ))
    done
    if [[ $find = "true" ]]
 then
     mensage="acierto_bien"; message mensage
     (( intentos-- ))
 else
     long_array2=$(( ${#array2[*]}-1 ))
     i=0
     while [[ $i -le $long_array2 ]]
  do
      if [[ ${array2[$i]} = $caracter ]]
   then
       find="true"
      fi
      (( i++ ))
     done
     if [[ $find = "true" ]]
  then
      mensage="acierto_repetido"; message mensage
      (( intentos-- ))
      score=$(( score-10 ))
  else
      mensage="acierto_mal"; message mensage
      score=$(( score-50 ))
     fi
    fi
    array=( ${array[*]} )
    array2=( ${array2[*]} )
    mensage="continuar"; message mensage
    game
}
function game {
    clear
    lines=$(( $(tput lines)/10 ))
    cols=$(( $(tput cols)/10 ))
    i=0; unset word;
    while [[ $i -le $(( $long_palabra-1 )) ]]
 do
     letra="${palabra:$i:1}"
     if [[ $letra = " "  ]]
  then
      letra=" "
  else
      unset letra_acertada
      for x in ${array2[*]}
   do
       if [[ $x = $letra ]]
    then
        letra_acertada="true"
       fi
      done
      if [[ $letra_acertada != "true" ]]
   then
       letra="-"
      fi
     fi
     word="$word $letra"
     (( i++ ))
    done
    (( intentos++ ))
    mensage="game_banner"; message mensage
    dibujo
    if [[ $intentos -gt 5 ]]
 then
     [[ $best_score -eq 0 ]] && best_score=0
     [[ $acumulado -eq 0 ]] && acumulado=0
     salir
    fi

    if [[ -z ${array[*]} ]]
 then
     [[ $score -gt $best_score ]] && best_score=$score
     acumulado=$(( acumulado+score ))
     mensage="game_over"; message mensage
     salir
    fi
    mensage="game_read"; message mensage
    if [[ $caracter = "+" ]]
 then
     comodin
    fi
    acierto
}

function dibujo {
    case $intentos in
 1) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo;;
 2) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo "               | "
  echo "               | "
  echo;;
 3) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo "              \| "
  echo "               | "
  echo;;
 4) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo "              \|/"
  echo "               | "
  echo;;
 5) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo "              \|/"
  echo "               | "
  echo "              /  "
  echo;;
 *) echo "________________ "
  echo "               | "
  echo "               | "
  echo "               O "
  echo "              \|/"
  echo "               | "
  echo "              / \\"
  echo;;
    esac
}
function salir {
    mensage="salir"; message mensage
    case $caracter in
 q) clear;exit;;
 g) unset word; unset intentos; unset comodines; unset aciertos; unset score; unset array[*]; unset array2[*];main;;
 *) clear; mensage="game_banner"; message mensage; dibujo; salir;;
    esac
    clear
}

function main {
    init
    game
}
main
Permisos: chmod 700 ahorcado.bash 
Ejecución: ./ahorcado.bash
Y a jugar! :D

0 comentarios: