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) {
        $background->set( $x, $y, '%' );
    }
    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 ++;
}

sub age_char {
    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 ) || '';



( run in 2.650 seconds using v1.01-cache-2.11-cpan-d8267643d1d )