井字棋建议走法

TicTacToe suggested move

无法更改的内容:

enum CellLocation{TOP_LEFT,TOP_CENTER,TOP_RIGHT,CENTRE_LEFT, .. and so on}
enum CellState{OCCUPIED_BY_X,OCCUPIED_BY_O,EMPTY}

一个棋盘接口,只包含一个方法:

CellState getCellState(CellLocation cellLocation);

一个顾问接口,也包含一个方法:

CellLocation suggest(GameBoard gameBoard);

我的工作是创建一个 class 实现顾问界面并覆盖给定的建议方法(该方法还必须决定下一个玩家 -> Cellocation 输出必须具有 EMPTY 状态)

所以,我的问题是我不确定如何开始。我正在考虑在 suggest 方法中创建一个临时地图,并填充所有数据,如下所示:

HashMap<CellLocation, CellState> temporaryBoard = new HashMap<>();

temporaryBoard.put(CellLocation.TOP_LEFT,gameBoard.getCellState(CellLocation.TOP_LEFT));
temporaryBoard.put(CellLocation.TOP_CENTRE,gameBoard.getCellState(CellLocation.TOP_CENTRE));
temporaryBoard.put(CellLocation.TOP_RIGHT,gameBoard.getCellState(CellLocation.TOP_RIGHT));
temporaryBoard.put(CellLocation.CENTRE_LEFT,gameBoard.getCellState(CellLocation.CENTRE_LEFT));
temporaryBoard.put(CellLocation.CENTRE_CENTRE,gameBoard.getCellState(CellLocation.CENTRE_CENTRE));
temporaryBoard.put(CellLocation.CENTRE_RIGHT,gameBoard.getCellState(CellLocation.CENTRE_RIGHT));
temporaryBoard.put(CellLocation.BOTTOM_LEFT,gameBoard.getCellState(CellLocation.BOTTOM_LEFT));
temporaryBoard.put(CellLocation.BOTTOM_CENTRE,gameBoard.getCellState(CellLocation.BOTTOM_CENTRE));
temporaryBoard.put(CellLocation.BOTTOM_RIGHT,gameBoard.getCellState(CellLocation.BOTTOM_RIGHT));

所以我可以很容易地操作它。我不确定我是否应该为自己制作一个临时游戏板。

如有任何想法,我们将不胜感激。

这个问题还不是很清楚,但是如果需要实施来建议最佳可能的移动,这可以使用 Minimax 算法来完成,该算法旨在执行可能的移动(从而创建一个对另一个玩家来说可能移动较少的棋盘)并递归搜索游戏树,直到找到一片叶子。然后一片叶子在概念上被分配一个值 1(玩家一的胜利),0(平局游戏)或 -1(玩家二的胜利)。对于非叶节点,某个着法的值是其值的最大值(或最小值,取决于哪个玩家的着法)。这个定义是递归计算的;该算法然后会建议具有最大值或最小值的移动。