Ejemplo n.º 1
0
 def handle_boardsize(args):
     # No need to pass this down to mogo.
     try:
         if args[0] != size:
             raise gtp_engine.GtpError("board size %s only please" % size)
     except IndexError:
         gtp_engine.report_bad_arguments()
Ejemplo n.º 2
0
    def handle_savesgf(self, args):
        try:
            pathname = args[0]
        except IndexError:
            gtp_engine.report_bad_arguments()

        sgf_game = sgf.Sgf_game(self.board_size)
        root = sgf_game.get_root()
        root.set('KM', self.komi)
        root.set('AP', ("gomill", __version__))
        sgf_game.set_date()
        if self.handicap is not None:
            root.set('HA', self.handicap)
        for arg in args[1:]:
            try:
                identifier, value = arg.split("=", 1)
                if not identifier.isalpha():
                    raise ValueError
                identifier = identifier.upper()
                value = value.replace("\\_", " ").replace("\\\\", "\\")
            except Exception:
                gtp_engine.report_bad_arguments()
            root.set_raw(identifier, sgf_grammar.escape_text(value))
        sgf_moves.set_initial_position(sgf_game, self.history_base)
        for history_move in self.move_history:
            node = sgf_game.extend_main_sequence()
            node.set_move(history_move.colour, history_move.move)
            if history_move.comments is not None:
                node.set("C", history_move.comments)
        sgf_moves.indicate_first_player(sgf_game)
        try:
            self._save_file(pathname, sgf_game.serialise())
        except EnvironmentError, e:
            raise GtpError("error writing file: %s" % e)
