我正在用Java编写一个tic-tac-toe游戏。
我有一个表示3乘3网格的2D数组,需要一种方法来检查是否设置了2位,这样可以通过添加第三位来形成3行。
我能想到这样做的唯一方法是沿着行迭代,检查空白区域,然后检查它周围的位,但这可能是混乱的代码。
任何提示和建议都表示赞赏!
答案 0 :(得分:0)
策略还可以 - 测试棋盘上的所有空白区域并计算分数,而三分之一是最高分,你可以停止寻找更好的解决方案。
无论是凌乱还是混乱,都在你手上。我非常确定可以为此策略提供可读的实现。想想自言自语的方法名称:
public Move bestMove(Board board) {
Score actualMax = new Score(Score.MINIMUM);
Move[] moves = findAllEmptyFields(board);
for (Move move:moves) {
Score actualScore = evaluateMoveForBoard(board, move);
if (actualScore.equals(Score.MAXIMUM) {
return move;
} else if (actualScore.higherThan(actualMax)) {
actualMax = actualScore;
}
}
return actualMax.getMove();
}
我虚构的Board类代表实际的tic-tac-toe board,我的Score类保留了该移动的得分以及此得分的移动。
令人困惑或可读?
答案 1 :(得分:0)
我会说不方便的迭代仍然是最直接的方式。 如果你仍然不想这样,我建议你看看有关位板的理论。 这是一种代表象棋,棋子和类似棋盘的方式,也许你可以在那里找到一些东西。
罗伯特凯悦在位板上写了几篇好文章,并在intertubes上自由发表。
答案 2 :(得分:0)
对于一个TTT板,你知道它总是3x3只是蛮力 - 它没有那么多的比较。
伪:
foreach row
if (col1 and col2 and not col3 OR col1 and not col2 and col3 OR not col1 and col2 and col3)
foreach col
if (row1 and row2 and not row3 OR row1 and not row2 and row3 OR not row1 and row2 and row3)
不要忘记为诊断添加两个检查。
答案 3 :(得分:0)
你总是可以为每个网格位置分配2位中的一位0 =空1 =玩家1 2 =玩家2.每次玩家移动时填写
1, 2 4, 8 16, 32
64, 128 256, 512 1024, 2048
4096, 8192 16384, 32768 65536, 131072
然后,您可以使用快速简单的按位检查来查看谁赢了。
要检查顶行,您需要检查位1 3和5.这可以通过获取整个按位值和&'ing with 1 |来完成。 4 |如果值不为零,则播放器1有一条线。要检查顶线上的玩家2,你需要2 | 8 |玩家1对角线将是1 | 256 | 65536或65281等等。