首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python国际象棋游戏中添加变体/节点

在python国际象棋游戏中添加变体/节点
EN

Stack Overflow用户
提问于 2021-05-28 10:13:04
回答 1查看 294关注 0票数 1

我试着用“巨蟒棋”-package构建一个国际象棋引擎

我的问题是我想给游戏添加变体,所以我使用了以下方法:

add_variation(move: chess.Move, *, comment: str = '', starting_comment: str = '', nags: Iterable[int] = []) → chess.pgn.ChildNode

如果我有一个有动作的游戏。

1. e4 e5 2. Nf3 Nf6

然后我可以为first move做这件事

代码语言:javascript
复制
pgn = io.StringIO("1. e4 e5 2. Nf3 Nf6 *")
game = chess.pgn.read_game(pgn)
board = game.board()
for move in game.mainline_moves():
    board.push(move)

node0 = game.add_variation(chess.Move.from_uci("d2d4"))
node = node0.add_variation(chess.Move.from_uci("d7d5"))
node = node.add_variation(chess.Move.from_uci("g1f3"))
node2 = game.add_variation(chess.Move.from_uci("a2a4"))

print(game)

它会显示出

1. e4 ( 1. d4 d5 2. Nf3 ) ( 1. a4 ) 1... e5 2. Nf3 Nf6 *

第一步我有两个节点。(一个以移动"d4“开头,另一个以移动”a4“开头)

我的问题是我找不到其他动作的方法。因此,例如,如果我想向移动2. Nf3添加节点,那么如何实现?

EN

回答 1

Stack Overflow用户

发布于 2021-06-12 04:39:12

我认为解决这个问题的方法是

代码语言:javascript
复制
chess.pgn.GameNode.next()

它返回下一个移动的下一个节点。但是,它似乎并不是获取特定移动的节点的直接方法,因此您必须递归地应用该方法来逐步完成移动以到达特定的节点/移动。

我对解决办法作了简短的示范。它有点笨重,我怀疑有更优雅的方法来使用这个包。但我不是一个有经验的程序员,而且软件包的文档也有点缺乏。

代码语言:javascript
复制
import chess
import chess.pgn
import io


def UCIString2Moves(str_moves):
    return [chess.Move.from_uci(move) for move in str_moves.split()]


# mainline
game = chess.pgn.read_game(
    io.StringIO("1.f4 d5 2.Nf3 g6 3.e3 Bg7 4.Be2 Nf6 5.0-0 0-0 6.d3 c5 *"))
board = game.board()
for move in game.mainline_moves():
    board.push(move)

# 1:st line, 1:st move in mainline
str_line1 = "a2a4 d7d5 g1f3 g7g6"
game.add_line(UCIString2Moves(str_line1))

# 2:nd line, 1:st move in mainline
str_line2 = "h2h5 d7d6 g1f3 g8f6"
game.add_line(UCIString2Moves(str_line2))

# 3:rd line, 2:nd move in mainline
move2_main = game.next()  # get the node for 2:nd move
str_line3 = "a7a6 g1f3 g8f6"
move2_main.add_line(UCIString2Moves(str_line3))

# 1:st variation, 3:rd move in mainline
move3_main = move2_main.next()  # get the node for 3:rd move
move3_main.add_variation(chess.Move.from_uci("c1c3"))
chess.pgn.GameNode.next()

print(game)

移动和变化/行的表示法(没有特定的开口,只有随机的动作):

代码语言:javascript
复制
1. f4 ( 1. a4 d5 2. Nf3 g6 ) ( 1. h5 d6 2. Nf3 Nf6 ) 
1... d5 ( 1... a6 2. Nf3 Nf6 ) 
2. Nf3 ( 2. Bc3 ) 2... g6 3. e3 Bg7 4. Be2 Nf6 5. O-O O-O 6. d3 c5 *
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67736977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档