#!/usr/bin/perl -w use strict; # Locais my %loc = ( 'sala' => { descr => 'a sala', norte => 'quarto' }, 'quarto' => { descr => 'o quarto', sul => 'sala', }, 'rua' => { descr => 'a rua' }, ); # Objetos my %obj = ( 'lanterna' => { descr => 'uma lanterna', local => 'quarto' }, 'chave' => { descr => 'uma chave', local => 'quarto' }, 'mesa' => { descr => 'uma mesa', local => 'sala' }, 'porta' => { descr => 'uma porta', local => 'sala' } ); # Verbos my %vrb = ( 'pegue' => '&pegar(@obj)', 'solte' => '&soltar(@obj)', 'examine' => '&examinar(@obj)', 'norte' => '&ir("norte")', 'sul' => '&ir("sul")', 'leste' => '&ir("leste")', 'oeste' => '&ir("oeste")', 'fim' => '&fim', 'quit' => '&fim', 'exit' => '&fim', 'temos' => '&temos', 'abra' => '&abrir(@obj)', ); my %jogador = ( 'local' => 'sala', # Posicao inicial ); while (1) { # Imprime a posicao atual do jogador e pede um comando print "[[ $loc{$jogador{local}}->{descr} ]]\n"; my @lista = listar_objetos_em($jogador{local}); if (@lista) { print "Eu vejo aqui: ", join(", ",@lista), "\n"; } print "> "; my $frase = <>; chomp $frase; # Divide comando em verbo e objetos my ($vrb,@obj) = split (/\s+/, $frase); # Verifica se o verbo existe if (defined $vrb{$vrb}) { eval($vrb{$vrb}); print $@ if defined $@; } else { print "Não sei como fazer isso!\n"; } } ### sub fim { # Termina o jogo exit; } ### sub ir { # Move o jogador em determinada direcao (se possivel) my $direcao = shift; if (defined $loc{$jogador{local}}->{$direcao}) { $jogador{local} = $loc{$jogador{local}}->{$direcao}; } else { print "Não posso seguir por aí!\n"; } } ### sub examinar { # Examina um objeto my $obj = shift; if ($obj{$obj}->{local} eq $jogador{local} or $obj{$obj}->{local} eq 'jogador') { print "É apenas $obj{$obj}->{descr} comum.\n"; } else { print "Não vejo $obj{$obj}->{descr} por aqui.\n"; } } ### sub pegar { # Pega um objeto my $obj = shift; if ($obj{$obj}->{local} eq $jogador{local}) { $obj{$obj}->{local} = 'jogador'; print "Ok\n"; } elsif ($obj{$obj}->{local} eq 'jogador') { print "Você já tem $obj->{descr}!\n"; } else { print "Não vejo $obj{$obj}->{descr} por aqui.\n"; } } ### sub soltar { # Solta um objeto my $obj = shift; if ($obj{$obj}->{local} eq 'jogador') { $obj{$obj}->{local} = $jogador{local}; print "Ok\n"; } else { print "Você não tem $obj{$obj}->{descr}.\n"; } } ### sub temos { # Lista objetos sendo carregados pelo jogador my @lista = listar_objetos_em("jogador"); print "Você está carregando: "; if (@lista) { print join(",", @lista), "\n"; } else { print "Nada de interessante.\n"; } } ### sub listar_objetos_em { # Lista os objetos em um determinado local my $local = shift; my @lista; foreach (keys %obj) { if ($obj{$_}->{local} eq $local) { push @lista, $_; } } return @lista; } ### sub abrir { # Abre um objeto my $obj = shift; if ($obj ne 'porta') { print "Não posso abrir isso!\n"; return; } if ($obj{$obj}->{local} eq $jogador{local}) { if ($obj{chave}->{local} eq 'jogador') { print "Ok\n"; $obj{$obj}->{aberta} = 1; } else { print "A porta está trancada!\n"; } } else { print "Onde você está vendo $obj{$obj}->{descr}?\n"; } }