68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
# -*- 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'
|