Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 国际象棋引擎-引擎类型混乱-Flash as3_Actionscript 3_Flash_Artificial Intelligence_Chess - Fatal编程技术网

Actionscript 3 国际象棋引擎-引擎类型混乱-Flash as3

Actionscript 3 国际象棋引擎-引擎类型混乱-Flash as3,actionscript-3,flash,artificial-intelligence,chess,Actionscript 3,Flash,Artificial Intelligence,Chess,我不确定以前有人问过这样的问题,也没有人回答过。就我的搜索而言,我还没有得到任何答案 首先让我告诉你我的情况 我想在Flash AS3中开发一个国际象棋游戏。我已经开发了界面。我已经对碎片的运动和碎片的运动规则进行了编码。(请注意:目前只有移动规则,而不是捕获规则。) 现在的问题是,我需要在一人博弈的国际象棋中实现AI。我感到无助,因为虽然我知道国际象棋的每一条规则,但应用AI一点也不简单 我最大的困惑是:我一直在搜索,我所有的搜索都告诉我关于国际象棋引擎的事情。但我总是对两种类型的引擎感到困惑

我不确定以前有人问过这样的问题,也没有人回答过。就我的搜索而言,我还没有得到任何答案

首先让我告诉你我的情况

我想在Flash AS3中开发一个国际象棋游戏。我已经开发了界面。我已经对碎片的运动和碎片的运动规则进行了编码。(请注意:目前只有移动规则,而不是捕获规则。)

现在的问题是,我需要在一人博弈的国际象棋中实现AI。我感到无助,因为虽然我知道国际象棋的每一条规则,但应用AI一点也不简单

我最大的困惑是:我一直在搜索,我所有的搜索都告诉我关于国际象棋引擎的事情。但我总是对两种类型的引擎感到困惑。一个是前端,第二个是真正的引擎。但是没有人指定(或者我可能不明白)哪一个是为哪一个

我需要一个API类型的东西,当我可以得到正确的块搜索,并根据难度移动。有类似的吗

请注意:我想要一个开源的东西,在Flash中使用

谢谢。

首先,这里是一个原始项目,它用JavaScript实现了一个相对简单的AI(我认为只有两步深)。因为这是一个争取最少代码的竞赛项目,所以它在某种程度上是通过手工简化源代码而“模糊化”的。有人试图将相同的代码还原到可读性稍差的源:

我觉得写起来可能有点太难了,因为你没有人工智能的背景。。。我的意思是,一个好的引擎需要提前两步计算,但只是给你一些数字:考虑到棋盘上的所有棋子,每一步可能移动的次数最多约为140,因此,第二步将是所有这些动作与对手所有可能动作的组合,也就是140*140*140。这意味着你需要一个很好的技术来辨别坏的动作,并且只尝试预测好的动作

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

建议进一步阅读:

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

  • 提供棋盘、移动视图、时钟等的用户界面
  • 国际象棋引擎,提供下棋的能力
这两个程序使用简单的文本协议(or)与作为子进程运行chess引擎的UI程序进行通信,并通过管道进行通信

这有几个显著的优点:

  • 您只需要一个可以使用任何兼容的象棋引擎的UI程序
  • 由于只需要提供一个简单的接口,因此开发国际象棋引擎的时间缩短了
这也意味着开发人员可以做他们擅长的事情,而不必为了完成另一部分而成为团队的一部分。请注意,现在的国际象棋引擎比国际象棋用户界面多得多

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

  • 在使用Flash时,不能使用这种双程序方法(AFAIK Flash不能使用
    fork()
    exec()
    posix_spawn()
    )。因此,您需要提供所有的解决方案,您至少应该尝试使用多线程,以便在用户与UI交互时引擎可以工作
  • 你使用的是一种与C++相比非常慢的语言,这是引擎通常开发的。
  • 您可以访问有限的系统资源,特别是内存。您可能可以使用Flash运行时的某些设置来覆盖这一点
  • 如果您想让您的程序真正下棋,则需要解决以下问题:

    • 移动生成器:生成一个位置中的所有合法移动。一些引擎实现不担心“合法”部分,并在一段时间后删除非法移动。然而,您仍然需要在某个时刻检测检查、相持和相持情况
    • 职位评估:提供给定职位的分数。如果你不能确定一个位置对一方是否比另一方更有利,那么你就没有办法找到赢家
    • 移动树和修剪:您需要存储正在评估的移动序列,以及修剪(忽略)您不感兴趣的分支的方法(通常是因为您已经确定它们很弱)。一个象棋移动树是巨大的,因为每一个可能的回答,每一个可能的移动和修剪树是管理这一点的方法
    • 换位表:国际象棋中有许多换位(以不同顺序移动棋子所达到的位置)。避免重新评估已评估位置的一种方法是将位置分数存储在换位表中。为了做到这一点,您需要为该位置提供一个哈希键,它通常使用
    获得更详细信息的最佳网站(我不是国际象棋引擎的作者)是:


    祝你好运,请随时向我们通报你的进展情况

    前端引擎处理的是视觉效果,后端或“真实”引擎处理的是隐藏在视图之外的数据。你的国际象棋AI应该在任何事情上使用你的棋盘,你可以把它呈现给AI,并用同样的术语评估可能的移动——这就是后端引擎的用途。然后,一旦它选择了一个移动,前端部分开始发挥作用,移动AI的一部分,并显示结果。你可能很难找到一个用于flash的,但你可能能够从