我想知道如何实现一个国际象棋引擎 。 有没有开源的实现? 看起来你需要一个给定棋盘星座的得分函数,以及探索几个未来棋盘星座的非常快速的方法。 探索所有可能的未来动作当然是不可能的,所以人们可以贪婪地遵循最有前途的动作,或者使用类似模拟退火的近似技术来概率地追踪可能的动作。 你认为这是在一个机器学习研究生项目的范围之内 – 假设有一个学生可以使用的开放源码实现,那么基本的东西就像返回给定数字的下一个可能的动作一样? 可能太难了? 让不同的团队在国际象棋引擎上工作,然后让他们相互对抗,这将是一个有趣的项目。
我一直在为即将到来的编程大赛练习,而我偶然发现了一个我完全不解的问题。 但是,我觉得这是一个我现在应该学习的概念,而不是交叉我的手指,它永远不会出现。 基本上,它处理棋盘上的骑士棋子。 给你两个input:开始位置和结束位置。 目标是计算并打印骑士可以到达目标位置的最短path。 我从来没有处理过最短path的事情,我甚至不知道从哪里开始。 我用什么逻辑来解决这个问题? PS如果它有任何相关性,他们希望你补充骑士的正常移动能力,同时允许它移动到骑士的移动path创build的广场的四个angular落,如果在董事会的中心。
不是严格的问题,更多的是一个难题 多年来,我参与了一些新员工的技术面试。 除了问标准“你知道X技术”这个问题之外,我还试图去了解他们如何解决问题。 通常情况下,我会在面试的前一天通过电子邮件向他们发送问题,并期待他们在第二天提出解决scheme。 结果往往是相当有趣的 – 错误的,但有趣的 – 如果他们能解释为什么他们采取了特定的方法,那么他仍然会得到我的build议。 所以我想我会为Stack Overflow观众提出我的一个问题。 问题: 如何编码国际象棋游戏(或其子集)的时候,可以考虑的最节省空间的方法是什么? 也就是说,如果棋盘上有合法排列的棋子,则编码这个初始状态以及游戏中玩家采取的所有后续合法行为。 答案不需要代码,只需要描述你将要使用的algorithm。 编辑:正如其中一个海报已经指出,我没有考虑到移动之间的时间间隔。 随意作为一个可选的额外的:) 编辑2:只是为了进一步澄清…请记住,编码器/解码器是规则感知。 真正需要存储的唯一东西是播放器的select – 编码器/解码器可以假定其他任何东西。 编辑3:这里将很难挑选一个胜利者:)很多伟大的答案!
我最近和一个非编码人讨论了国际象棋计算机的可能性。 我不是很懂理论,但是我觉得我知道的够多了。 我争辩说,不可能存在一个在国际象棋中总是赢得或僵持的确定性图灵机。 我认为,即使你search了所有的player1 / 2移动组合的整个空间,计算机在每个步骤所决定的单一移动都是基于启发式的。 基于启发式,它不一定会击败对手所能做的所有动作。 我的朋友认为,相反,如果一个电脑从来没有犯过“错误”的行为,那么电脑总是会赢的,但是你是怎么定义的呢? 但是,作为一个CS的程序员,我知道即使你的好select – 给一个明智的对手 – 也会迫使你最终做出“错误”的举动。 即使你知道所有的事情,你的下一步行动是贪婪匹配启发式。 大多数国际象棋电脑都试图将可能的最终游戏与正在进行的游戏进行匹配,这本质上是一个dynamic编程追踪。 同样,有争议的问题也是可以避免的。 编辑:嗯…看起来像我在这里吹了一些羽毛。 那很好。 再考虑一下,似乎没有解决象棋这样有限的游戏的理论问题。 我认为国际象棋比棋子要复杂一点,因为胜利不一定是棋子的数量耗尽,而是棋手。 我原来的主张可能是错误的,但是我想我已经指出了一些尚未被令人满意地证实的东西(正式的)。 我想我的想法是,只要树中的某个分支被占用,那么algorithm(或者记忆path)就必须find对手的path(没有交配),以便对手的任何可能的分支移动。 经过讨论后,我会买更多的回忆,所有这些path都可以find。
我对竞争性编程是新的,我经常注意到,许多伟大的编程人员在他们的代码中都有这四行(特别是涉及到数组): int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 }; int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 }; int diK[] = { -2, -2, -1, 1, 2, 2, 1, -1 }; int djK[] = { -1, 1, 2, 2, 1, -1, -2, -2 }; 这是什么意思?用什么技术?