Acme-Monkey

 view release on metacpan or  search on metacpan

bin/monkey_life.pl  view on Meta::CPAN

#!/usr/bin/perl
use strict;
use warnings;

use Acme::Monkey::Frame;
use Acme::Monkey::Frame::Layer;
use Term::ANSIColor qw( :constants );
use Time::HiRes qw( sleep );
use Term::ReadKey;

my $frame = Acme::Monkey::Frame->new(
    width  => 20,
    height => 10,
);

my $background = Acme::Monkey::Frame::Layer->new(
    width  => $frame->width(),
    height => $frame->height(),
    color  => GREEN,
);

foreach my $x (1..$background->width()) {
foreach my $y (1..$background->height()) {
    my $folliage = int( rand() * 12) -6;
    if ($folliage < 3) {
        $background->set( $x, $y, '.' );
    }
    elsif ($folliage==3) {

bin/monkey_life.pl  view on Meta::CPAN

    }
    elsif ($folliage==4) {
        $background->set( $x, $y, 'X' );
    }
    else {
        $background->set( $x, $y, '+' );
    }
}
}

$frame->layers->{z} = $background;

my $food = Acme::Monkey::Frame::Layer->new(
    width  => $frame->width(),
    height => $frame->height(),
    color  => BOLD.YELLOW,
);
$frame->layers->{x} = $food;

my %monkeys;
my $monkey_id = 1;

sub create_monkey {
    my ($x, $y, $age) = @_;

    my $layer = Acme::Monkey::Frame::Layer->new(
        width  => 1,
        height => 1,
        x => $x,
        y => $y,
        color  => RED,
    );
    $age = 1;
#    $age ||= int(rand() * 100) + 1;
    $layer->set( 1, 1, age_char($age) );

    $frame->layers->{"monkey_$monkey_id"} = $layer;

    $monkeys{$monkey_id} = {
        layer  => $layer,
#        hunger => int(rand() * 20) + 1,
        hunger => 0,
        age    => $age,
        last_move => 0,
    };

    $monkey_id ++;

bin/monkey_life.pl  view on Meta::CPAN

    my ($age) = @_;

    return '.' if ($age < 7);
    return 'o' if ($age < 20);
    return '@' if ($age < 80);
    return '#';
}

sub add_food {
    $food->set(
        int(rand() * $frame->width()) + 1,
        int(rand() * $frame->height()) + 1,
        '/',
    );
}

ReadMode 4;
eval {

foreach (1..1000) {
    my $key = ReadKey( -1 ) || '';

    last if ($key =~ /[xq]/);

    if ($key eq 'c') {
        create_monkey(
            int(rand() * $frame->width()) + 1,
            int(rand() * $frame->height()) + 1,
        );
    }
    elsif ($key eq 'f') {
        add_food();
        add_food();
        add_food();
    }

    my $monkey_at = [];
    my $baby_had  = [];

    foreach my $id (keys %monkeys) {
        my $monkey = $monkeys{ $id };
        my $layer = $monkey->{layer};

        $monkey->{age} ++;
        if ($monkey->{age} > 100) {
            delete $frame->layers->{"monkey_$id"};
            delete $monkeys{ $id };
            next;
        }
        $layer->set( 1, 1, age_char($monkey->{age}) );

        $monkey->{hunger}++;
        if ($monkey->{hunger} > 40) {
            delete $frame->layers->{"monkey_$id"};
            delete $monkeys{ $id };
            next;
        }

        my $x = $layer->x();
        my $y = $layer->y();

        if ($food->get($x, $y)) {
            $monkey->{hunger} -= 3;
            $monkey->{hunger} = 0 if ($monkey->{hunger} < 0);

bin/monkey_life.pl  view on Meta::CPAN

            $move=3 if ($monkey_at->[$x-1]->[$y]);
            $move=4 if ($monkey_at->[$x+1]->[$y]);
        }

        if ($move==1) {
            next if ($monkey->{last_move} == 2);
            $layer->move_up() if ($y > 1);
        }
        elsif ($move==2) {
            next if ($monkey->{last_move} == 1);
            $layer->move_down() if ($y < $frame->height());
        }
        elsif ($move==3) {
            next if ($monkey->{last_move} == 4);
            $layer->move_left() if ($x > 1);
        }
        elsif ($move==4) {
            next if ($monkey->{last_move} == 3);
            $layer->move_right() if ($x < $frame->width());
        }

        $monkey->{last_move} = $move;
    }

    add_food();

    $frame->draw();

    print "\nc = Create new monkey baby.\nf = Create some bannanas to eat.\nx = Exit.";

    sleep 1;
}

};
ReadMode 0;

__END__

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;
}

lib/Acme/Monkey.pm  view on Meta::CPAN


=cut

sub fling {
    my $fling_buffer = Acme::Monkey::FrameBuffer->new(W => 40, H => 10);

    system($CLEAR_COMMAND);
    for my $seq(@{$Acme::Monkey::FlingFrames::sequence}) {
        system($CLEAR_COMMAND);
        $fling_buffer->clear();
        $fling_buffer->put(@{$Acme::Monkey::FlingFrames::frames}[$seq], 2, 2);
        $fling_buffer->put([__PACKAGE__], 1, 1);
        $fling_buffer->draw();
        usleep(120000);
    }
}


use Exporter qw( import );
our @EXPORT = qw(grrrr bannana grubs wine beer vodka swing fling);

lib/Acme/Monkey.pm  view on Meta::CPAN

    package Acme::Monkey::FlingFrames;

    use strict;
    use warnings;

    BEGIN {
        use Exporter();
        our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
        $VERSION   = 0.01;
        @ISA       = qw(Exporter);
        @EXPORT_OK = qw($sequence $frames);
    }
    our @EXPORT_OK;

    our $sequence = [0,0,0,1,2,3,2,1,4,5,6,7,8,9];

    our $frames = [
    [
	    '         ',
		'   o@o   ',
		'----|----',
		'    |    ',
		'   ===   ',
		'  |   |  ',
	],
    [
	    '         ',



( run in 2.005 seconds using v1.01-cache-2.11-cpan-e1769b4cff6 )