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 )