Ejemplo n.º 3
0
 def handle_place_free_handicap(self, args):
     try:
         number_of_stones = gtp_engine.interpret_int(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     max_points = handicap_layout.max_free_handicap_for_board_size(
         self.board_size)
     if not 2 <= number_of_stones <= max_points:
         raise GtpError("invalid number of stones")
     if not self.board.is_empty():
         raise GtpError("board not empty")
     if number_of_stones == max_points:
         number_of_stones = max_points - 1
     moves = self._choose_free_handicap_moves(number_of_stones)
     try:
         try:
             if len(moves) > number_of_stones:
                 raise ValueError
             for row, col in moves:
                 self.board.play(row, col, 'b')
         except (ValueError, TypeError):
             raise GtpError("invalid result from move generator: %s"
                            % format_vertex_list(moves))
     except Exception:
         self.reset()
         raise
     self.simple_ko_point = None
     self.handicap = number_of_stones
     self.set_history_base(self.board.copy())
     return " ".join(format_vertex((row, col))
                     for (row, col) in moves)
Ejemplo n.º 4
0
 def handle_time_settings(self, args):
     try:
         main_time = gtp_engine.interpret_int(args[0])
         canadian_time = gtp_engine.interpret_int(args[1])
         canadian_stones = gtp_engine.interpret_int(args[2])
     except IndexError:
         gtp_engine.report_bad_arguments()
     self.time_settings = (main_time, canadian_time, canadian_stones)
Ejemplo n.º 5
0
 def handle_boardsize(self, args):
     try:
         size = gtp_engine.interpret_int(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     if size not in self.acceptable_sizes:
         raise GtpError("unacceptable size")
     self.board_size = size
     self.reset()
Ejemplo n.º 6
0
 def handle_time_left(self, args):
     # colour time stones
     try:
         colour = gtp_engine.interpret_colour(args[0])
         time_remaining = gtp_engine.interpret_int(args[1])
         stones_remaining = gtp_engine.interpret_int(args[2])
     except IndexError:
         gtp_engine.report_bad_arguments()
     if stones_remaining == 0:
         stones_remaining = None
     self.time_status[colour] = (time_remaining, stones_remaining)
Ejemplo n.º 7
0
 def handle_fixed_handicap(self, args):
     try:
         number_of_stones = gtp_engine.interpret_int(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     if not self.board.is_empty():
         raise GtpError("board not empty")
     try:
         points = handicap_layout.handicap_points(number_of_stones,
                                                  self.board_size)
     except ValueError:
         raise GtpError("invalid number of stones")
     for row, col in points:
         self.board.play(row, col, 'b')
     self.simple_ko_point = None
     self.handicap = number_of_stones
     self.set_history_base(self.board.copy())
     return " ".join(format_vertex((row, col)) for (row, col) in points)
Ejemplo n.º 8
0
 def handle_play(self, args):
     try:
         colour_s, vertex_s = args[:2]
     except ValueError:
         gtp_engine.report_bad_arguments()
     colour = gtp_engine.interpret_colour(colour_s)
     move = gtp_engine.interpret_vertex(vertex_s, self.board_size)
     if move is None:
         self.simple_ko_point = None
         self.move_history.append(History_move(colour, None))
         return
     row, col = move
     try:
         self.simple_ko_point = self.board.play(row, col, colour)
         self.simple_ko_player = opponent_of(colour)
     except ValueError:
         raise GtpError("illegal move")
     self.move_history.append(History_move(colour, move))
Ejemplo n.º 9
0
 def _handle_genmove(self, args, for_regression=False, allow_claim=False):
     """Common implementation for genmove commands."""
     try:
         colour = gtp_engine.interpret_colour(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     game_state = Game_state()
     game_state.size = self.board_size
     game_state.board = self.board
     game_state.history_base = self.history_base
     game_state.move_history = self.move_history
     game_state.komi = self.komi
     game_state.for_regression = for_regression
     if self.simple_ko_point is not None and self.simple_ko_player == colour:
         game_state.ko_point = self.simple_ko_point
     else:
         game_state.ko_point = None
     game_state.handicap = self.handicap
     game_state.time_settings = self.time_settings
     game_state.time_remaining, game_state.canadian_stones_remaining = \
         self.time_status[colour]
     generated = self.move_generator(game_state, colour)
     if allow_claim and generated.claim:
         return 'claim'
     if generated.resign:
         return 'resign'
     if generated.pass_move:
         if not for_regression:
             self.move_history.append(
                 History_move(colour, None, generated.comments,
                              generated.cookie))
         return 'pass'
     row, col = generated.move
     vertex = format_vertex((row, col))
     if not for_regression:
         try:
             self.simple_ko_point = self.board.play(row, col, colour)
             self.simple_ko_player = opponent_of(colour)
         except ValueError:
             raise GtpError("engine error: tried to play %s" % vertex)
         self.move_history.append(
             History_move(colour, generated.move, generated.comments,
                          generated.cookie))
     return vertex
Ejemplo n.º 10
0
 def _handle_genmove(self, args, for_regression=False, allow_claim=False):
     """Common implementation for genmove commands."""
     try:
         colour = gtp_engine.interpret_colour(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     game_state = Game_state()
     game_state.size = self.board_size
     game_state.board = self.board
     game_state.history_base = self.history_base
     game_state.move_history = self.move_history
     game_state.komi = self.komi
     game_state.for_regression = for_regression
     if self.simple_ko_point is not None and self.simple_ko_player == colour:
         game_state.ko_point = self.simple_ko_point
     else:
         game_state.ko_point = None
     game_state.handicap = self.handicap
     game_state.time_settings = self.time_settings
     game_state.time_remaining, game_state.canadian_stones_remaining = \
         self.time_status[colour]
     generated = self.move_generator(game_state, colour)
     if allow_claim and generated.claim:
         return 'claim'
     if generated.resign:
         return 'resign'
     if generated.pass_move:
         if not for_regression:
             self.move_history.append(History_move(
                 colour, None, generated.comments, generated.cookie))
         return 'pass'
     row, col = generated.move
     vertex = format_vertex((row, col))
     if not for_regression:
         try:
             self.simple_ko_point = self.board.play(row, col, colour)
             self.simple_ko_player = opponent_of(colour)
         except ValueError:
             raise GtpError("engine error: tried to play %s" % vertex)
         self.move_history.append(
             History_move(colour, generated.move,
                          generated.comments, generated.cookie))
     return vertex
Ejemplo n.º 11
0
 def handle_fixed_handicap(self, args):
     try:
         number_of_stones = gtp_engine.interpret_int(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     if not self.board.is_empty():
         raise GtpError("board not empty")
     try:
         points = handicap_layout.handicap_points(
             number_of_stones, self.board_size)
     except ValueError:
         raise GtpError("invalid number of stones")
     for row, col in points:
         self.board.play(row, col, 'b')
     self.simple_ko_point = None
     self.handicap = number_of_stones
     self.set_history_base(self.board.copy())
     return " ".join(format_vertex((row, col))
                     for (row, col) in points)
Ejemplo n.º 12
0
 def handle_loadsgf(self, args):
     try:
         pathname = args[0]
     except IndexError:
         gtp_engine.report_bad_arguments()
     if len(args) > 1:
         move_number = gtp_engine.interpret_int(args[1])
     else:
         move_number = None
     # The GTP spec mandates the "cannot load file" error message, so we
     # can't be more helpful.
     try:
         s = self._load_file(pathname)
     except EnvironmentError:
         raise GtpError("cannot load file")
     try:
         sgf_game = sgf.Sgf_game.from_string(s)
     except ValueError:
         raise GtpError("cannot load file")
     new_size = sgf_game.get_size()
     if new_size not in self.acceptable_sizes:
         raise GtpError("unacceptable size")
     self.board_size = new_size
     try:
         komi = sgf_game.get_komi()
     except ValueError:
         raise GtpError("bad komi")
     try:
         handicap = sgf_game.get_handicap()
     except ValueError:
         # Handicap isn't important, so soldier on
         handicap = None
     try:
         sgf_board, plays = sgf_moves.get_setup_and_moves(sgf_game)
     except ValueError, e:
         raise GtpError(str(e))
Ejemplo n.º 13
0
 def handle_genmove(self, args):
     try:
         self.my_colour = gtp_engine.interpret_colour(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     return self.proxy.pass_command("genmove", args)
Ejemplo n.º 14
0
 def handle_passthrough(self, args):
     try:
         command = args[0]
     except IndexError:
         gtp_engine.report_bad_arguments()
     return self.handle_command(command, args[1:])
Ejemplo n.º 15
0
 def handle_passthrough(self, args):
     try:
         command = args[0]
     except IndexError:
         gtp_engine.report_bad_arguments()
     return self.handle_command(command, args[1:])
Ejemplo n.º 16
0
 def handle_genmove(self, args):
     try:
         self.my_colour = gtp_engine.interpret_colour(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     return self.proxy.pass_command("genmove", args)
Ejemplo n.º 17
0
 def handle_komi(self, args):
     try:
         f = gtp_engine.interpret_float(args[0])
     except IndexError:
         gtp_engine.report_bad_arguments()
     self.set_komi(f)