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 )