package boardTree; use lib('.'); use board; use hole; use warnings; use diagnostics; use Data::Dumper; use strict; use Exporter; use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = (); @EXPORT_OK = qw( &new ); %EXPORT_TAGS = ( DEFAULT => [qw ( &new )] ); # # new - boardTree constructor # sub new { my ($pkg, $board, $index, $level, $links ) = @_; my $obj = bless { board => $board, index => defined( $index ) ? $index : 0, level => defined( $level ) ? $level : 0, links => defined( $links ) ? $links : [] }, $pkg; return $obj; } sub makeLinks { my $obj = shift; my $nextLevel = $obj->{'level'} + 1; print "nextLevel => $nextLevel\n"; for my $jumper ( $obj->{'board'}->getHoles() ) { print __FILE__ . " $jumper\n"; if ( $jumper->hasPeg() ) { for my $jumpy ( $jumper->getLinks() ) { my $rc = $jumpy->jumpingOver( $jumper->getIndex() ); if ( $rc > -1 ) { my @nholes = (); for ($obj->{'board'}->getHoles()) { my %newHole = %$_; push ( @nholes, \%newHole ); } $nholes[$jumpy->getIndex()]->{'peg'} = 'white'; $nholes[$jumper->getIndex()]->{'peg'} = 'white'; $nholes[$rc]->{'peg'} = 'black'; my $newBoard = new board( \@nholes, $nextLevel ); push( @{$obj->{'links'}}, new boardTree ( $newBoard, $obj->{'index'} + 1, $nextLevel, [] )); $obj->{'links'}[$obj->getNumLinks()-1]->makeLinks(); } } } } } # # returns the links attribute # sub getLinks { my $obj = shift; return @{$obj->{'links'}}; } sub getNumLinks { my $obj = shift; return $#{@{$obj->{'links'}}} + 1; } # # print out the object # sub dumpPretty { my $obj = shift; print __FILE__ . "[" . __LINE__ . "] level => " . $obj->{'level'} . ":\n"; $obj->{'board'}->dumpPretty(); print "\tno links = " . $obj->getNumLinks() . "\n"; for my $l ( $obj->getLinks() ) { $l->dumpPretty(); } }