|
|
@@ -5,6 +5,8 @@ use strict; |
|
|
|
|
|
|
|
use utf8; |
|
|
|
|
|
|
|
my $ARRAY = "ARRAY"; |
|
|
|
|
|
|
|
my $X_BOX_CHR = chr(0x2573); |
|
|
|
my $GRAY_BOX_CHR = chr(0x2591); |
|
|
|
my $ALT_US = chr(0x2017); |
|
|
@@ -91,6 +93,22 @@ my %AXIS_RV = map { |
|
|
|
$AXIS{$_} => $_ |
|
|
|
} keys(%AXIS); |
|
|
|
|
|
|
|
package MoveStruct; |
|
|
|
use warnings; |
|
|
|
use strict; |
|
|
|
|
|
|
|
sub new { |
|
|
|
my $class = shift; |
|
|
|
my $self = { @_ }; |
|
|
|
|
|
|
|
die "invalid MoveStruct {\"mov\"}" unless $self->{"mov"}; |
|
|
|
die "invalid MoveStruct ->{\"type\"}" unless $self->{"type"}; |
|
|
|
die "invalid MoveStruct type" unless ref($self->{"mov"}) eq $ARRAY; |
|
|
|
|
|
|
|
return bless $self, $class; |
|
|
|
} |
|
|
|
|
|
|
|
package main; |
|
|
|
|
|
|
|
# |
|
|
|
# /--\ +1 |
|
|
@@ -110,81 +128,13 @@ my %AXIS_RV = map { |
|
|
|
|
|
|
|
# [Row move, Diag move] |
|
|
|
|
|
|
|
my %MOVE = ( |
|
|
|
$MG_A => [ |
|
|
|
[-1, 1], [ 0, 1] |
|
|
|
], |
|
|
|
$MG_Q => [ |
|
|
|
[ 0, 1], [ 1, 0], [-1, 0], [ 0,-1], |
|
|
|
], |
|
|
|
$MG_I => [ |
|
|
|
[0,0] |
|
|
|
], |
|
|
|
$MG_IT => [ |
|
|
|
[ 0,-1], [ 1,-1] |
|
|
|
], |
|
|
|
$MG_N => [ |
|
|
|
[-1, 2], |
|
|
|
[ 1,-2] |
|
|
|
], |
|
|
|
$MG_H => [ |
|
|
|
[-3, 2], [-1,-2], [ 1, 2], [ 3,-2] |
|
|
|
], |
|
|
|
$MG_RC => [ |
|
|
|
[-1, 0], [-2, 0], [ 1, 0], [ 2, 0] |
|
|
|
], |
|
|
|
$MG_S => [ |
|
|
|
[-1, 1], [-2, 2], [ 0, 1], [ 0, 2], |
|
|
|
[ 0,-1], [ 0,-2], [ 1,-1], [ 2,-2], |
|
|
|
], |
|
|
|
$MG_HS => [ |
|
|
|
[-3, 1], [-2,-1], [ 2, 1], [ 3,-1] |
|
|
|
], |
|
|
|
$MG_RO => [ |
|
|
|
[-1, 1], [ 0, 1], [ 1, 1], [ 1,-2] |
|
|
|
], |
|
|
|
$MG_B => [ |
|
|
|
[-1, 1], [ 0, 1], [ 0,-2], [ 2,-2] |
|
|
|
], |
|
|
|
$MG_P => [ |
|
|
|
[-4, 2], [-2, 1], [-2,-2], [-1,-1], |
|
|
|
[ 1, 1], [ 2,-1], [ 2, 2], [ 4,-2] |
|
|
|
], |
|
|
|
$MG_IM => [ |
|
|
|
[-2, 1], [-1,-1], [-1, 2], [ 1, 1], |
|
|
|
[ 1,-1], [ 2,-1] |
|
|
|
], |
|
|
|
$MG_F => [ |
|
|
|
[-1, 0], [-1, 1], [ 0, 1], [ 0,-1], |
|
|
|
[ 1, 0], [ 1,-1] |
|
|
|
], |
|
|
|
$MG_QS => [ |
|
|
|
[-3, 3], [-2, 2], [-2, 0], [-1, 0], |
|
|
|
[-1, 1], [ 0, 1], [ 0, 2], [ 0, 3], |
|
|
|
[ 0,-1], [ 0,-2], [ 0,-3], [ 1, 0], |
|
|
|
[ 1,-1], [ 2, 0], [ 2,-2], [ 3,-3], |
|
|
|
], |
|
|
|
$MG_AU => [ |
|
|
|
[-1, 0], [-1, 1], [ 0, 1], [ 0,-1], |
|
|
|
[ 1, 0], [ 1,-1] |
|
|
|
], |
|
|
|
$MG_SY => [ |
|
|
|
[-4, 4], [-3, 3], [-3, 2], [-1,-2], |
|
|
|
[ 0,-4], [ 0,-3], [ 0, 3], [ 0, 4], |
|
|
|
[ 1, 2], [ 3,-2], [ 3,-3], [ 4,-4] |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
my %BLOCK = ( |
|
|
|
); |
|
|
|
|
|
|
|
# Special cells |
|
|
|
my $EMPTY_CELL = "_"; |
|
|
|
|
|
|
|
# Shade enum |
|
|
|
my $SHADE_3_ENUM = 3; |
|
|
|
my $SHADE_2_ENUM = 2; |
|
|
|
my $SHADE_1_ENUM = 1; |
|
|
|
my $SHADE_3_ENUM = 0b011; |
|
|
|
my $SHADE_2_ENUM = 0b010; |
|
|
|
my $SHADE_1_ENUM = 0b001; |
|
|
|
my $EMPTY_ENUM = 0; |
|
|
|
|
|
|
|
my %SHADE = ( |
|
|
@@ -194,8 +144,143 @@ my %SHADE = ( |
|
|
|
$EMPTY_ENUM => [$HEX_1, $HEX_2, $HEX_3] |
|
|
|
); |
|
|
|
|
|
|
|
my $MOVE_ENUM = $SHADE_1_ENUM; |
|
|
|
my $BLOCK_ENUM = $SHADE_2_ENUM; |
|
|
|
my $MOVBLOCK_ENUM = $SHADE_3_ENUM; |
|
|
|
|
|
|
|
my $ERR_C_1 = -1; |
|
|
|
|
|
|
|
my %MOVE = ( |
|
|
|
$MG_A => [ |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_Q => [ |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_I => [ |
|
|
|
MoveStruct->new("mov" => [0,0], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_IT => [ |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_N => [ |
|
|
|
MoveStruct->new("mov" => [-1, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-2], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_H => [ |
|
|
|
MoveStruct->new("mov" => [-3, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 3,-2], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_RC => [ |
|
|
|
MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2, 0], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_S => [ |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM), |
|
|
|
], |
|
|
|
$MG_HS => [ |
|
|
|
MoveStruct->new("mov" => [-3, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 3,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_RO => [ |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-2], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_B => [ |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_P => [ |
|
|
|
MoveStruct->new("mov" => [-4, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 4,-2], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_IM => [ |
|
|
|
MoveStruct->new("mov" => [-2, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_F => [ |
|
|
|
MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_QS => [ |
|
|
|
MoveStruct->new("mov" => [-3, 3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-2, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 2,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 3,-3], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_AU => [ |
|
|
|
MoveStruct->new("mov" => [-1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-1], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 0], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1,-1], "type" => $MOVE_ENUM) |
|
|
|
], |
|
|
|
$MG_SY => [ |
|
|
|
MoveStruct->new("mov" => [-4, 4], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-3, 3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-3, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [-1,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-4], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0,-3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 0, 4], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 1, 2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 3,-2], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 3,-3], "type" => $MOVE_ENUM), |
|
|
|
MoveStruct->new("mov" => [ 4,-4], "type" => $MOVE_ENUM) |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
my %sc = (); |
|
|
|
my %board; |
|
|
|
|
|
|
@@ -462,7 +547,6 @@ sub apply_shift($$){ |
|
|
|
|
|
|
|
$r0 += $my_shift->[0]; |
|
|
|
$c0 += $my_shift->[1]; |
|
|
|
# die "cell index [$r0, $c0]: out of bound exception" if $r0 > 11 or $c0 > 11 or $r0 < 1 or $c0 < 1; |
|
|
|
return $ERR_C_1 if $r0 > 11 or $c0 > 11 or $r0 < 1 or $c0 < 1; |
|
|
|
return cell_index_rev($r0, $c0); |
|
|
|
} |
|
|
@@ -501,23 +585,31 @@ sub calc_move($$){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sub shade_move($){ |
|
|
|
my $not = shift; |
|
|
|
sub shade_move($$){ |
|
|
|
my ($not, $en) = (shift, shift); |
|
|
|
my $c1; |
|
|
|
my @mv1; |
|
|
|
my @mv2; |
|
|
|
|
|
|
|
$c1 = cell_pi($not); |
|
|
|
|
|
|
|
@mv1 = @{$MOVE{$c1}}; |
|
|
|
@mv1 = map { |
|
|
|
$_ |
|
|
|
} grep { |
|
|
|
($_->{"type"} && $en) eq $en |
|
|
|
}@{$MOVE{$c1}}; |
|
|
|
|
|
|
|
@mv2 = grep { |
|
|
|
$_ ne $ERR_C_1 |
|
|
|
$_ if $_->[0] ne $ERR_C_1; |
|
|
|
} map { |
|
|
|
calc_move($not, $_) |
|
|
|
[ |
|
|
|
calc_move($not, $_->{"mov"}), |
|
|
|
$_->{"type"} |
|
|
|
] |
|
|
|
} @mv1; |
|
|
|
|
|
|
|
for my $mv (@mv2){ |
|
|
|
shade_cell($mv, $SHADE_1_ENUM); |
|
|
|
shade_cell($mv->[0], $mv->[1]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -541,7 +633,7 @@ my $m1 = "A1"; |
|
|
|
my $c1 = $MG_QS; |
|
|
|
|
|
|
|
$board{$m1} = $P1.$DIV.$c1; |
|
|
|
shade_move($m1); |
|
|
|
shade_move($m1, $MOVE_ENUM); |
|
|
|
|
|
|
|
disp_board(); |
|
|
|
|
|
|
|