我有一个问题。我想写一个类似国际象棋的程序应用规则如下:
我想知道你对如何制作这个项目的想法。例如,我想知道哪种编写代码的方式更容易(面向对象或结构化......)(我有一些关于面向对象的信息)并且可以说我编写它的算法?例如,我应该从哪里开始编写代码?
答案 0 :(得分:2)
看一下这个问题(Programming a chess AI)。
从这个问题的答案来看,我认为这个C# Chess Game Starter Kit将是一个良好的开端,但我也会看到其他文章,以及一些有趣的历史/信息。
答案 1 :(得分:2)
这里的好消息是你的问题范围非常有限,因为你只有三件可以应对。在解决逻辑难题时,你并没有真正在这里实施游戏。我会这样做:
弄清楚如何以简单的方式表示这三个部分。你真的不需要这里的UI(除了测试),因为你只是想解决一个难题。最简单的方法可能是三个部分中每个部分的简单行,列位置。
如果您之前没有编写面向对象的程序,您可能希望坚持使用过程模型,只需为您需要表示的数据定义变量。问题的范围很小,所以你可以逃避这一点。如果你有一些OOP经验,你可以适当地分解问题,虽然你可能不需要任何继承关系。
编写用于生成可能移动的代码,并确定给定移动是否有意义。合法的国王行动是任何不检查国王的举动。大多数女王的举动应该是允许的,但你可能也想排除允许敌人国王夺走女王的动作。
现在你需要确定如何整理一系列可以解决难题的动作的策略。如果您需要找到真正的最佳解决方案(不仅仅是一个好的解决方案),您可能需要进行强力搜索。这对于这个问题可能是可行的。您可能希望执行深度优先搜索(如果您不知道这意味着什么,这是您研究的第一个主题),一旦找到可能的解决方案,就会限制所有其他解决方案必须达到的深度考虑。
如果你可以使蛮力发挥作用并且需要加快速度,那么考虑一下你是否有行动可以证明没有任何好处。如果是这样,您可以立即从搜索中排除这些移动,从而节省您需要考虑的分支数量。您还可以优化评估功能,因为当您进行数十亿次评估时,更快速的评估非常有用。最后,您可能会想出一些启发式方法来评估首先尝试哪些分支。您收敛到“良好”解决方案的速度越快,找到最佳解决方案时需要考虑的案例就越少。
一方面的注意事项我意识到,如果你认为敌人国王试图避免将死,那么问题就会大不相同。简单的深度优先修剪只有在你被允许以最好的方式移动敌人国王时才有效。如果敌人国王试图避免将死,那会使问题变得复杂,因为你的优化目标相互冲突(你希望它尽可能少地发生,但你的敌人国王想要尽可能地推迟。)你可能是仅限于表征一系列可能性(例如,如果King完全合作,那么最好的情况是3次移动,如果King完全回避,则移动最好的情况8次。)
答案 2 :(得分:2)
这是endgame数据库最简单的例子。有少于64 ^ 3 = 262144的位置,因此您可以轻松存储每个位置的得分。在这种情况下,我们可以将得分定义为获胜位置的移动数量;或255表示绘制位置。这是一个大纲:
现在你有一个可以保存到磁盘的250k表(不是说从头开始生成它需要很多秒)。如果空间很重要,你可以通过各种技巧大大降低这一点。维基百科有一篇关于这一切的好文章 - 搜索“Endgame tablebase”。
答案 3 :(得分:0)
这里的海报表明,Stockfish将是一个良好的开端,但它是一个C ++项目,而你要求的是C#。
解决方案取决于您的要求。如果您对“只是让它工作”感兴趣,您可以完成项目而无需编写超过200行代码。您可以嵌入一个开源C#项目,并要求引擎报告您要交配的移动次数。如果开源项目受UCI支持,则以下命令将执行此任务:
go mate x
其中x是要交配的移动次数。
但是,如果你需要自己思考。您需要在高效的位板或面向对象的表示之间进行选择。 Bitboard是一个更好的表示,它非常快,但编程更难。所有国际象棋引擎都使用位板。在你的项目中,代表效率不是太大关注,所以你可以选择OO代表。
答案 4 :(得分:0)
我在SO上找到了this有趣的答案。它可能对你有帮助。