当前位置: 首页 > 知识库问答 >
问题:

有没有办法将Python棋盘转换成整数列表?

公良照
2023-03-14

我正在尝试创建一个神经网络来下棋,但首先,我需要将棋盘转换为整数列表。我正在使用国际象棋棋盘和游戏的python国际象棋模块。我目前有一个国际象棋棋盘类,但找不到将其转换为列表的方法。

我试过使用棋盘。epd()方法,但它返回的格式方案很难转换。

下面是我需要的代码:

board = chess.Board()  # Define board object
board.convert_to_int()  # Method I need

现在,使用。epd()我得到的方法“rnbqkbnr/PPPPPP/8/8/5P2/PPPPP 1PP/rnbqkbnr b KQkq-”

如您所见,解析并转换为整数列表非常困难,因为有/8//5P2/

预期的输出是这样的(逐行):

[4, 2, 3, 5, 6, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, ... -1, -1, -1, -1,-1, -1,-1, -1, -4, -2, -3, -5, -6, -3, -2, -4]

例如,这些可以是映射到PEICE的整数:

pawn - 1
knight - 2
bishop - 3
rook - 4
queen - 5
king - 6

白色可以是正整数,黑色可以是负整数。

共有3个答案

苏彭薄
2023-03-14

我做了一个函数来转换国际象棋。将对象转换为矩阵

def make_matrix(board): #type(board) == chess.Board()
    pgn = board.epd()
    foo = []  #Final board
    pieces = pgn.split(" ", 1)[0]
    rows = pieces.split("/")
    for row in rows:
        foo2 = []  #This is the row I make
        for thing in row:
            if thing.isdigit():
                for i in range(0, int(thing)):
                    foo2.append('.')
            else:
                foo2.append(thing)
        foo.append(foo2)
    return foo

这将返回一个矩阵或嵌套列表:

输出:

[['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'], 
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'], 
['.', '.', '.', '.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.', '.', '.', '.'], 
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'], 
['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']]
翁宜年
2023-03-14

我刚刚阅读了chess模块的文档,并根据您的需要创建了一个简单的抽象类。

import chess

class MyChess(chess.Board):

    mapped = {
        'P': 1,     # White Pawn
        'p': -1,    # Black Pawn
        'N': 2,     # White Knight
        'n': -2,    # Black Knight
        'B': 3,     # White Bishop
        'b': -3,    # Black Bishop
        'R': 4,     # White Rook
        'r': -4,    # Black Rook
        'Q': 5,     # White Queen
        'q': -5,    # Black Queen
        'K': 6,     # White King
        'k': -6     # Black King
        }

    def convert_to_int(self):
        epd_string = self.epd()
        list_int = []
        for i in epd_string:
            if i == " ":
                return list_int
            elif i != "/":
                if i in self.mapped:
                    list_int.append(self.mapped[i])
                else:
                    for counter in range(0, int(i)):
                        list_int.append(0)

注:

大写字母代表白色,小写字母代表黑色。0表示棋盘上的空格。

汝跃
2023-03-14

下面是使用Unicode()方法的另一个版本:

def convert_to_int(board):
    indices = '♚♛♜♝♞♟⭘♙♘♗♖♕♔'
    unicode = board.unicode()
    return [
        [indices.index(c)-6 for c in row.split()]
        for row in unicode.split('\n')
    ]
 类似资料:
  • 我目前正在将我的“旧”基于Python的聊天机器人改写成golang。我遇到的一个问题是我不能将PDF转换成jpeg。我想这样做,这样我就可以轻松地将它发送到聊天室。 已经用bimg(根本不起作用)和imagemagick(gopkg.in/gographics/imagick.v3/imagick)尝试过这一点,正如在对另一个线程的回答中提供的那样:https://stackoverflow.c

  • 问题内容: 是否有内置的方法将布尔值转换为整数,反之亦然?我尝试了普通的转换,但是由于它们使用不同的基础类型,因此经典的转换方式是不可能的。我已经填写了一些规范,但尚未找到答案。 问题答案: 从int到bool很容易,只需完成操作即可。换句话说,由于Go不支持三元运算符,因此您必须执行以下操作: 您当然可以将其放在函数中: 整数有很多种可能的布尔解释,但它们都不一定是自然的,因此必须说出您的意思是

  • 所以我想知道怎么才能把一个芬的ID转换到棋盘上。 代码: 我很感激我得到的任何帮助。如果你需要更多的信息,请告诉我。

  • 问题内容: 我的软件在UTF8中得到的字符串比我转换为ISO 8859 1所需的字符串多。我知道UTF8域比iso 8859大。但是UTF8中的数据先前已从ISO上转换,所以我不应该错过任何内容。 我想知道是否存在从UTF8转换为iso-8859-1的简单/直接方法。 谢谢 问题答案: 这是您可能会发现有用的功能:。它可以转换为(包括欧元,但没有),但是对于-> -> 往返的-> 转换部分,它也可

  • 问题内容: 因此,我有一个方法,其中包含3种不同类型的参数: ,和。因此,想法是使用泛型来最小化接口 但是我已经意识到,是在运行时,and 参数实际上会使那失败。这是有道理的,这只是我的一厢情愿。 但是,如果我尝试将a强制转换为双精度,编译器将吠叫: 无法使用参数’(T)’调用类型’Double’的初始化程序 我认为这也是有道理的,因为没有Double的初始化程序需要Generic。 因此,看起来

  • 问题内容: 我需要转换成,成等。 有没有办法用库或类或其他东西做到这一点? 问题答案: 此代码的大部分是设置数字单词dict,仅在第一次调用时才完成。