井字棋建议走法
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
(玩家二的胜利)。对于非叶节点,某个着法的值是其值的最大值(或最小值,取决于哪个玩家的着法)。这个定义是递归计算的;该算法然后会建议具有最大值或最小值的移动。
无法更改的内容:
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
(玩家二的胜利)。对于非叶节点,某个着法的值是其值的最大值(或最小值,取决于哪个玩家的着法)。这个定义是递归计算的;该算法然后会建议具有最大值或最小值的移动。