C# 如何在VB.NET中实现位板?

C# 如何在VB.NET中实现位板?,c#,.net,vb.net,C#,.net,Vb.net,我的问题是: 可以在vb.net中实现a吗? 在VB中使用bitboard有任何教程/参考资料吗? C答案是可以接受的,因为它不难翻译。这里还有一些关于这方面的帖子,在答案中有一些有用的信息,希望它们能有所帮助 这里还有其他一些关于这个的帖子,在答案中有一些有用的信息,希望它们能有所帮助 那么 Dim mArray(8,8) As Boolean 将布尔值替换为您自己的类或结构,并将功能扩展到您的需求 那么 Dim mArray(8,8) As Boolean 将布尔值替换为您自己的类或结构

我的问题是:

可以在vb.net中实现a吗? 在VB中使用bitboard有任何教程/参考资料吗?
C答案是可以接受的,因为它不难翻译。

这里还有一些关于这方面的帖子,在答案中有一些有用的信息,希望它们能有所帮助


这里还有其他一些关于这个的帖子,在答案中有一些有用的信息,希望它们能有所帮助

那么

Dim mArray(8,8) As Boolean
将布尔值替换为您自己的类或结构,并将功能扩展到您的需求

那么

Dim mArray(8,8) As Boolean

将布尔值替换为您自己的类或结构,并将功能扩展到您的需求

在维基百科的文章中,比特板似乎是一个简单的比特数组。在.NET中有一个名为的类,包含执行按位操作的方法

例如,白车位置的位板可以这样声明:

'创建位数组以存储白车 作为新的BitArray64的暗淡白车 '将白车设置在初始位置 whiteRooks0=True'对应于棋盘上的A1 whiteRooks56=True'对应于棋盘上的H1
从维基百科的文章来看,比特板似乎是一个简单的比特数组。在.NET中有一个名为的类,包含执行按位操作的方法

例如,白车位置的位板可以这样声明:

'创建位数组以存储白车 作为新的BitArray64的暗淡白车 '将白车设置在初始位置 whiteRooks0=True'对应于棋盘上的A1 whiteRooks56=True'对应于棋盘上的H1
如果不想使用数组,另一种选择是简单地创建一个类/结构,其中包含要指定的多个扇区中的线路板或状态。例如,您可以指定4个long来表示128x128板,每个long表示一个扇区(假定为32位处理器)。然后,您所要做的就是重写Equals方法或==运算符来运行直接比较以检查每个部分的相等性,即this.Quadrant1==that.Quadrant1

最终,位板的整个概念是,您使用数据类型本身的位来表示环境的位置/状态int=32bits=32个位置,long=64bits=64个位置,等等。对于数值类型,这意味着您可以轻松地进行直接相等比较x==y,以查看位是否相等。这也使得检查有效的移动非常容易,因为它只需要移动X位的位置数来表示移动,并对对手的棋盘按位执行


例如,棋子可以相对于棋盘向上移动一个空格,如果还没有移动,则可以向上移动两个空格,或者可以捕获。因此,为了检查有效的移动,你需要将兵的位置8移动一个空格,16移动两个空格,首先检查是否还没有移动,或者7/9捕获。对于一个或两个空格移动,您必须在新位置的棋盘和对手棋盘上按位执行,并检查是否大于0表示有人占用了空格,因此移动无效。对于捕获移动,您仅检查对手棋盘,并且仅当结果&大于0时才允许移动。对于两个空格,首先必须对初始pawn行255进行逐位比较如果不想使用数组,另一个选项是简单地创建一个类/结构,其中包含要指定的多个扇区中的板或状态。例如,您可以指定4个long来表示128x128板,每个long表示一个扇区(假定为32位处理器)。然后,您所要做的就是重写Equals方法或==运算符来运行直接比较以检查每个部分的相等性,即this.Quadrant1==that.Quadrant1

最终,位板的整个概念是,您使用数据类型本身的位来表示环境的位置/状态int=32bits=32个位置,long=64bits=64个位置,等等。对于数值类型,这意味着您可以轻松地进行直接相等比较x==y,以查看位是否相等。这也使得检查有效的移动非常容易,因为它只需要移动X位的位置数来表示移动,并对对手的棋盘按位执行

例如,棋子可以相对于棋盘向上移动一个空格,如果还没有移动,则可以向上移动两个空格,或者可以捕获。因此,为了检查有效的移动,你需要将兵的位置8移动一个空格,16移动两个空格,首先检查是否还没有移动,或者7/9捕获。对于一个或两个空格移动,您必须在新位置的棋盘和对手棋盘上按位执行,并检查是否大于0表示有人占用了空格,因此移动无效。对于捕获移动,您仅检查对手棋盘,并且仅当结果&大于0时才允许移动。对于两个空间,首先必须在initi上进行逐位比较
al pawn第255行要在VB或C中实现位板,请使用。这可以容纳64位,棋盘的每一个方块1位。此值类型适用于许多快速的按位操作。我不建议像另一张海报推荐的那样使用BitArray,因为它太慢了。任何象棋引擎的基本要求之一就是速度

