Games-Sudoku-Kubedoku
view release on metacpan or search on metacpan
lib/Games/Sudoku/Kubedoku.pm view on Meta::CPAN
$square[$x][$y] = ();
foreach my $z (1..$size) {
$square[$x][$y][$z] = $size;
}
}
}
$game->{'size'} = $size;
$game->{'dim'} = $dim;
$game->{'result'} = \@matrix;
$game->{'kube'} = \@kube;
$game->{'square'} = \@square;
$game->{'level'} = 0;
}
#################################################
# Clone the Game Data Structures
#################################################
sub clone_data_struc {
my $old = shift;
my $size = $old->{'size'};
my $dim = $old->{'dim'};
my $matrix = $old->{'result'};
my $kube = $old->{'kube'};
my @matrix = ();
my @kube = ();
foreach my $x (0..$size) {
$matrix[$x] = ();
$kube[$x] = ();
foreach my $y (0..$size) {
$matrix[$x][$y] = $matrix->[$x][$y];
$kube[$x][$y] = ();
foreach my $z (0..$size) {
$kube[$x][$y][$z] = $kube->[$x][$y][$z];
}
}
}
my $square = $old->{'square'};
my @square = ();
foreach my $x (1..$dim) {
$square[$x] = ();
foreach my $y (1..$dim) {
$square[$x][$y] = ();
foreach my $z (1..$size) {
$square[$x][$y][$z] = $square->[$x][$y][$z];
}
}
}
my $new = {};
$new->{'size'} = $size;
$new->{'dim'} = $dim;
$new->{'result'} = \@matrix;
$new->{'kube'} = \@kube;
$new->{'square'} = \@square;
$new->{'level'} = $old->{'level'} + 1;
return $new;
}
#################################################
# Update the Game Data Structures
#################################################
sub update_data_struc {
my $self = shift;
my $game = shift;
$self->{'result'} = $game->{'result'};
$self->{'kube'} = $game->{'kube'};
$self->{'square'} = $game->{'square'};
$self->{'level'} = $game->{'level'};
}
#################################################
# Set value and clean axis and square
#################################################
sub set_value {
my $game = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $size = $game->{'size'};
my $dim = $game->{'dim'};
my $kube = $game->{'kube'};
set_result($game, $x, $y, $z);
foreach my $i (1..$size) {
# Clean "X" axis
if ($kube->[$i][$y][$z]) {
$kube->[$i][$y][$z] = 0;
set_counts($game, $i, $y, $z);
}
# Clean "Y" axis
if ($kube->[$x][$i][$z]) {
$kube->[$x][$i][$z] = 0;
set_counts($game, $x, $i, $z);
}
# Clean "Z" axis
if ($kube->[$x][$y][$i]) {
$kube->[$x][$y][$i] = 0;
set_counts($game, $x, $y, $i);
}
}
# Clean Squares
my $xs = (int(($x -1)/$dim)*$dim);
my $ys = (int(($y -1)/$dim)*$dim);
foreach my $i (($xs+1)..($xs+$dim)) {
foreach my $j (($ys+1)..($ys+$dim)) {
if ($kube->[$i][$j][$z]) {
$kube->[$i][$j][$z] = 0;
set_counts($game, $i, $j, $z);
}
}
}
}
#################################################
# Update the Results Matrix
#################################################
sub set_result {
my $game = shift;
my $x = shift;
my $y = shift;
my $z = shift;
my $result = $game->{'result'};
$result->[$x][$y] = $z;
( run in 0.770 second using v1.01-cache-2.11-cpan-364913b4093 )