Games-Go-GTP
view release on metacpan or search on metacpan
lib/Games/Go/GTP.pm view on Meta::CPAN
eval {$referee->size($size)};
return '?',' unacceptable size' if $@ or $size > 25;
$player->size($size);
$referee->restore(0);
$player->initboard($referee);
return '=', undef, 1 # so the caller of this module knows we're in a game
}
sub clear_board {
my ($referee, $player) = @_;
$referee->restore(0);
$player->initboard($referee);
return '='
}
sub komi { # need to tell Referee?
my ($komi) = @_;
return '='
}
sub play {
my ($colour, $GTPpoint, $referee, $player) = @_;
$colour = convertcolour($colour);
eval {$referee->play($colour, $GTPpoint)};
return '?', ' illegal move' if $@;
return '='
}
sub genmove {
my ($colour, $referee, $player) = @_;
$colour = convertcolour($colour);
$player->update($colour, $referee);
my $move = $player->chooselegalmove($colour, $referee);
$referee->play($colour, $move);
return '=', $move;
}
sub place_free_handicap {
my ($handicap, $referee, $player) = @_;
my @moves;
for (1..$handicap) {
$player->update('B', $referee);
my $move = $player->chooselegalmove('B', $referee);
$referee->setup('AB', join ',', $move);
push @moves, $move;
}
return '=', join ' ', @moves
}
sub set_free_handicap {
my $player = pop;
my $referee = pop;
$referee->setup('AB', join ',', @_);
return '='
}
sub final_status_list {
my ($statustype, $referee, $player) = @_;
my $pref;
for ($statustype) {
if (lc $_ eq 'alive') {
$pref = $referee->listallalive;
last
}
if (lc $_ eq 'dead') {
$pref = $referee->listalldead;
last
}
if (lc $_ eq 'seki') {
last
}
return '?', ' syntax error'
}
return '=', join ' ', @$pref
}
sub kgs_genmove_cleanup {
my ($colour, $referee, $player) = @_;
$player->{_KGScleanup} = 1;
my ($status, $res) = genmove(@_);
$player->{_KGScleanup} = 0;
return $status, $res
}
sub undo {
my ($referee, $player) = @_;
eval { $referee->restore(-1) };
return '?', ' cannot undo' if $@;
return '='
}
sub kgs_game_over {
return '=', undef, 0
}
sub convertcolour {
return uc substr shift, 0, 1
}
1;
=head1 NAME
Games::Go::GTP - Interact with a server or Go playing program using GTP
=head1 SYNOPSIS
use Games::Go::GTP;
use Games::Go::Player;
my $referee = new Games::Go::Referee;
my $player = new Games::Go::Player;
...
my ($res, $status) = Games::Go::GTP::gtpcommand(@args, $referee, $player);
=head1 DESCRIPTION
I would like to make this module more abstract, but I'm not sure how.
For example, it assumes that Player, which is the code that generates a move (supply your own!),
supports the following methods:
$player->size($somesize); # eg, $player->size(19), issued following the GTP command boardsize
$player->initboard($referee); # following the GTP command clear_board
( run in 2.899 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )