#!/usr/local/bin/bash
# UN JUEGO DE AHORCADO ESCRITO PARA BASH
#
# Para jugar de permisos de ejecución al script e ingrese ./ahorcado.sh
#
# Este juego necesita una lista de palabras en palabras.dat en el mismo
# directorio del script ahorcado.sh
#
# Autor: Ashton Seth Reimer
# Date: Summer 2010
# License: See the license file included in the repository on github:
#          https://github.com/asreimer/bash_hangman
#
 
#incializa las palabras y arreglos que neceistamos
declare -a word
declare -a word_img
declare -a alpha_img
i=0
incorrect=0
wordindex=0
correct=0
alpha=("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z")
char=0
 
#esta función lee la lista de palabras de palabras.dat y las pone en un
#arreglo de palabras.
function readfile
{
 
exec 3<&0
exec 0< palabras.dat
while read LINE
do
 
word[i]=$LINE
i=`expr $i + 1`
done
exec 0<&3
}
 
#esta función elige una palabra al azar y la pone en un arreglo de
#palabras.
function readword {
	word_index=$RANDOM
 
	while [ $word_index -ge $i ]
	do
		word_index=$RANDOM
	done
	a=0
	while [ $a -lt ${#word[${word_index}]} ]
	do
		word_img[$a]=0
		a=`expr $a + 1`
	done
}
 
#esta función solicita una letra y revisa si es válida/correcta/incorrecta
function guess
{
	j=0
	correct=0
	echo -n "Adivina una letra: "
	read guess
	char=$guess
	if [ ${#guess} -eq "1" ]
	then
 
		guess=`echo $guess | tr "[:upper:]" "[:lower:]"`
		while [ $j -lt ${#word[${word_index}]} ]
		do
			if [ "$guess" == "${word[${word_index}]:$j:1}" ]
			then
				word_img[${j}]=1
				correct=1
			fi
			j=`expr $j + 1`
		done
	fi
	r=0
	numletter=0
	while [ ! $r == ${#word[${word_index}]} ]
	do
		numletter=`expr $numletter + ${word_img[$r]}`
		r=`expr $r + 1`
	done
}
 
#Las siguientes funciones dibjuan la horca y al ahorcado.
function gallows 
{
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_head 
{
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_body {
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "         |         |"
echo "         |         |"
echo "         |         |"
echo "         |         |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_arm1 {
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "         |         |"
echo "      ---|         |"
echo "         |         |"
echo "         |         |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_arm2 {
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "         |         |"
echo "      ---|---      |"
echo "         |         |"
echo "         |         |"
echo "                   |"
echo "                   |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_leg1 {
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "         |         |"
echo "      ---|---      |"
echo "         |         |"
echo "         |         |"
echo "        /          |"
echo "       /           |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
function gallows_leg2 {
clear
echo "          __________"
echo "         |         |"
echo "         |         |"
echo "       _/_\_       |"
echo "        |_|        |"
echo "         |         |"
echo "      ---|---      |"
echo "         |         |"
echo "         |         |"
echo "        / \        |"
echo "       /   \       |"
echo "                   |"
echo "      _____________|_____"
echo "                           "
}
 
#esta función imprime la pantalla de triunfo.
function win {
echo " ____  _              _ "
echo "| __ )(_) ___ _ __   | |"
echo "|  _ || |/ _ | '_  | | |"
echo "| |_) | || __/ | | | |_|"
echo "|____/|_||___|_| |_| (_)"
echo -en "\n\n\n"
}
 
#esta función imprime la pantalla de perder
function lose {
echo "Perdiste..."
echo "La palabra era ${word[$word_index]}"
}
 
#esta función imprime las letras adividadas en la pantalla y subraya las
#letras que no han sido adivinadas.
function print_alpha {
	echo -e "\nLetras ya dichas:"
 
	e=0
	while [ ! "$e" == "26" ]
	do
		if [ "$char" == "${alpha[$e]}" ]
		then
			alpha_img[$e]="1"
		fi
 
		if [ ${alpha_img[$e]} == "1" ] 
		then
			echo -n ${alpha[$e]}
		else
			echo -n "-"
		fi
 
		if [ $e == "12" ]
		then
			echo -e "\n"
		fi
		e=`expr $e + 1`
	done
	echo -ne "\n\n"
	char=""
}
 
#Función para imprimir las letras correctamente adivinadas o tacha las palabras no adivinadas aún.
function print_word {
	echo -ne "\nPalabra: "
	t=0
	while [ ! $t == ${#word[${word_index}]} ]
	do
			if [ ${word_img[${t}]} == "1" ]
			then
				echo -n "${word[${word_index}]:$t:1}"
			else
				echo -n "-"
			fi
			t=`expr $t + 1`
	done
	echo -e "\n\n"
}
 
 
#######################################
# el programa principal comienza aquí.
#######################################
 
readfile;
gameover=0
incorrect=0
correct=0
while [ "$gameover" == "0" ]
do
 
	a=0
	while [ ! "$a" == "26" ]
	do
		alpha_img[$a]=0
		a=`expr $a + 1`
	done
 
	word_img=0
	alpha_img=0	
	incorrect=0
	correct=0
	readword;
	a=0
	gallows;
	print_alpha;
	print_word;
 
        #revisa las condiciones de ganar/perder y actualiza el status
        #del ahorcado
	while [[ ! "${numletter}" == "${#word[${word_index}]}" && ! "$incorrect" == "6" ]]
	do
		guess;
 
		if [ $correct == "0" ]
		then 
			incorrect=`expr $incorrect + 1`
		fi	
 
		if [ $incorrect == "0" ]
		then
			gallows;
		elif [ $incorrect == "1" ]
		then
			gallows_head;
		elif [ $incorrect == "2" ]
		then
			gallows_body;
		elif [ $incorrect == "3" ]
		then
			gallows_arm1;
		elif [ $incorrect == "4" ]
		then
			gallows_arm2;
		elif [ $incorrect == "5" ]
		then
			gallows_leg1;
		elif [ $incorrect == "6" ]
		then
			gallows_leg2;
		fi
		print_alpha;
		print_word;
 
	done
 
	if [ "${numletter}" == "${#word[${word_index}]}" ]
	then
	clear
	win;
	gameover=1
	fi
	if [ $incorrect == "6" ]
	then
	lose;
	gameover=1
	fi
 
	if [ "$gameover" == "1" ] 
	then
		echo -e "\n\n Jugar de nuevo? (s/n)"
		read answer
		if [ "$answer" == "s" ]
		then
			gameover=0
		fi
		clear
	fi
done
exit 0