我有一个完整的tic tac toe游戏板。这是3 x 3.我不是真的要求代码(虽然这会有所帮助),但是哪种算法最适合看谁赢了?另一种表达它的方法是,我应该研究哪些算法对于看谁赢了会很有用?
唯一真正想到的是蛮力。只是测试所有可能性,但我知道必须有更好的方法。
答案 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足够小,以至于有效的算法不会影响性能。