我正在为Tic-Tac-Toe游戏设计我的实施策略.由于这是我的第一个游戏实现,我有点困惑,需要一些通用指针.
现在,Tic-Tac-Toe中的获胜组合总数为8.目前,我计划将这些获胜组合存储在一个阵列中.一旦最终用户进行了至少3次移动,我将通过比较Player对阵此阵列的当前位置来开始检查玩家是否赢得了游戏.但是,我确信这不是检查玩家是否有获胜组合的有效方法.
任何人都可以建议我如何设计游戏的逻辑?
Jul*_*eau 11
不要担心效率.我写了一个回溯解决方案,只有549,945个可能的游戏状态.在笔记本电脑上运行这些操作只需不到0.25秒.这是我的逻辑,看看游戏是否结束 - 显然效率不高,但无所谓:
private boolean isWinningMove(int row, int col) {
int piece = board[row][col];
// check current row
boolean w = true;
for (int x = 0; x < 3; x++) { w = w && (board[row][x] == piece); }
if (w) { return true; }
// check current column
w = true;
for (int x = 0; x < 3; x++) { w = w && (board[x][col] == piece); }
if (w) { return true; }
// check 0,0 diagonal
w = true;
for (int x = 0; x < 3; x++) { w = w && (board[x][x] == piece); }
if (w) { return true; }
// check 0,2 diagonal
w = true;
for (int x = 0; x < 3; x++) { w = w && (board[x][2 - x] == piece); }
return w;
}
Run Code Online (Sandbox Code Playgroud)
以下是我的结果,它与维基百科页面上的数据匹配:tic-tac-toe:
Moves Simulated: 549945
Draws=46080 Player1-Wins=131184 Player2-Wins=77904
Perfect Strategy Implies: Always a tie.
Games won in 0 moves? 0
Games won in 1 moves? 0
Games won in 2 moves? 0
Games won in 3 moves? 0
Games won in 4 moves? 0
Games won in 5 moves? 1440
Games won in 6 moves? 5328
Games won in 7 moves? 47952
Games won in 8 moves? 72576
Games won in 9 moves? 81792
Run Code Online (Sandbox Code Playgroud)
由于井字游戏的状态空间非常小,你可以存储所有可能的最终游戏位置,并使用旋转,但我认为你会稍微过度思考它.
而不是为游戏板存储3x3阵列,使用7x7阵列,游戏板最内部为3x3.你应该至少有三个值,每个方格可以代表 - 像PLAYER_1,PLAYER_2和NONE.最初,所有值都应设置为NONE.然后,在每个玩家的移动之后,检查所选择的正方形周围的所有3个; 上面2个,下面2个,左边2个,右边2个,左上角2个,右下角2个,右上角2个,左下角2个.
为什么7x7阵列?使用7x7阵列,您可以安全地从3x3区域的任何方向搜索所有方向,而无需if语句查看您是否从阵列的边缘走开.董事会将如下所示:
0 1 2 3 4 5 6 0 * * * * * * * 1 * * * * * * * 2 * * * * * * * 3 * * * * * * * 4 * * * * * * * 5 * * * * * * * 6 * * * * * * *
例如,如果第一个玩家移动到tic-tac-toe板上的0,0,则与在7x7板上移动到2,2相同.进行移动时,您将在2,2平方左右进行检查以查看一行中是否有三个具有相同值的正方形
由于3x3板周围的方块带总是具有该值NONE,因此它们永远不会触发获胜条件.
如果其中任何一个都匹配相同的玩家价值(例如第一个玩家的PLAYER_1),则游戏结束并获胜.否则,如果所有方格都被拍摄,那么游戏就是平局.
我过去曾将它用于其他类似游戏,效果很好.