package aima.core.environment.tictactoe; import java.util.List; import java.util.Objects; import aima.core.search.adversarial.Game; import aima.core.util.datastructure.XYLocation; /** * Provides an implementation of the Tic-tac-toe game which can be used for * experiments with the Minimax algorithm. * * @author Ruediger Lunde * */ public class TicTacToeGame implements Game<TicTacToeState, XYLocation, String> { TicTacToeState initialState = new TicTacToeState(); @Override public TicTacToeState getInitialState() { return initialState; } @Override public String[] getPlayers() { return new String[] { TicTacToeState.X, TicTacToeState.O }; } @Override public String getPlayer(TicTacToeState state) { return state.getPlayerToMove(); } @Override public List<XYLocation> getActions(TicTacToeState state) { return state.getUnMarkedPositions(); } @Override public TicTacToeState getResult(TicTacToeState state, XYLocation action) { TicTacToeState result = state.clone(); result.mark(action); return result; } @Override public boolean isTerminal(TicTacToeState state) { return state.getUtility() != -1; } @Override public double getUtility(TicTacToeState state, String player) { double result = state.getUtility(); if (result != -1) { if (Objects.equals(player, TicTacToeState.O)) result = 1 - result; } else { throw new IllegalArgumentException("State is not terminal."); } return result; } }