我找到了这个有效的解决方案:
private int[] winningPatterns = { 0b111000000, 0b000111000, 0b000000111, // rows
0b100100100, 0b010010010, 0b001001001, // cols
0b100010001, 0b001010100 // diagonals
};
/** Returns true if thePlayer wins */
private boolean hasWon(int thePlayer) {
int pattern = 0b000000000; // 9-bit pattern for the 9 cells
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 3; ++col) {
if (cells[row][col].content == thePlayer) {
pattern |= (1 << (row * 3 + col));
}
}
}
for (int winningPattern : winningPatterns) {
if ((pattern & winningPattern) == winningPattern)
return true;
}
return false;
}
但我想知道使用图形逻辑是否有更优雅的解决方案。
更新:我也在研究在3x3电路板的不同和更大变体中使用我的知识,我相信这种方法在美学上不能很好地扩展。
答案 0 :(得分:2)
对于一个25乘25的董事会,我认为你所拥有的方法是可行的,但有一些改进方法如下:
在用户添加片段时创建模式,因为这样只需要花费时间来通过winnerPatterns数组。
要改进第二部分,您可以尝试更有效地存储它。以一种可以同时检查其中多个的方式存储中奖图像。 例如,如果第一个位置为0,那么它可以从winnerPatterns中删除3种可能性而不是仅仅一个(111 000 000,100 100 100,100 010 001)。
您可以通过检查具有最高概率的位置来改善平均情况。例如,玩家可以通过4种方式将棋子放在中间位置获胜,因此请检查该顺序。
如果您将玩家位置存储在单独的数组中,其中p1Tiles和p2Tiles。然后,这可能会大大增加平均情况,因为大多数时间董事会将相当空。在电路板重置之前,这个游戏只有1个实例。
你实际上并不需要检查玩家赢得的所有棋子你只需要检查当前用户所放置的棋子是否胜利。因此,使用这种方法,您只需要检查最坏情况下的其他12个点,即使电路板的尺寸为99..999到99..999。 (12因为当前插槽周围的所有插槽都有PLUS,如果有两个相同的颜色彼此相邻,那么你必须看下面的插槽)