package com.lunivore.noughtsandcrosses.game;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GameModel implements Game {
private Map<Coord, Player> map = new HashMap<Coord, Player>();
private Player currentPlayer = Player.X;
private List<GameObserver> observers = new ArrayList<GameObserver>();
public void addObserver(GameObserver observer) {
observers.add(observer);
observer.gameChanged(this);
}
public void playerActsAt(int column, int row) {
map.put(new Coord(column, row), currentPlayer);
if (gameWon()) {
notifyObserversGameWon();
} else {
nextPlayer();
notifyObserversGameChanged();
}
}
private void notifyObserversGameWon() {
for (GameObserver observer : observers) {
observer.gameWon(this);
}
}
private boolean gameWon() {
for (WinningScenario scenario : WinningScenario.values()) {
if(scenario.isAchievedIn(map)) {
return true;
}
}
return false;
}
private void notifyObserversGameChanged() {
for (GameObserver observer : observers) {
observer.gameChanged(this);
}
}
private void nextPlayer() {
currentPlayer = currentPlayer == Player.X ? Player.O : Player.X;
}
public Player playerAt(int column, int row) {
Player player = map.get(new Coord(column, row));
return player == null ? Player.NONE : player;
}
public Player currentPlayer() {
return currentPlayer;
}
}