回答你的第二个问题,这是一个简单的问题

下面是我自己的C国际象棋引擎的一些例子。正如您从代码中所看到的,使用比特板可能需要一段时间,但它们通常非常快,尤其是对于位置评估

示例1-位板定义:

internal UInt64 WhiteKing;
internal UInt64 WhiteQueens;
internal UInt64 WhiteRooks;
internal UInt64 WhiteBishops;
internal UInt64 WhiteKnights;
internal UInt64 WhitePawns;
internal UInt64 WhitePieces;
示例2-位板初始化:

// Initialise piece bitboards using square contents.
private void InitPieceBitboards()
{
    this.WhiteKing = 0; 
    this.WhiteQueens = 0; 
    this.WhiteRooks = 0; 
    this.WhiteBishops = 0; 
    this.WhiteKnights = 0; 
    this.WhitePawns = 0;

    for (Int16 i = 0; i < 64; i++)
    {
        if (this.Squares[i] == Constants.WHITE_KING)
        {
            this.WhiteKing = this.WhiteKing | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_QUEEN)
        {
            this.WhiteQueens = this.WhiteQueens | Constants.BITSET[i];
        } 
        if (this.Squares[i] == Constants.WHITE_ROOK) 
        {
            this.WhiteRooks = this.WhiteRooks | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_BISHOP) 
        {
            this.WhiteBishops = this.WhiteBishops | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_KNIGHT) 
        {
            this.WhiteKnights = this.WhiteKnights | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_PAWN) 
        {
            this.WhitePawns = this.WhitePawns | Constants.BITSET[i];
        }

        this.WhitePieces = this.WhiteKing | this.WhiteQueens | 
                           this.WhiteRooks | this.WhiteBishops | 
                           this.WhiteKnights | this.WhitePawns;
        this.BlackPieces = this.BlackKing | this.BlackQueens | 
                           this.BlackRooks | this.BlackBishops | 
                           this.BlackKnights | this.BlackPawns;
        this.SquaresOccupied = this.WhitePieces | this.BlackPieces;
    }
}
示例4-计算材料分数:

// Material score from scratch, in centipawns from White's perspective.
internal static Int32 ScoreMaterial(Board position)
{
    return BitOps.BitCountWegner(position.WhitePawns)   * Constants.VALUE_PAWN +
           BitOps.BitCountWegner(position.WhiteKnights) * Constants.VALUE_KNIGHT +
           BitOps.BitCountWegner(position.WhiteBishops) * Constants.VALUE_BISHOP +
           BitOps.BitCountWegner(position.WhiteRooks)   * Constants.VALUE_ROOK   +
           BitOps.BitCountWegner(position.WhiteQueens)  * Constants.VALUE_QUEEN  -
           BitOps.BitCountWegner(position.BlackPawns)   * Constants.VALUE_PAWN   -
           BitOps.BitCountWegner(position.BlackKnights) * Constants.VALUE_KNIGHT -
           BitOps.BitCountWegner(position.BlackBishops) * Constants.VALUE_BISHOP -
           BitOps.BitCountWegner(position.BlackRooks)   * Constants.VALUE_ROOK   -
           BitOps.BitCountWegner(position.BlackQueens)  * Constants.VALUE_QUEEN;
}
示例5-计算工件移动性:

// Calculate mobility score for white knights.
remainingPieces = position.WhiteKnights;
while (remainingPieces != 0)
{
    squareFrom = BitOps.BitScanForward(remainingPieces);
    mobilityKnight += BitOps.BitCountWegner(Constants.ATTACKS_KNIGHT[squareFrom]
                                            & unoccupiedSquares);
    remainingPieces ^= Constants.BITSET[squareFrom];
 }

要在VB或C中实现位板,请使用。这可以容纳64位,棋盘的每一个方块1位。此值类型适用于许多快速的按位操作。我不建议像另一张海报推荐的那样使用BitArray,因为它太慢了。任何象棋引擎的基本要求之一就是速度

回答你的第二个问题,这是一个简单的问题

下面是我自己的C国际象棋引擎的一些例子。正如您从代码中所看到的,使用比特板可能需要一段时间,但它们通常非常快,尤其是对于位置评估

示例1-位板定义:

internal UInt64 WhiteKing;
internal UInt64 WhiteQueens;
internal UInt64 WhiteRooks;
internal UInt64 WhiteBishops;
internal UInt64 WhiteKnights;
internal UInt64 WhitePawns;
internal UInt64 WhitePieces;
示例2-位板初始化:

