我在LAN(长代数符号)中有一系列的Fen字符串和伴随的动作,看起来如下所示.在我的问题的末尾粘贴了一个数据帧示例.
FEN | Moves | GameUrl |
---|---|---|
r3k2r/1b1pbppp/p7/1pp5/3q4/P1NPBp1P/1PP1B1P1/R4Q1K w kq - 0 19 | e3d4 f3g2 f1g2 b7g2 h1g2 c5d4 | Link |
3rr1k1/5ppp/6q1/pp6/1bppPn2/5P2/PPP2QPP/2NRBRK1 w - - 8 25 | e1b4 f4h3 g1h1 h3f2 | Link |
r1bq1rk1/ppp2ppp/2np1b1n/3Q2N1/2B1PP2/4B3/PP2N1PP/R4RK1 b - - 0 13 | h6g4 g5f7 f8f7 d5f7 | Link |
这个数据框中的每一行都是一个国际象棋谜题.我想要生成一个拼图的PGN,基于初始的fen,然后应用组成拼图的移动序列,目前存储在Moves
中的长代数记法.
因此,我对上述嵌套框架的第一行的理想结果是:
FEN | Moves | GameUrl | PGN |
---|---|---|---|
r3k2r/1b1pbppp/p7/1pp5/3q4/P1NPBp1P/1PP1B1P1/R4Q1K w kq - 0 19 | e3d4 f3g2 f1g2 b7g2 h1g2 c5d4 | Link | [Variant "From Position"][FEN "r3k2r/1b1pbppp/p7/1pp5/3q4/P1NPBp1P/1PP1B1P1/R4Q1K w kq - 0 19"]19. Bxd4 fxg2+ 20. Qxg2 Bxg2+ 21. Kxg2 cxd4 |
要实现这一点,我们需要将局域网移动转换为SAN(短代数记法).
使用R的bigchess
包,我try 将移动转向SAN,如下所示:
library(tidyverse)
library(bigchess)
df2 <- df %>%
mutate(Moves_SAN = sapply(Moves, lan2san))
但我认为它是从棋盘的起始位置读取Moves
,所以翻译后的Moves_SAN
是不正确的.
Does anyone know a way to convert the LAN to SAN based on the FEN and using an available package in R?个
我设想的解决方案包括向FEN加载bigchess
、stockfish
或chess
,然后应用局域网,并在这种情况下以某种方式将它们转换为SAN,但我一直无法弄清楚如何实现.
structure(list(FEN = c("r3k2r/1b1pbppp/p7/1pp5/3q4/P1NPBp1P/1PP1B1P1/R4Q1K w kq - 0 19",
"3rr1k1/5ppp/6q1/pp6/1bppPn2/5P2/PPP2QPP/2NRBRK1 w - - 8 25",
"r1bq1rk1/ppp2ppp/2np1b1n/3Q2N1/2B1PP2/4B3/PP2N1PP/R4RK1 b - - 0 13"
), Moves = c("e3d4 f3g2 f1g2 b7g2 h1g2 c5d4", "e1b4 f4h3 g1h1 h3f2",
"h6g4 g5f7 f8f7 d5f7"), GameUrl = c("https://lichess.org/6OEDg4W3#Some(36)",
"https://lichess.org/W9LaAFV1#Some(48)", "https://lichess.org/BxbS4jtt/black#Some(25)"
)), row.names = c(NA, -3L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000026e39ef2e30>)