面临的挑战是用您选择的语言编写一个minimax函数,在给定当前棋盘状态的情况下,在井字游戏的NxN游戏中输出下一个最佳动作。板输入可以接受为矩阵,2D集合或对您有意义但符合规则的任何其他内容。输出是下一个最好的举动了谁轮到它是目前,其中X被认为已经开始。
Minimax算法的快速背景
minimax算法的基本思想是将所有可能的结果作为DAG枚举,然后通过一系列动作对玩家的好处(通过第一个动作为关键)对它们进行加权。然后,所有可能的结果都会在第一步中“丢包”,并根据所有结果的总和进行评分(-1为损失,0为平局,1为胜利)。在需要多个玩家参与的实现中,您需要枚举玩家的所有可能举动以及对手的所有可能的响应。例如,在井字游戏中(第一个举动之后),您可以进行8个可能的第一个举动,而在仅分析下一弯时,它们似乎都相等。但是,通过对每组可能产生最终结果的动作进行遍历所有可能的结果并将它们加总,
有关tic-tac-toe的mini-max算法的更好,更深入和上下文的摘要,请在此处阅读更多信息:http : //neverstopbuilding.com/minimax
XKCD(仅3x3解决方案)
规则
- 可以使用任何语言,但不允许使用外部minimax库。
- 输出可以是表示最佳下一移动的坐标(0-n,0-n)或数字(1-n * n)。
- 除此之外,您必须能够确定最佳情况是什么时候是失败或平局而不是获胜。
- 您表示损失或平局的方式再次取决于您。
- 输入必须使用传统的X和O,并且您必须假设X首先移动;空格可以用任何东西表示。
- 您可以假设进入程序的任何输入都具有n个O和n + 1个X,换句话说,您可以假设您得到的是格式良好的板。
- 开发板的当前状态必须是程序的唯一输入,如果使用递归,则必须使用辅助方法来满足输入要求。有关说明,请参见/codegolf//a/92851/59376。
- 必须支持10> = n> = 1的任何值。如果您的程序在n> 10时“超时”,我也认为这是可以接受的,因为某些语言的处理能力明显降低(尤其是使用面向Web的控制台)。
评判
- 这是代码高尔夫球,因此程序的最低字节数获胜,并且普遍禁止标准漏洞。
- 如果是平局,则支持最大n的程序将获胜。
输入示例
2x2
[[X,O]
[-,-]]
输出: 2或[0,1](也可以说是3或[1,1]正确)(以某种形式表示位置,只要可以方便地解释所使用的格式即可)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
输出: -1(损失)
再次允许使用您想要的任何输入格式,但必须使用X和O,所提供的示例并非旨在限制该格式,仅是为了启发。