对计算机进行编程以下棋时,如何为棋盘建模?

时间:2020-03-05 18:46:33  来源:igfitidea点击:

我们将使用什么数据结构来表示计算机国际象棋程序的国际象棋棋盘?

解决方案

回答

简单的方法是使用8x8整数数组。使用0表示空白方块,并为各部分分配值:

1 white pawns
2 white knights
3 white bishops
4 white rooks
5 white queens
6 white king

Black pieces use negative values
-1 black pawn
-2 black knight
etc

8| -4 -2 -3 -5 -6 -3 -2 -4
7| -1 -1 -1 -1 -1 -1 -1 -1
6|  0  0  0  0  0  0  0  0
5|  0  0  0  0  0  0  0  0
4|  0  0  0  0  0  0  0  0
3|  0  0  0  0  0  0  0  0
2|  1  1  1  1  1  1  1  1 
1|  4  2  3  5  6  3  2  4
  -------------------------
   1  2  3  4  5  6  7  8

可以通过使用数组索引来计算零件移动。例如,白色棋子通过将行索引增加1来移动,如果它是棋子的第一步,则将行索引增加2. 因此,[2] [1]上的白色棋子可以移动到[3] [1]或者[4] [1]。

但是,这种具有棋盘格的简单8x8阵列表示法存在一些问题。最值得注意的是,当我们移动"滑动"的棋子(如菜鸟,主教和皇后)时,我们需要不断检查索引,以查看棋子是否已移出棋盘。

如今,大多数象棋程序,尤其是在64位CPU上运行的象棋程序,都使用位图表示法来表示棋盘并生成移动。 x88是用于没有64位CPU的计算机的备用主板型号。

回答

数组可能很好。如果我们想使用更方便的"遍历"电路板的方法,则可以轻松地构建一些方法来抽象化数据结构实现的细节。

回答

int[8][8]

0=no piece
1=king
2=queen
3=rook
4=knight
5=bishop
6=pawn

对白色使用正整数,对黑色使用负整数

回答

最初,使用8 * 8整数数组表示棋盘。

我们可以使用此符号开始编程。给出零件的点值。例如:

**White**
9 = white queen
5 = white rook
3 = bishop
3 = knight
1 = pawn

**black**
-9 = white queen
-5 = white rook
-3 = bishop
-3 = knight
-1 = pawn

White King: very large positive number
Black King: very large negative number

等(注意,以上给出的要点是每个棋子交易能力的近似值)

在开发了应用程序的基本骨干并清楚地了解所用算法的工作原理之后,请尝试通过使用位板来提高性能。

在位板中,使用八个8位字表示板。此表示法每个棋子都需要一块棋盘。在一个位板上,我们将存储车的位置,而在另一个位中,我们将存储骑士的位置...等等

位板可以极大地提高应用程序的性能,因为使用位板操作零件非常容易且快速。

正如我们所指出的,

Most chessprograms today, especially
  those that run on a 64 bit CPU, use a
  bitmapped approach to represent a
  chessboard and generate moves. x88 is
  an alternate board model for machines
  without 64 bit CPUs.

回答

我将使用多维数组,以便数组中的每个元素都是对板上正方形的网格参考。

因此

board = arrary(A = array (1,2,3,4,5,5,6,7,8),
               B = array (12,3,.... etc...
               etc...          
               )

那么board [A] [1]就是正方形A1.

实际上,我们可以使用数字而不是字母来帮助保持数学逻辑,以使各个部分可以简单移动。

回答

当然,有多种表示棋盘的方法,而最佳方法将取决于对我们而言最重要的事物。

两个主要选择是速度和代码清晰度。

如果优先考虑速度,则必须为主板上的每组棋子使用64位数据类型(例如白色棋子,黑色皇后棋子,传人棋子)。然后,我们可以在生成移动并测试移动合法性时利用本机按位操作。

如果代码的清晰性是优先考虑的事情,那么请忽略位改组,而采用像其他人已经建议的那样很好地抽象的数据类型。请记住,如果我们采用这种方式,则可能会更快达到性能极限。

首先,请查看Crafty(C)和SharpChess(C#)的代码。

回答

好吧,不确定这是否有帮助,但是深蓝使用单个6位数字表示板上的特定位置。与使用64位位板的竞争对手相比,这有助于节省芯片上的占用空间。

这可能无关紧要,因为很有可能目标硬件上已经有64位寄存器。

回答

使用位板是表示棋盘状态的有效方法。基本思想是使用64位的位集表示板上的每个正方形,其中第一个位通常表示A1(左下角的正方形),而第64个位表示H8(对角相对的正方形)。每个玩家(黑,白)的每种棋子(棋子,国王等)都有自己的位板,所有这12个板都构成游戏状态。有关更多信息,请查看此Wikipedia文章。

回答

实际上,我不会为国际象棋棋盘建模,而只是为棋子的位置建模。
然后,我们可以为国际象棋棋盘划界。

Piece.x= x position of piece
Piece.y= y position of piece

回答

创建国际象棋引擎时,我最初采用[8] [8]方法,但是最近我更改了代码,以使用64项数组表示国际象棋棋盘。我发现,至少在我的情况下,此实现的效率提高了大约1/3.

在进行[8] [8]方法时,我们要考虑的一件事是描述职位。例如,如果我们想描述棋子的有效举动,则需要2个字节。当使用[64]项目数组时,我们可以用一个字节来完成。

要将[64]板上的位置转换为[8] [8]板上的位置,我们只需使用以下计算即可:

行=(字节)(索引/ 8)

Col =(字节)(索引%8)

尽管我发现我们不必在性能敏感的递归移动搜索过程中执行此操作。

有关构建国际象棋引擎的更多信息,请随时访问我的博客,从头开始描述该过程:www.chessbin.com

亚当·贝伦特

回答

120个字节的数组。

这是由前哨正方形包围的8x8棋盘(例如255,表示棋子无法移动到该正方形)。前哨的深度为2,因此骑士无法越过。

向右移动添加1.向左移动添加-1. 上10,下-10,上和右对角线11等。正方形A1是索引21. H1是索引29. H8是索引99.

所有设计都是为了简化。但是它永远不会像位板那么快。