2017-11-04 01:45:55 +08:00
|
|
|
import gtp
|
|
|
|
import go
|
|
|
|
import utils
|
|
|
|
|
|
|
|
|
|
|
|
def translate_gtp_colors(gtp_color):
|
|
|
|
if gtp_color == gtp.BLACK:
|
|
|
|
return go.BLACK
|
|
|
|
elif gtp_color == gtp.WHITE:
|
|
|
|
return go.WHITE
|
|
|
|
else:
|
|
|
|
return go.EMPTY
|
|
|
|
|
2017-11-26 13:36:52 +08:00
|
|
|
|
2017-11-04 01:45:55 +08:00
|
|
|
class GtpInterface(object):
|
|
|
|
def __init__(self):
|
|
|
|
self.size = 9
|
|
|
|
self.position = None
|
|
|
|
self.komi = 6.5
|
|
|
|
self.clear()
|
|
|
|
|
|
|
|
def set_size(self, n):
|
|
|
|
self.size = n
|
|
|
|
go.set_board_size(n)
|
|
|
|
self.clear()
|
|
|
|
|
|
|
|
def set_komi(self, komi):
|
|
|
|
self.komi = komi
|
|
|
|
self.position.komi = komi
|
|
|
|
|
|
|
|
def clear(self):
|
|
|
|
self.position = go.Position(komi=self.komi)
|
|
|
|
|
|
|
|
def accomodate_out_of_turn(self, color):
|
|
|
|
if not translate_gtp_colors(color) == self.position.to_play:
|
|
|
|
self.position.flip_playerturn(mutate=True)
|
|
|
|
|
|
|
|
def make_move(self, color, vertex):
|
|
|
|
coords = utils.parse_pygtp_coords(vertex)
|
|
|
|
self.accomodate_out_of_turn(color)
|
|
|
|
try:
|
|
|
|
self.position = self.position.play_move(coords, color=translate_gtp_colors(color))
|
|
|
|
except go.IllegalMove:
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
def get_move(self, color):
|
|
|
|
self.accomodate_out_of_turn(color)
|
|
|
|
if self.should_resign(self.position):
|
|
|
|
return gtp.RESIGN
|
|
|
|
|
|
|
|
if self.should_pass(self.position):
|
|
|
|
return gtp.PASS
|
|
|
|
|
|
|
|
move = self.suggest_move(self.position)
|
|
|
|
return utils.unparse_pygtp_coords(move)
|
|
|
|
|
|
|
|
def should_resign(self, position):
|
|
|
|
if position.caps[0] + 50 < position.caps[1]:
|
|
|
|
return gtp.RESIGN
|
|
|
|
|
|
|
|
def should_pass(self, position):
|
|
|
|
# Pass if the opponent passes
|
|
|
|
return position.n > 100 and position.recent and position.recent[-1].move == None
|
|
|
|
|
|
|
|
def get_score(self):
|
|
|
|
return self.position.result()
|
|
|
|
|
|
|
|
def suggest_move(self, position):
|
|
|
|
raise NotImplementedError
|