package aima.gui.fx.applications.search.games;
import java.util.Observable;
import aima.core.environment.connectfour.ConnectFourAIPlayer;
import aima.core.environment.connectfour.ConnectFourGame;
import aima.core.environment.connectfour.ConnectFourState;
import aima.core.search.adversarial.IterativeDeepeningAlphaBetaSearch;
import aima.core.search.framework.Metrics;
/**
* Implements a facade for the game related classes of the Connect Four domain
* layer. It maintains game, current state, and a list of observers which are
* informed about every state change.
*
* @author Ruediger Lunde
*/
public class ConnectFourModel extends Observable {
private ConnectFourGame game;
private ConnectFourState currState;
Metrics searchMetrics;
private boolean enableLog;
public ConnectFourModel() {
game = new ConnectFourGame();
currState = (ConnectFourState) game.getInitialState();
}
public int getCols() {
return currState.getCols();
}
public int getRows() {
return currState.getRows();
}
public String[] getPlayers() {
return game.getPlayers();
}
public String getPlayerForNextMove() {
return game.getPlayer(currState);
}
public String getWinner() {
String result = null;
for (int i = 0; i < 2; i++)
if (game.getUtility(currState, game.getPlayers()[i]) == 1)
result = game.getPlayers()[i];
return result;
}
public String getPlayerAt(int row, int col) {
int playerNum = currState.getPlayerNum(row, col);
return playerNum > 0 ? game.getPlayer(playerNum) : null;
}
public boolean isWinPositionFor(int row, int col, String player) {
return currState.isWinPositionFor(row, col, game.getPlayerNum(player));
}
public void initGame() {
currState = game.getInitialState();
searchMetrics = null;
setChanged();
notifyObservers();
}
public boolean isGameOver() {
return game.isTerminal(currState);
}
public void makeMove(int col) {
currState = game.getResult(currState, col);
searchMetrics = null;
setChanged();
notifyObservers();
}
/** Uses adversarial search for selecting the next action. */
public void proposeMove(int time, int strategy) {
IterativeDeepeningAlphaBetaSearch<ConnectFourState, Integer, String> search;
if (strategy == 0)
search = IterativeDeepeningAlphaBetaSearch.createFor(game, 0.0, 1.0, time);
else
search = new ConnectFourAIPlayer(game, time);
if (enableLog)
search.setLogEnabled(true);
Integer action = search.makeDecision(currState);
searchMetrics = search.getMetrics();
currState = game.getResult(currState, action);
setChanged();
notifyObservers();
}
}