Acme-Monkey
view release on metacpan or search on metacpan
bin/monkey_ship.pl view on Meta::CPAN
#!/usr/bin/perl
use strict;
use warnings;
use Acme::Monkey::Frame;
use Acme::Monkey::Frame::Layer;
use Term::ReadKey;
use Term::ANSIColor qw( :constants );
use Time::HiRes qw( sleep );
my $frame = Acme::Monkey::Frame->new(
width => 30,
height => 11,
);
my $background = Acme::Monkey::Frame::Layer->new(
width => $frame->width() * 20,
height => $frame->height(),
);
foreach (1..int( ($background->width() * $background->height()) / 8 )) {
my $x = (int( rand() * $background->width() ) * 2) + 1;
my $y = int( rand() * $background->height() ) + 1;
my $char = ($background->get($x, $y)) ? 'o' : '.';
$background->set( $x, $y, $char );
}
$frame->layers->{z} = $background;
my $ship = Acme::Monkey::Frame::Layer->new(
x => 2,
y => 4,
width => 4,
height => 3,
color => BOLD.CYAN,
);
$ship->set(
1, 1,
join("\n",
"-\\",
"=@>",
"-/",
)
);
$frame->layers->{a} = $ship;
my $enemy = Acme::Monkey::Frame::Layer->new(
x => $frame->width()-3,
y => int( $frame->height() / 2 ),
width => 2,
height => 1,
color => BOLD.GREEN,
);
$enemy->set( 1, 1, '<=' );
$frame->layers->{b} = $enemy;
my $laser = Acme::Monkey::Frame::Layer->new(
width => 2,
height => 1,
hidden => 1,
color => BOLD.RED,
);
$laser->set( 1, 1, '--' );
$frame->layers->{c} = $laser;
my $boom = Acme::Monkey::Frame::Layer->new(
width => 6,
height => 3,
hidden => 1,
color => BOLD.RED.BLINK,
);
$boom->set( 1, 1, "\t\\\t\t/\n-BOOM-\n\t/\t\t\\" );
$frame->layers->{d} = $boom;
$frame->draw();
ReadMode 4;
eval {
foreach (1..1000) {
my $key = ReadKey( -1 ) || '';
last if ($key =~ /[xq]/);
$ship->move_up() if ($key eq 'w');
$ship->move_down() if ($key eq 's');
$ship->move_left() if ($key eq 'a');
$ship->move_right() if ($key eq 'd');
if (rand() < .5) {
$enemy->move_up() if ($enemy->y() > 1);
}
else {
$enemy->move_down() if ($enemy->y() < $frame->height());
}
if ($key eq ' ') {
if ($laser->hidden()) {
$laser->hidden( 0 );
$laser->x( $ship->x() );
$laser->y( $ship->y() + 1 );
}
}
if (!$laser->hidden()) {
$laser->move_right( 2 );
if ($laser->x() > $frame->width()) {
$laser->hidden( 1 );
}
if ($laser->y() == $enemy->y() and $laser->x() >= $enemy->x()-1) {
$laser->hidden( 1 );
$enemy->hidden( 1 );
$boom->y( $enemy->y() - 1 );
$boom->x( $enemy->x() - 2 );
$boom->hidden( 0 );
}
}
$background->move_left();
$frame->draw();
if (!$boom->hidden()) {
print "\n\nYOU WON!!!\n";
last;
}
print "\nw = Up. s = Down. a = Left. d = Right.\n<space> = Shoot.\nx = Exit.";
sleep .2;
}
};
ReadMode 0;
__END__
=head1 NAME
monkey_ship.pl - Guide the intergallectic spaceship of the first confederate force of monkey citizens of the congo and brazillian rainforests.
=head1 DESCRIPTION
Using your masterful piloting skills guide the monkey-ship on
a mission to destroy the giant <= ship.
( run in 0.499 second using v1.01-cache-2.11-cpan-f56aa216473 )