# -*- coding: utf-8 -*- """坐标转换: 站点坐标(行1-10) <-> 引擎 UCCI(行0-9), 以及 FEN 构建。""" import re MOVE_RE = re.compile(r'^([a-i])(\d+)([a-i])(\d+)$') INITIAL_GRID = ( 'rnbakabnr' '.........' '.c.....c.' 'p.p.p.p.p' '.........' '.........' 'P.P.P.P.P' '.C.....C.' '.........' 'RNBAKABNR' ) def _sub(m, delta): return f'{m.group(1)}{int(m.group(2)) + delta}{m.group(3)}{int(m.group(4)) + delta}' def site_to_ucci(m): """'b3e3'->'b2e2', 'h10g8'->'h9g7' (站点行号 1-10, 引擎行号 0-9).""" return MOVE_RE.sub(lambda x: _sub(x, -1), m) def ucci_to_site(m): """'b2e2'->'b3e3', 'h9g7'->'h10g8'.""" return MOVE_RE.sub(lambda x: _sub(x, +1), m) def ucci_to_rc(m): """UCCI 'b2e2' -> ((row,col),(row,col)); row 0 = 黑方底线(FEN 首行) = 9 - rank.""" g = MOVE_RE.match(m) if not g: raise ValueError(f'走法格式错误: {m}') return (9 - int(g.group(2)), ord(g.group(1)) - 97), (9 - int(g.group(4)), ord(g.group(3)) - 97) def fen_from_moves(moves_ucci): """从初始局面盲走生成 FEN(不走法合法性校验, 走法来自服务器视为可信)。""" grid = list(INITIAL_GRID) turn = 'w' for m in moves_ucci: (r1, c1), (r2, c2) = ucci_to_rc(m) grid[r2 * 9 + c2] = grid[r1 * 9 + c1] grid[r1 * 9 + c1] = '.' turn = 'b' if turn == 'w' else 'w' rows = [] for r in range(10): row, empty = '', 0 for c in range(9): ch = grid[r * 9 + c] if ch == '.': empty += 1 else: if empty: row += str(empty) empty = 0 row += ch if empty: row += str(empty) rows.append(row) return '/'.join(rows) + f' {turn} - - 0 1'