// Initialise piece bitboards using square contents.
private void InitPieceBitboards()
{
    this.WhiteKing = 0; 
    this.WhiteQueens = 0; 
    this.WhiteRooks = 0; 
    this.WhiteBishops = 0; 
    this.WhiteKnights = 0; 
    this.WhitePawns = 0;

    for (Int16 i = 0; i < 64; i++)
    {
        if (this.Squares[i] == Constants.WHITE_KING)
        {
            this.WhiteKing = this.WhiteKing | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_QUEEN)
        {
            this.WhiteQueens = this.WhiteQueens | Constants.BITSET[i];
        } 
        if (this.Squares[i] == Constants.WHITE_ROOK) 
        {
            this.WhiteRooks = this.WhiteRooks | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_BISHOP) 
        {
            this.WhiteBishops = this.WhiteBishops | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_KNIGHT) 
        {
            this.WhiteKnights = this.WhiteKnights | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_PAWN) 
        {
            this.WhitePawns = this.WhitePawns | Constants.BITSET[i];
        }

        this.WhitePieces = this.WhiteKing | this.WhiteQueens | 
                           this.WhiteRooks | this.WhiteBishops | 
                           this.WhiteKnights | this.WhitePawns;
        this.BlackPieces = this.BlackKing | this.BlackQueens | 
                           this.BlackRooks | this.BlackBishops | 
                           this.BlackKnights | this.BlackPawns;
        this.SquaresOccupied = this.WhitePieces | this.BlackPieces;
    }
}
示例4-计算材料分数:

// Material score from scratch, in centipawns from White's perspective.
internal static Int32 ScoreMaterial(Board position)
{
    return BitOps.BitCountWegner(position.WhitePawns)   * Constants.VALUE_PAWN +
           BitOps.BitCountWegner(position.WhiteKnights) * Constants.VALUE_KNIGHT +
           BitOps.BitCountWegner(position.WhiteBishops) * Constants.VALUE_BISHOP +
           BitOps.BitCountWegner(position.WhiteRooks)   * Constants.VALUE_ROOK   +
           BitOps.BitCountWegner(position.WhiteQueens)  * Constants.VALUE_QUEEN  -
           BitOps.BitCountWegner(position.BlackPawns)   * Constants.VALUE_PAWN   -
           BitOps.BitCountWegner(position.BlackKnights) * Constants.VALUE_KNIGHT -
           BitOps.BitCountWegner(position.BlackBishops) * Constants.VALUE_BISHOP -
           BitOps.BitCountWegner(position.BlackRooks)   * Constants.VALUE_ROOK   -
           BitOps.BitCountWegner(position.BlackQueens)  * Constants.VALUE_QUEEN;
}
示例5-计算工件移动性:

// Calculate mobility score for white knights.
remainingPieces = position.WhiteKnights;
while (remainingPieces != 0)
{
    squareFrom = BitOps.BitScanForward(remainingPieces);
    mobilityKnight += BitOps.BitCountWegner(Constants.ATTACKS_KNIGHT[squareFrom]
                                            & unoccupiedSquares);
    remainingPieces ^= Constants.BITSET[squareFrom];
 }


嗯,很好。我不知道他们。但是,根据维基百科页面上的描述,不难找到一个实现。是的,这是一个国际象棋游戏。你需要使用逻辑位运算符,例如:@avideveler Tnx获取响应帮助:DHm,nice。我不知道他们。但是,根据维基百科页面上的描述,不难找到一个实现。是的,这是一个国际象棋游戏。您需要使用逻辑位运算符,例如:@avideveler Tnx获取响应it帮助:我稍后将尝试应用第一个链接。。这次我得走了,稍后我会尝试应用第一个链接。。这次我不得不说,国际象棋中比特板的全部意义在于某些操作的可用性和速度。在这两个方面,位数组明显低于简单的UInt64。我将很快添加一个带有一些例子的答案。同意上面的RoadWarrior。由于扩展性的原因,BitArray可能是一个不错的选择,但它不适用于国际象棋,因为它总是有64个方块。然而,更重要的是,大多数涉及UInt64的二进制操作将在x64体系结构上的单CPU周期内完成,这一点我怀疑BitArray的保证。国际象棋中位板的关键在于某些操作的可用性和速度。在这两个方面,位数组明显低于简单的UInt64。我将很快添加一个带有一些例子的答案。同意上面的RoadWarrior。由于扩展性的原因,BitArray可能是一个不错的选择,但它不适用于国际象棋,因为它总是有64个方块。然而,更重要的是,大多数涉及UInt64的二进制操作将在x64体系结构上的单CPU周期内完成,这一点我怀疑BitArray的保证。嘿@RoadWarrior,这是你发布的一段非常有趣的代码,你在任何地方发布过完整的源代码吗?@Lu4:Amaia目前是一个私人国际象棋程序,所以完整的源代码不可用。嘿@RoadWarrior,这是你发布的一段非常有趣的代码,你在任何地方发布过完整的源代码吗?@Lu4:Amaia目前是一个私人国际象棋程序,所以完整的源代码不可用。