Games-Snake

 view release on metacpan or  search on metacpan

lib/Games/Snake.pm  view on Meta::CPAN


    my $player = $self->player;

    if ( $event->type == SDL_KEYDOWN ) {
        $player->direction( [ -1, 0 ] )  if $event->key_sym == SDLK_LEFT;
        $player->direction( [ 1,  0 ] )  if $event->key_sym == SDLK_RIGHT;
        $player->direction( [ 0,  -1 ] ) if $event->key_sym == SDLK_UP;
        $player->direction( [ 0,  1 ] )  if $event->key_sym == SDLK_DOWN;

        my $key = SDL::Events::get_key_name( $event->key_sym );
        if ( !$player->alive && $key eq 'r' ) {
            $self->player( $self->_build_player );
        }
    }
}

sub handle_move {
    my ( $self, $step, $app, $t ) = @_;

    my $level  = $self->level;
    my $player = $self->player;

    $player->move($t);

    if ( $player->hit_self() || $level->is_wall( $player->head ) ) {
        $player->alive(0);
    }
    elsif ($player->head->[0] == $self->apple->[0]
        && $player->head->[1] == $self->apple->[1] )
    {
        $player->speed( $player->speed * 0.9 );
        $player->growing( $player->growing + 10 );
        $self->apple( $self->_build_apple );
    }
}

lib/Games/Snake.pm  view on Meta::CPAN

    $app->draw_rect( [ 0, 0, $app->w, $app->h ], 0x000000FF );

    my $size = $self->size;
    $app->draw_rect(
        [ ( map { $_ * $size } @{ $self->apple } ), $size, $size ],
        0xC20006FF );

    $self->player->draw($app);
    $self->level->draw($app);

    if ( !$self->player->alive ) {
        $app->draw_gfx_text( [ 12, 12 ],
            0xFFFFFFFF,
            'Snake length: ' . scalar @{ $self->player->segments } );
        $app->draw_gfx_text( [ 12, 22 ], 0xFFFFFFFF, 'Press R to restart' );
    }

    $app->update();
}

1;

lib/Games/Snake/Player.pm  view on Meta::CPAN

    isa     => Num,
    default => quote_sub q{ 0 },
);

has direction => (
    is      => 'rw',
    isa     => ArrayRef,
    default => quote_sub q{ [] },
);

has alive => (
    is      => 'rw',
    isa     => Bool,
    default => quote_sub q{ 1 },
);

has growing => (
    is      => 'rw',
    isa     => Int,
    default => quote_sub q{ 0 },
);

lib/Games/Snake/Player.pm  view on Meta::CPAN


sub body {
    my ($self) = @_;
    my @segments = @{ $self->segments };
    return [ @segments[ 1 .. $#segments ] ];
}

sub move {
    my ( $self, $t ) = @_;

    return unless $self->alive;

    return unless $t >= $self->_move_time + $self->speed;
    $self->_move_time($t);

    my $segments = $self->segments;

    my @head = @{ $self->head };
    my @d    = @{ $self->direction };
    unshift @$segments, [ $head[0] + $d[0], $head[1] + $d[1] ];



( run in 0.620 second using v1.01-cache-2.11-cpan-39bf76dae61 )