0

I am not sure this kind of question has been asked before, and been answered, by as far as my search is concerned, I haven't got any answer yet.

First let me tell you my scenario.

I want to develop a chess game in Flash AS3. I have developed the interface. I have coded the movement of the pieces and movement rules of the pieces. (Please note: Only movement rules yet, not capture rules.)

Now the problem is, I need to implement the AI in chess for one player game. I am feeling helpless, because though I know each and every rules of the chess, but applying AI is not simple at all.

And my biggest confusion is: I have been searching, and all of my searches tell me about the chess engines. But I always got confused in two types of engines. One is for front end, and second is real engines. But none specifies (or I might not get it) which one is for which.

I need a API type of some thing, where when I can get searching of right pieces, and move according to the difficulty. Is there anything like that?

Please note: I want an open source and something to be used in Flash.

Thanks.

4

2 回答 2

1

首先http://nanochess.110mb.com/archive/toledo_javascript_chess_3.html这里是原始项目,它在 JavaScript 中实现了一个相对简单的 AI(我认为它只有 2 个步骤)。由于这是一个最小代码的竞赛项目,它通过手工减少源代码而被“混淆”了。这是有人试图将相同的代码恢复到或多或少可读的源:https ://github.com/bormand/nanochess 。

我认为写它可能有点太难了,因为你没有人工智能背景......我的意思是,一个好的引擎需要提前两步计算,但只是给你一些数字:数字每一步可能的移动,假设所有棋子都在棋盘上,最大约为 140,因此第二步将是这些移动与对手所有可能移动的所有组合,同样如此多的组合,即 140 * 140 * 140 . 这意味着你需要一种非常好的技术来区分坏的动作并且只尝试预测好的动作。

直到今天,国际象棋还没有确定性的获胜策略(换句话说,它不像其他桌面游戏那样由计算机解决),这意味着它是一个相当复杂的游戏,但是一个可以下棋的人工智能在业余爱好者的水平上并不难想出。

推荐的进一步阅读:http ://aima.cs.berkeley.edu/

于 2012-12-10T16:06:27.780 回答
1

如今的国际象棋程序分为两部分:

  • 用户界面,提供棋盘、移动视图、时钟等。
  • 国际象棋引擎,提供下棋的能力。

这两个程序使用简单的文本协议(UCIXBoard)与作为子进程运行国际象棋引擎并通过管道进行通信的 UI 程序进行通信。

这有几个显着的优点:

  • 您只需要一个可以使用任何兼容国际象棋引擎的 UI 程序。
  • 由于只需要提供一个简单的界面,因此减少了开发国际象棋引擎的时间。

这也意味着开发人员可以做他们擅长的事情,而不必为了完成另一部分工作而成为团队的一员。请注意,国际象棋引擎比当今可用的国际象棋 UI 多得多。

您遇到的问题有几个缺点:

  1. 当您使用 Flash 时,您不能使用这两种程序方法(AFAIK Flash 不能使用fork(). exec(), posix_spawn())。因此,您需要提供所有解决方案,您至少应该尝试使其成为多线程的,以便引擎可以在用户与 UI 交互时工作。
  2. 与 C++ 相比,您正在使用一种非常慢的语言,而 C++ 是通常开发引擎的语言。
  3. 您可以访问有限的系统资源,尤其是内存。您可以使用 Flash 运行时的某些设置来覆盖它。

如果你想让你的程序真正下棋,那么你需要解决以下问题:

  • 移动生成器:生成一个位置的所有合法移动。一些引擎实现不担心“合法”部分并在一段时间后修剪非法移动。但是,您仍然需要在某些时候检测检查、配对、相持情况。
  • 职位评估:为给定职位提供分数。如果您无法确定一个位置是否比另一侧更好,那么您就无法找到获胜的动作
  • 移动树和修剪:您需要存储正在评估的移动序列以及修剪(忽略)您不感兴趣的分支的方法(通常是因为您已确定它们很弱)。考虑到对每一个可能的移动的每一个可能的回复,一个国际象棋移动树是巨大的,修剪树是管理这个的方法。
  • 换位表:国际象棋中有许多换位(通过以不同顺序移动棋子到达的位置)。避免重新评估您已经评估过的位置的一种方法是将位置分数存储在换位表中。为此,您需要为该位置提供一个哈希键,这通常使用Zobrist hash实现。

获得更多详细信息的最佳网站(我不是国际象棋引擎作者)将是:

祝你好运,请随时向我们发布您的进展!

于 2012-12-11T09:24:21.800 回答