Fix bugs introduced as a result of fixing #1.

main
Roy 2 years ago
parent bb3830d985
commit 0ef22719c4
  1. 39
      chess_gui/lib/chess_gui.pm

@ -170,7 +170,7 @@ sub INIT_KEYS { # For sorted lookup of piece source.
sub MOVEMENT_TREE { # Assume relative movement to support abritrary depth (0 < $depth < Inf). sub MOVEMENT_TREE { # Assume relative movement to support abritrary depth (0 < $depth < Inf).
my ($player, $depth, $i_al, $i) = (@_[0, 1], $_[5] // $_[0]*16-1, $_[2] // -4); # Support for travelling to different tree depths every player turn (could be used to create, e.g., adaptive AI). my ($player, $depth, $i_al, $i) = (@_[0, 1], $_[5] // $_[0]*16-1, $_[2] // -4); # Support for travelling to different tree depths every player turn (could be used to create, e.g., adaptive AI).
my (@xid, $prio, %key_list_by_value, @selection); my ($ice, $prio, %key_list_by_value, @selection);
$i += 4; $i += 4;
ALLY_SOURCE: foreach my $asrc (&KEYS($player)) { ALLY_SOURCE: foreach my $asrc (&KEYS($player)) {
my $dpval = $_[3] // 0; # Default piece value. my $dpval = $_[3] // 0; # Default piece value.
@ -186,14 +186,14 @@ sub MOVEMENT_TREE { # Assume relative movement to support abritrary depth (0 < $
{no warnings; $tmpalg{$tmpkey} = $ditet[2/($player+1)+1]}; {no warnings; $tmpalg{$tmpkey} = $ditet[2/($player+1)+1]};
if ($player == $user_mode) {if (defined($prop{$asrc}) and (join '', @{$prop{$asrc}}) eq $_[7] and ($_[8] eq $tree[$i]{$asrc}[$c] or (defined($prop{$tree[$i]{$asrc}[$c]}) and $_[8] eq (join '', @{$prop{$tree[$i]{$asrc}[$c]}})))) {$tmpalg{$tmpkey} = 'Inf'; $sth10->execute($_[9], $ditet[0], $ditet[1])}} #else { if ($player == $user_mode) {if (defined($prop{$asrc}) and (join '', @{$prop{$asrc}}) eq $_[7] and ($_[8] eq $tree[$i]{$asrc}[$c] or (defined($prop{$tree[$i]{$asrc}[$c]}) and $_[8] eq (join '', @{$prop{$tree[$i]{$asrc}[$c]}})))) {$tmpalg{$tmpkey} = 'Inf'; $sth10->execute($_[9], $ditet[0], $ditet[1])}} #else {
my $val = $tmpalg{$tmpkey}; my $val = $tmpalg{$tmpkey};
push @{$key_list_by_value{$val}}, $tmpkey; push @{$key_list_by_value{$val}}, ($tmpkey, @ditet[0, 1]);
unless (defined($prio)) { unless (defined($prio)) {
$prio = $val; $prio = $val;
@xid[0, 1] = @ditet[1, 0]; # @xid[0, 1] = @ditet[0, 1];
} }
if ($val > $prio) { if ($val > $prio) {
$prio = $val; $prio = $val;
@xid[0, 1] = @ditet[1, 0]; # @xid[0, 1] = @ditet[0, 1];
} }
# } # }
$keys[$i_al] = $asrc; $keys[$i_al] = $asrc;
@ -462,24 +462,25 @@ $sth5->execute($bid, $wid, $tmpalg{$selection}, undef);
# if ($player == $user_mode and (join '', @asrc) eq $_[7] and ($_[8] eq $adest or $_[8] eq (join '', @adest))) {$tmpalg{$selection} = 'Inf'; $sth9->execute($_[9], $bid, $wid)} # if ($player == $user_mode and (join '', @asrc) eq $_[7] and ($_[8] eq $adest or $_[8] eq (join '', @adest))) {$tmpalg{$selection} = 'Inf'; $sth9->execute($_[9], $bid, $wid)}
if ($player == $user_mode) {if ($#asrc != -1 and (join '', @asrc) eq $_[7] and ($_[8] eq $adest or $_[8] eq (join '', @adest))) {$tmpalg{$selection} = 'Inf'; $sth10->execute($_[9], $bid, $wid)}} #else { if ($player == $user_mode) {if ($#asrc != -1 and (join '', @asrc) eq $_[7] and ($_[8] eq $adest or $_[8] eq (join '', @adest))) {$tmpalg{$selection} = 'Inf'; $sth10->execute($_[9], $bid, $wid)}} #else {
my $val = $tmpalg{$selection}; my $val = $tmpalg{$selection};
push @{$key_list_by_value{$val}}, $selection; push @{$key_list_by_value{$val}}, ($selection, $bid, $wid);
unless (defined($prio)) { unless (defined($prio)) {
$prio = $val; $prio = $val;
@xid[0, 1] = ($wid, $bid); # @xid[0, 1] = ($bid, $wid);
} }
if ($val > $prio) { if ($val > $prio) {
$prio = $val; $prio = $val;
@xid[0, 1] = ($wid, $bid); # @xid[0, 1] = ($bid, $wid);
} }
# } # }
$keys[$i_al] = $asrc; $keys[$i_al] = $asrc;
} }
} }
} }
for (my $ii = 0; $#{$key_list_by_value{$prio}} >= $ii; $ii++) { for (my $ii = 0; $#{$key_list_by_value{$prio}} >= $ii; $ii += 3) {
$selection[$ii] = $key_list_by_value{$prio}[$ii]; push @selection, $key_list_by_value{$prio}[$ii];
} }
return ($prio, @xid[0, 1], @selection); $ice = int(rand($#selection+1));
return ($prio, $key_list_by_value{$prio}[$ice*3+1], $key_list_by_value{$prio}[$ice*3+2], $selection[$ice], $ice, $#selection);
} }
sub QUEEN { sub QUEEN {
@ -725,16 +726,18 @@ $user_mode = 0;
TURN: foreach my $player (@player) { TURN: foreach my $player (@player) {
# @{$diff{'msg'}{'turn'}}[$player] = 'Player ' . $player . ' turn ' . $player_turn . ':'; # @{$diff{'msg'}{'turn'}}[$player] = 'Player ' . $player . ' turn ' . $player_turn . ':';
push @{$diff{$pplayer[$player]}{'status'}}, $player_turn; push @{$diff{$pplayer[$player]}{'status'}}, $player_turn;
my ($depth, $prio, $ice, @selection, @id); my ($depth, $prio, $ice, $selection, @id, $n_o_selections);
my ($dpval, $i_al) = (0, 0); my ($dpval, $i_al) = (0, 0);
if ($player == $user_mode) { # If the player is human-controlled, we needn't more than $depth 1 (for input validation). if ($player == $user_mode) { # If the player is human-controlled, we needn't more than $depth 1 (for input validation).
$depth = 1; $depth = 1;
($prio, @id[0, 1], @selection) = &MOVEMENT_TREE($player, $depth, undef, undef, undef, undef, undef, $_[0], $_[1], $sessid); ($prio, @id[0, 1], $selection, $ice, $n_o_selections) = &MOVEMENT_TREE($player, $depth, undef, undef, undef, undef, undef, $_[0], $_[1], $sessid);
print 'w ', $id[0], ' ', $id[1], "\n";
} else { } else {
$depth = 2; # Usually about 20^$depth possibilities (but ten times as much iterates for including no movement). $depth = 2; # Usually about 20^$depth possibilities (but ten times as much iterates for including no movement).
($prio, @id[0, 1], @selection) = &MOVEMENT_TREE($player, $depth, undef, undef, undef, undef, undef, undef, undef, $sessid); ($prio, @id[0, 1], $selection, $ice, $n_o_selections) = &MOVEMENT_TREE($player, $depth, undef, undef, undef, undef, undef, undef, undef, $sessid);
$sth10->execute($sessid, @id[0, 1]); $sth10->execute($sessid, @id[0, 1]);
print 'b ', $id[0], ' ', $id[1], "\n";
} }
# print 'keys: ', scalar keys %key_list_by_value, "\n"; # print 'keys: ', scalar keys %key_list_by_value, "\n";
# print 'ids: ', $#id, "\n"; # print 'ids: ', $#id, "\n";
@ -763,7 +766,7 @@ $user_mode = 0;
# for (my $ii = 0; $#{$key_list_by_value{$prio}} >= $ii; $ii++) { # for (my $ii = 0; $#{$key_list_by_value{$prio}} >= $ii; $ii++) {
# $selection[$ii] = $key_list_by_value{$prio}[$ii]; # $selection[$ii] = $key_list_by_value{$prio}[$ii];
# } # }
$ice = int(rand($#selection+1)); # $ice = int(rand($#selection+1));
# } elsif ($user_mode != $player) { # The other side has checkmated you (the AI). The AI should know when to give up (even if it weren't for efficiency reasons). # } elsif ($user_mode != $player) { # The other side has checkmated you (the AI). The AI should know when to give up (even if it weren't for efficiency reasons).
## @{$diff{'msg'}{'gstatus'}}[$player] = 'Player ' . $player . ' resigns!'; ## @{$diff{'msg'}{'gstatus'}}[$player] = 'Player ' . $player . ' resigns!';
# push @{$diff{$pplayer[$player]}{'status'}}, 5; # push @{$diff{$pplayer[$player]}{'status'}}, 5;
@ -834,16 +837,16 @@ $user_mode = 0;
} }
undef @pseudoinfinite_loop_check; undef @pseudoinfinite_loop_check;
} }
push @pseudoinfinite_loop_check, $selection[$ice]; push @pseudoinfinite_loop_check, $selection;
push @{$diff{$pplayer[$player]}{'prio'}}, $prio; push @{$diff{$pplayer[$player]}{'prio'}}, $prio;
push @{$diff{$pplayer[$player]}{'moveno'}}, ($ice+1) . '/' . ($#selection+1); push @{$diff{$pplayer[$player]}{'moveno'}}, ($ice+1) . '/' . $n_o_selections;
# @{$diff{'msg'}{'verbose'}}[$player] = $selection[$ice]; # @{$diff{'msg'}{'verbose'}}[$player] = $selection[$ice];
$what_i_did[$player]{$selection[$ice]} = $prio; $what_i_did[$player]{$selection} = $prio;
my $c = 0; my $c = 0;
my $adest; my $adest;
foreach (split /,/, $selection[$ice]) { foreach (split /,/, $selection) {
if (defined($keys[$c]) and $keys[$c] != $_) { if (defined($keys[$c]) and $keys[$c] != $_) {
$adest = $_; $adest = $_;
last; last;

Loading…
Cancel
Save