#!/usr/bin/perl # # This script allows playing a Hangman-like game # # Author: JuanFco Rodriguez Hervella # Email: jrh@it.uc3m.es, jrh7jrh@hotmail.com # # Version: 1.1 for X-Chat # # Im learning Perl, so this code will have a lot of # bugs, but I think it works. Please, if you do # any improvement send me the patches. I do this # under GNU General Public License (see http://www.gnu.org) # # Please improve this software ! I know this can be done better !!. # # ----> NOTES ABOUT THE GAME: <---- # # This game defines one command handlers: # /hangman -> needed to start/stop/reset the game. # # Note that when someone says "!l" or "!r", you will see # first the answer from the game, and later the command that the user typed. # # ###################### # VARS. GLOBALES # ###################### my $active=0; # para saber si estamos jugando o no. my $linea= ""; # lleva la linea my $linea_cod= ""; #lleva la linea codificada, que se va actualizando. my @letras = (); # Array con las letras ya dichas. my $quedan=0; # lleva el num. de letras que faltan por resolver. my @score= (); # Puntuaciones. my $channel=0; # canal donde se juega. #################### # INICIALIZACION # #################### IRC::register ("hangman", "1.0", "", ""); IRC::add_command_handler("hangman","hangman_cmd_hnd"); IRC::add_command_handler("", "my_privmsg_hnd"); # para parsear mi propio "output" IRC::add_message_handler("PRIVMSG", "hangman_privmsg_hnd"); IRC::print("-> HangMan has been successfully loaded <-"); #################### # Func. Auxiliares # #################### sub adivinada { IRC::command("**** Bingo\!\!. $_[0] lo ha resuelto."); IRC::command("**** La frase era: \"$linea\""); # Actualizamos la puntuacion. my $update=0; if( @score == () ) { push(@score, $_[0], 1); } else { for( my $i=0; $i <= $#score; $i=$i+2) { if( $score[$i] =~ $_[0] ) { $score[$i+1] = $score[$i+1]+1; $update=1; } } if( $update == 0) { push( @score, $_[0], 1); } } # Mostramos las puntuaciones. IRC::command("**** Las puntuaciones quedan asi: ****"); for(my $i=0; $i <= $#score; $i=$i+2) { IRC::command("**** $score[$i] : $score[$i+1] ptos."); } # Terminanos el juego. IRC::command("****"); $active=0; } sub existe { #IRC::print("@letras"); #IRC::print("$_[0]"); for(my $i=0; $i<= $#letras; $i++) { if($letras[$i]=~ $_[0]) { return 1; } } return 0; } sub quiere_resolver { if( $_[1] eq $linea ) { adivinada($_[0]); } else { IRC::command("**** $_[0]: fallaste en la resolucion."); } } sub quiere_letra { my $nueva= 0; my $letra= substr($_[1],0,1); if( existe($letra) ) { IRC::command("**** La letra \"$letra\" ya ha sido dicha."); IRC::command("**** Adivina: $linea_cod"); return 1; } for( my $i=0; $i -> inicia el juego."); IRC::print("/hangman stop -> detiene el juego"); IRC::print("/hangman reset -> resetea puntuaciones"); IRC::print("/hangman -> esta ayuda"); IRC::print("**************************************************"); } ################################# # Manejadores # ################################# sub hangman_cmd_hnd { my $params= $_[0]; $params=~ s/\s+/ /g; $params=~ s/^\s//g; @args= split(/ /, $params); #IRC::print("@args"); $channel=IRC::get_info(2); $active=1; if( ($args[0] eq "") || ($args[0] ne "reset" && $args[0] ne "stop" && $args[0] ne "start") ) { ayuda; return 1; } if( $args[0] eq "start" && $args[1] eq "" ) { ayuda; return 1; } if( $args[0] eq "stop" ) { $active= 0; IRC::command("**** HangMan ha sido detenido ****"); return 1; } if( $args[0] eq "reset" && $args[1] eq "" ) { IRC::command("**** Las puntuaciones han sido inicializadas ****"); @score= (); return 1; } if ($active) { IRC::command("**** Empieza el juego del HangMan\! ****"); IRC::command("**** !l -> para decir una letra."); IRC::command("**** !r -> resuelves la adivinanza."); # Inicializo. Nota: el score no se resetea de una partida a otra. $linea= ""; $linea_cod= ""; $quedan=0; @letras = (); my $i=1; my $j=0; my $aux= " "; while($args[$i] ne "") { substr($aux,$j,length($args[$i]), $args[$i]); $j=$j+length($args[$i])+1; $i++; } substr($aux,$j-1,1, "*"); $aux=~ /^(.*)\*(.*)$/; $linea= $1; $linea_cod= $linea; for($i=0;$i