查看谁赢得了tic tac toe游戏的最佳算法

时间:2012-03-19 16:05:50

标签: java algorithm tic-tac-toe

我有一个完整的tic tac toe游戏板。这是3 x 3.我不是真的要求代码(虽然这会有所帮助),但是哪种算法最适合看谁赢了?另一种表达它的方法是,我应该研究哪些算法对于看谁赢了会很有用?

唯一真正想到的是蛮力。只是测试所有可能性,但我知道必须有更好的方法。

5 个答案:

答案 0 :(得分:12)

我最近(重新)学到的一个重要教训:当搜索空间足够小时,只需使用蛮力。

在3x3主板上有八个可能的获胜序列(行,列和对角线。)这样可以进行24次比较,以验证其中所有单元格中是否有相同的玩家标记。即使在非常慢的计算机上,24次比较也没有时间。

答案 1 :(得分:3)

这是最好的聪明最佳算法:(这是众所周知的技巧,所以我不夸耀,只有赞美算法)

定义:单元格的命名如下:

A31  A32  A33
A21  A22  A23
A11  A12  A13

这些碎片是W(海特)或B(缺乏)。有8种获胜组合:[A11,A12,A13],[A11,A21,A31],[A13,A22,A31]等。给每个组合命名:C1..C8。:

C1 =def= [A11,A12,A13]
C2 =def= [A21,A22,A23]
C3 =def= [A31,A32,A33]
C4 =def= [A11,A21,A31]
C5 =def= [A12,A22,A32]
C6 =def= [A13,A23,A33]
C7 =def= [A11,A22,A33]
C8 =def= [A13,A22,A31]

定义从单元格到一组获胜组合的映射:

A11 --> C1,C4,C7
A12 --> C1, C5
A22 --> C2, C5, C7, C8

因此,每个单元格A都指向那些包含A的组合。

为两位玩家保留一组可能的获胜组合。一开始,两个玩家都有8种组合。

Poss_W = C1, C2, C3, C4, C5, C6, C7, C8
Poss_B = C1, C2, C3, C4, C5, C6, C7, C8

当W在单元格A中播放时,从B中删除相应的获胜组合。例如,当白色播放A12时,从Black的可能获胜组合列表中删除C1,C5。

比赛结束后,拥有非空可能获胜组合的玩家获胜。如果Poss_W和Poss_B都是空的,那么游戏就是平局。

答案 2 :(得分:2)

只需使用地图diagonal -> number of checks in that diagonal即可。

当其中一个条目等于三个时,您就有了胜利者。

答案 3 :(得分:-1)

如果您必须在每个步骤后检查游戏是否结束,您可以缓存临时结果。

每行,每列和对角线存储每个玩家的标记数。在每个步骤后增加适当的值。如果数字为3,则表示您获胜。

答案 4 :(得分:-2)

如果不检查整个董事会状态,就无法确定胜利者。如果要在每个回合结束时执行检查,请遍历每个行,列和两个对角线,检查是否相等(例如:board[0][0] == board[1][0] == board[2][0]等)。如果你想在正在玩tic-tac-toe游戏的同时想要跟踪棋盘状态,你可以使用dynamic programming,虽然它是主要的过度杀伤力。如果您使用异常大的电路板,否则动态方法将非常有用,否则需要大量的步骤才能找到胜利者。值得注意的是,标准的tic-tac-toe足够小,以至于有效的算法不会影响性能。