Game-Life-Faster
view release on metacpan or search on metacpan
lib/Game/Life/Faster.pm view on Meta::CPAN
ARRAY_REF eq ref $rule
or croak "\u$kind rule must be an array reference";
$self->{$kind} = [];
foreach ( @{ $rule } ) {
$_ =~ NON_NEGATIVE_INTEGER_RE
or croak "\u$kind rule must be a reference to an array of non-negative integers";
$self->{$kind}[$_] = 1;
}
return;
}
}
sub set_rules {
my ( $self, $breed, $live ) = @_;
$self->set_rule( breed => $breed );
$self->set_rule( live => $live );
return;
}
sub toggle_point {
my ( $self, $x, $y ) = @_;
return $self->set_point_state( $x, $y, TOGGLE_STATE );
}
sub unset_point {
my ( $self, $x, $y ) = @_;
return $self->set_point_state( $x, $y, 0 );
}
1;
__END__
=head1 NAME
Game::Life::Faster - Plays John Horton Conway's Game of Life
=head1 SYNOPSIS
use Game::Life::Faster;
my $game = Game::Life::Faster->new( 20 );
$game->place_points( 10, 10, [
[ 1, 1, 1 ],
[ 1, 0, 0 ],
[ 0, 1, 0 ],
] );
for ( 1 .. 20 ) {
print scalar $game->get_text_grid(), "\n\n";
$game->process();
}
=head1 DESCRIPTION
This Perl package is yet another implementation of John Horton Conway's
Game of Life. This "game" takes place on a rectangular grid, each of
whose cells is considered "living" or "dead". The grid is seeded with an
initial population, and then the rules are iterated. In each iteration
cells change state based on their current state and how many of the 8
adjacent cells (orthogonally or diagonally) are "living".
In Conway's original formulation, the rules were that a "dead" cell
becomes alive if it has exactly two living neighbors, and a "living"
cell becomes "dead" unless it has two or three living neighbors.
This implementation was inspired by L<Game::Life|Game::Life>, and is
intended to be reasonably compatible with its API. But the internals
have been tweaked in a number of ways in order to get better
performance, particularly on large but mostly-empty grids.
=head1 METHODS
B<General note:> In all methods that specify C<$x>-C<$y> coordinates,
the C<$x> is the row number (zero-based) and the C<$y> is the column
number (also zero-based).
This class supports the following public methods:
=head2 new
my $life = Game::Life::Faster->new( $size, $breed, $live )
This static method creates a new instance of the game. The arguments
are:
=over
=item $size
This specifies the size of the grid. It must be either a positive
integer (which creates a square grid) or a reference to an array
containing two positive integers (which creates a rectangular grid of
the given width and height). B<Note> that this means we specify number
of columns before number of rows, which is inconsistent with the
C<General note> above, but is consistent with L<Game::Life|Game::Life>.
The default is C<100>.
=item $breed
This specifies the number of neighbors a "dead" cell needs to become
"living". It must be a reference to an array of non-negative integers;
the cell will become "living" if its number of neighbors appears in the
array. Order is not important.
The default is C<[ 3 ]>.
=item $live
This specifies the number of neighbors a "living" cell needs to remain
"living". It must be a reference to an array of non-negative integers;
the cell will remain "living" if its number of neighbors appears in the
array. Order is not important.
=back
=head2 clear
This method clears the grid, setting all cells to "dead." It returns its
invocant.
This method is an extension to L<Game::Life|Game::Life>.
( run in 0.955 second using v1.01-cache-2.11-cpan-437f7b0c052 )