2013-08-23 38 views
2

我想了解基本的国际象棋算法。我没有深入阅读文献还没有,但经过一番这里cogitating是我的尝试:国际象棋算法概述

1)分配权重值,以件(即主教比棋子更有价值)

2)定义启发式功能将值附加到特定的移动

3)构建极大极大树来存储所有可能的移动。通过alpha/beta修剪修剪树。

4)遍历树找到每个玩家

这是核心的国际象棋的算法“大局”思想的最好的举动?有人能够指出我更深入地了解国际象棋算法的资源吗?

+0

您的问题可能过于宽泛,但A.I. Russell和Norvig的书是一篇很棒的介绍。 – sdasdadas

+0

在您决定沿树遍历足够多之后,您需要采用某种启发式方法来评估董事会。 –

+2

这里有一个很好的资源:http://chessprogramming.wikispaces.com/ – harold

回答

5

以下是国际象棋引擎开发概述。

1.创建董事会代表。

在面向对象的语言中,这将是一个代表内存中棋盘的对象。在这个阶段的选项是:

  1. 位棋盘
  2. 均为0x88
  3. 8×8

位棋盘的原因是多方面的推荐方式。

2.创建一个评估函数。

这只需要一个董事会和边评估作为agruments并返回一个分数。方法签名将如下所示:

int Evaluate(Board boardPosition, int sideToEvaluateFor); 

这是您使用分配给每件的权重的位置。如果你愿意,这也是你可以使用任何启发式方法的地方。一个简单的评估函数将增加sideToEvaluateFor的棋子的权重,并减去对方棋子的权重。这样的评估功能对于真正的国际象棋引擎来说当然太天真了。

3.创建搜索功能。

这就像你说的那样,用Alpha-Beta修剪技术进行MiniMax搜索。一些流行的搜索算法是:

  1. NegaMax
  2. NegaScout
  3. MTD(F)

基本想法是尝试各种不同的变化,以一定的最大深度,并选择推荐的举动通过导致得分最高的变化。每种变化的分数是评估方法在最大深度处的棋盘位置返回的分数。

对于C#中的国际象棋引擎的例子看看我最近放在一起的https://github.com/bytefire/shutranj。要看的更好的开源引擎是用C++编写的StockFish(https://github.com/mcostalba/Stockfish)。

+0

官方的stockfish repo在这里:https://github.com/official-stockfish/Stockfish – Matteo