2010-10-02 91 views
0

我有问题。我想写一个国际象棋应用规则如下程序:如何在C#中编写像游戏一样的国际象棋?

  • 它应该只有一个国王和女王在一边,另一边应该只有一个国王。
  • 第一面应该用尽可能少的移动次数来匹配第二面。

我想知道你对如何制作这个项目的想法。例如,我想知道哪种编写代码的方式更容易(面向对象或结构化,...)(我有一些关于面向对象的信息),并且可以说我编写它的算法?例如,我应该从哪里开始编写代码?

+1

“第一面应该用最低的运动消磨第二面”是什么意思? – Gabe 2010-10-02 15:56:18

+4

如果您从未尝试编写国际象棋应用程序,我首先会着重确定您将如何代表棋盘/棋子。然后努力做出合法的举动。如果你以前从未尝试过这种方法,那么应该会花费大约3个月的时间。这时你可能会决定放弃它,并使用数百个开源国际象棋应用程序之一。 – 2010-10-02 16:00:27

+0

第一方面的意思是例如白色,第二个是黑色 – Arash 2010-10-02 16:06:50

回答

1

这里的好消息是,你的问题在范围上是相当有限的,因为你只有三件事可以抗衡。你在这里并没有真正实现一款游戏,就像解决一个逻辑难题一样。我会这样处理它:

  1. 找出如何以简单的方式表示三件。你真的不需要这里的UI(除了测试),因为你只是想解决一个难题。最简单的方法可能是三件中每一件的简单的行,列位置。

  2. 如果您之前没有编写面向对象的程序,您可能需要坚持使用过程模型,并简单地为需要表示的数据定义变量。问题范围很小,所以你可以逃避这一点。如果你有一些OOP的经验,你可以适当地分解问题,尽管你可能不需要任何继承关系。

  3. 编写用于生成可能移动的代码并确定给定移动是否有意义。一个合法的国王的举动是任何不检查国王的举动。大多数女王的举动都应该是允许的,但是你可能也想排除让敌国王夺取女王位的举动。

  4. 现在您需要确定一个策略,以便如何组合一系列的动作来解决这个难题。如果你需要找到真正的最佳解决方案(不仅仅是一个好的解决方案),你可能需要做一个强力搜索。这对于这个问题可能是可行的。您可能需要执行深度优先搜索(如果您不知道这意味着什么,那是您的第一个研究课题),因为一旦找到可行的解决方案,就会限制所有其他解决方案的深度考虑。

  5. 如果您能够获得强力功能并且需要加快制造速度,请考虑是否存在可以证明无法获益的举措。如果是这样,您可以立即从搜索中排除这些移动,节省您需要考虑的分支数量。您还可以努力优化您的评估功能,因为在您做数十亿次评估时,更快的评估是非常有益的。最后,你可能会想出一些启发式方法来评估首先尝试的分支。您可以更快地融合到“良好”解决方案,您需要考虑的案例越少,以找到最佳解决方案。


一个侧面说明,我意识到的是,这个问题是非常不同的,如果你假设敌国王试图避免将死。简单的深度优先修剪只有在允许你以最好的方式移动敌方国王时才有效。如果敌方国王试图避免将死,那么问题就会变得复杂,因为你们的优化目标相互冲突(你希望尽可能少的动作发生,但是你的敌人国王想要尽可能延期)。你可能会仅限于表征一系列可能性(比如,如果King完全合作,则为3次移动最佳情况,如果King完全回避,则最佳情况下为8次移动)。

+0

问题没有真正澄清。如果国王试图让自己陷入死刑,那么我预计它可以通过3次白色动作轻松实现。 – 2010-10-03 11:06:51

2

看看这个SO问题(Programming a chess AI)。

从这个问题的答案,我认为这C# Chess Game Starter Kit将是一个好的开始,但我也会看看其他文章以及一些有趣的历史/信息。

+0

谢谢,但我想使它可以代替使用准备好的国际象棋游戏 – Arash 2010-10-06 10:09:46

+0

@arash:你也可以从人们的源代码中学习。 – menjaraz 2011-12-11 15:31:44

+0

链接被破坏.... – 2017-05-22 18:33:10

2

这是末尾游戏数据库的最简单可能的示例。有不到64^3 = 262144的职位,所以你可以很容易地存储每个职位的分数。在这种情况下,我们可以将得分定义为对于获胜位置的移动数量,或255为一个绘制的位置。这里是一个轮廓:

  1. 将所有分数255
  2. 查找所有击破的位置,并且其得分为0。
  3. 组深度= 1
  4. 对于每个绘制位置(得分= 255),看移动是否存在于胜利的位置(更准确地说,看移动是否存在于所有对手移动失败的位置)。如果是,则将其得分设置为深度。
  5. 如果在第4步中找不到新的职位,就完成了。
  6. 增量深度,并转到步骤4

现在你有一个25万的表,你可以保存到磁盘(不,应该采取多种秒钟从头生成它)。如果空间很重要,可以通过各种技巧显着减少这种情况。维基百科有关这一切的好文章 - 搜索“Endgame tablebase”。

0

这里的海报表明干鱼是一个很好的开始,但它是一个C++项目,而您正在寻求C#。

解决方案取决于您的要求。如果你对“只是使它工作”感兴趣,你可以在不写200多行代码的情况下完成这个项目。您可以嵌入一个开源的C#项目,并要求引擎向您报告要配对的移动次数。如果开源项目是UCI支持,下面的命令将做的工作:

go mate x 

其中x为移动到交配的数量。

但是,如果你需要自己去思考。您将需要在高效的位图板或面向对象的表示之间进行选择。 Bitboard是一个更好的代表,它非常快但很难编程。所有象棋引擎都使用翘板。在你的项目中,代表效率并不太受关注,所以你可以选择面向对象代表。

+0

谢谢,但我想使它本身,而不是使用准备好的国际象棋游戏 – Arash 2010-10-06 10:10:06

0

我找到了this关于SO的有趣答案。它可能会帮助你。