C# 如何在VB.NET中实现位板?
我的问题是: 可以在vb.net中实现a吗? 在VB中使用bitboard有任何教程/参考资料吗?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 将布尔值替换为您自己的类或结构
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目前是一个私人国际象棋程序,所以完整的源代码不可用。