some support for handicap stones in loading

This commit is contained in:
Sander Land committed 2020-02-16 14:31:19 +01:00
1 parent 9d667850e2
commit 82a9efad06
2 files changed
+26 -5

No files matched your search

+11
View File
@@ -270,6 +270,17 @@ class Board:
self.current_move = self.current_move.parent
self._init_chains()
def place_handicap_stones(self, n_handicaps):
near = 3 if self.board_size >= 13 else 2
far = self.board_size - 1 - near
middle = self.board_size // 2
stones = [(far, far), (near, near), (far, near), (near, far)]
if n_handicaps % 2 == 1:
stones.append((middle, middle))
stones += [(near, middle), (far, middle), (middle, near), (middle, far)]
for stone in stones[:n_handicaps]:
self.play(Move(player=0, coords=stone))
@property
def moves(self) -> list: # flat list of moves to current
moves = []
+15 -5
View File
@@ -164,9 +164,9 @@ class EngineControls(GridLayout):
return
self.board.undo()
def _do_init(self, board_size):
def _do_init(self, board_size, komi=None):
self.board_size = board_size
self.komi = Config.get("board")[f"komi_{board_size}"]
self.komi = float(komi or Config.get("board").get(f"komi_{board_size}", 6.5))
self.board = Board(board_size)
self._request_analysis(self.board.root)
self.redraw(include_board=True)
@@ -177,9 +177,15 @@ class EngineControls(GridLayout):
el.disabled = False
def _do_analyze_sgf(self, sgf):
self._do_init(self.board_size)
sgfprops = {k: v for k, v in re.findall(r"\b(\w+)\[(.*?)\]", sgf)}
size = int(sgfprops.get("SZ", self.board_size))
self._do_init(size, sgfprops.get("KM"))
sgfmoves = re.findall(r"\b([BW])\[([a-z]{2})\]", sgf)
moves = [Move(player=Move.PLAYERS.index(p.upper()), sgfcoords=(mv, self.board_size)) for p, mv in sgfmoves]
handicap = int(sgfprops.get("HA", 0))
self.board.place_handicap_stones(handicap) # not technically correct, should parse AB/AW
if handicap > 0:
self._request_analysis(self.board.current_move)
for move in moves:
self.play(move, faster=(self.ai_fast.active and move != moves[-1]))
@@ -198,8 +204,12 @@ class EngineControls(GridLayout):
return
if self.debug:
print(f"[{time.time()-self.query_time.get(analysis['id'],0):.1f}] kata analysis received:", line[:80], "...")
self.board.store_analysis(analysis)
self.update_evaluation()
if "error" in analysis:
print(analysis)
self.info.text = f"ERROR IN KATA ANALYSIS: {analysis['error']}"
else:
self.board.store_analysis(analysis)
self.update_evaluation()
def _send_analysis_query(self, query):
self.query_time[query["id"]] = time.time()