重构: aiohttp 全异步 + chessdb 云库 + uv 管理
This commit is contained in:
commit
8d996b8c5f
13 files changed
+1726
No files matched your search
@@ -0,0 +1,67 @@
|
||||
# -*- 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'
|
||||
Reference in new issue
Block a user