Juego con Perl POE
En este juego el ordenador piensa un número del 1 al 20 y te da 5 oportunidades para adivinar. Si le erras te da una pista sobre si su número es mayor o menor al número que le dijiste. Para ponerlo más difícil hay un timeout de 10 segundos para que adivines el número o perderás el juego.
Por qué POE
Cuando un programa necesita interacción con el usuario o con datos externos, necesitamos una estructura de programa que sea más expresiva.
POE es un framework para la creación de programas en Perl donde se presentan naturalmente tareas que implican reaccionar ante datos externos o eventos, como las comunicaciones de red o las interfaces de usuario. Los programas en POE son no-lineales, se configuran un montón de pequeñas subrutinas y se define la forma en que se llaman entre sí. POE cambiará automáticamente entre ellas mientras maneja la entrada y salida del programa.
use strict;
use POE qw/Wheel::ReadLine/;
$|++;
POE::Session->create(
inline_states =>
{ _start => \&handler_start,
gotLine => \&handler_gotLine,
prompt => \&handler_prompt,
gameover => \&handler_gameover,
timeout => \&handler_timeout,
}
);
my $limite= 20;
my $intentos_total= 5;
my $intentos= $intentos_total;
my $numero= int(rand($limite-1)) + 1;
print "Adivina el numero$/";
print "Hola!!!, estoy pensando un número del 1 al $limite. ";
print "Tienes $intentos oportunidades para adivinarlo$/";
$poe_kernel->run();
print "\n";
sub handler_start {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
$heap->{wheel} = POE::Wheel::ReadLine->new
(
InputEvent => 'gotLine',
);
$kernel->yield('prompt');
}
sub handler_prompt {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
my $tiempo= 10;
print "Tienes $tiempo segundos para adivinar, o perderás el juego!$/";
if (2>$intentos){
print "Es tu última oportunidad$/";
}
$heap->{wheel}->get('Tipea rápido: ');
$kernel->delay('timeout',$tiempo);
}
sub handler_timeout {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
print "$/El número era $numero, tardaste demasiado tiempo, game over$/";
$heap->{wheel}=undef;
}
sub handler_gameover {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
print "\nEl número era $numero, lo siento, game over\n";
$kernel->delay('timeout');
}
sub handler_gotLine {
my ($kernel, $heap, $session, $arg, $exception) =
@_[KERNEL, HEAP, SESSION, ARG0, ARG1];
if(defined $arg) {
$heap->{wheel}->addhistory($arg);
$intentos--;
if ($numero==$arg){
print "Excelente! Mi número era el $numero. Lo conseguiste en " . ($intentos_total - $intentos) . " intentos!$/";
$kernel->delay('timeout');
$heap->{wheel}=undef;
return;
}elsif($numero>$arg){
print "El número es mayor que $arg$/";
}else{
print "El número es menor que $arg$/";
}
if (1>$intentos){
$kernel->yield('gameover');
return;
}
}
else {
print "Got input exception '$exception'. Exiting...$/";
$heap->{wheel}=undef;
$kernel->delay('timeout');
return;
}
$kernel->yield('prompt');
}
Salida
Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 8
El número es mayor que 8
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 18
El número es menor que 18
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido:
El número era 14, tardaste demasiado tiempo, game over
Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 1
El número es mayor que 1
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 2
El número es mayor que 2
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 3
El número es mayor que 3
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 4
El número es mayor que 4
Tienes 10 segundos para adivinar, o perderás el juego!
Es tu última oportunidad
Tipea rápido: 5
El número es mayor que 5
El número era 13, lo siento, game over
Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 10
El número es mayor que 10
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 15
Excelente! Mi número era el 15. Lo conseguiste en 2 intentos!
Desafío
Como tarea final te dejo una modificación para que al finalizar el juego te pregunte que si quieres volver a jugar, y que puedas jugarlo otra vez.