| Games-Bingo documentation | Contained in the Games-Bingo distribution. |
Games::Bingo::ColumnCollection - a collection class for holding columns
my $col = Games::Bingo::ColumnCollection-E<gt>new(); my $c = Games::Bingo::Column-E<gt>new(0, [1, 2, 3, 4, 5, 6, 7, 8, 9]); $col-E<gt>add_column($c1); my $d = $col-E<gt>get_column(1); my $e = $col-E<gt>get_random_column();
The ColumnCollection is used when building the bingo cards and is a temporary data structure for holding object of the class Column.
The class is an encapsulated array, which is 1 indexed.
The constructor blesses and array and returns.
The divided method has nothing as such to do with the class apart from it is a helper method, which is used to taking a list of numbers (1-90 expected, see Games::Bingo).
It then divided this list into 9 separate arrays of the following constallations:
From these arrays the Columns are built and the column collection is slowly populated, when done the column collection is returned.
This is a push like method, is can be used to add an additional to the collection.
The method can remove a column specified by its index, the argument specifies this index.
The method returns a column specified by its index, the argument to this method is the index.
The second argument is an indicator of whether the returned collection should be removed from the list, 1 for removed and 0 for not removing, the latter is the default.
This method returns a random columns, the optional parameter can be used to indicate whether the column should be removed from the list. 1 indicates a removed and nothing (the default) that nothing should be done.
The method uses the fact that the class contains Columns and a bit of polymorphy, so this method can be used to set the status of all Columns contained in the class. ' The parameter is the status which you want to set, either 1 or 0.
Returns the number of columns in G::B::Column object.
The TODO file contains a complete list for the whole Games::Bingo project.
jonasbn <jonasbn@cpan.org>
My friend Allan helped me out with some of the algoritmic stuff and was in when this class was thought up.
Games::Bingo and related modules are free software and is released under the Artistic License. See <http://www.perl.com/language/misc/Artistic.html> for details.
Games::Bingo is (C) 2003-2004 Jonas B. Nielsen (jonasbn) <jonasbn@cpan.org>
| Games-Bingo documentation | Contained in the Games-Bingo distribution. |
package Games::Bingo::ColumnCollection; # $Id: ColumnCollection.pm 1869 2007-08-12 15:52:36Z jonasbn $ use strict; use integer; use Games::Bingo; use Games::Bingo::Column; use vars qw(@ISA $VERSION); use Carp; @ISA = qw(Games::Bingo); $VERSION = '0.03'; sub new { my $class = shift; my $self = bless [], $class; push @{$self}, @_ if (@_); return $self; } sub divide { my $self = shift; my $number_of_columns = shift; my @numbers = @_; for (my $number = 0; $number < $number_of_columns; $number++) { my @s = (); if ($number == 0) { @s = splice(@numbers, 0, 9); } elsif ($number == 8) { @s = splice(@numbers, 0, 11); } else { @s = splice(@numbers, 0, 10); } my $column = Games::Bingo::Column->new($number, @s); $self->add_column($column); } } sub add_column { my ($self, $column, $index) = @_; if ($index) { $self->[$index] = $column; } else { push(@{$self}, $column); } } sub _remove_column { my ($self, $idx) = @_; if ($idx < 0 ) { carp "cannot remove column, index cannot be a negative number ($idx)\n"; return undef; } elsif ($idx > (scalar @{$self})) { carp "cannot remove column, no column with that index ($idx)\n"; return undef; } splice(@{$self}, $idx, 1); } sub get_column { my ($self, $index, $do_splice, $auto_splice) = @_; if ($index !~ m/^(-)?\d+$/) { carp "no or illegal index specified"; return undef; } if ($index < 0 ) { carp "cannot get column, index cannot be a negative number ($index)\n"; return undef; } elsif ($index > (scalar @{$self})) { carp "cannot get column, no columns with that index ($index)\n"; return undef; } my $column = $self->[$index]; if ($auto_splice and $column) { my $length = $column->count_numbers(); if ($length < 2) { $do_splice = 1; } else { $do_splice = 0; } } if ($do_splice) { my $v = $self->_remove_column($index); } return $column; } sub get_random_column { my ($self, $do_splice, $auto_splice) = @_; my $index = $self->random(scalar @{$self}); my $column; eval { $column = $self->get_column($index, $do_splice, $auto_splice); }; if (@!) { warn "unable to get random column: $@"; return undef; } else { return $column; } } sub count_columns { my $self = shift; return scalar(@{$self}); } 1; __END__