/**
* Muehlegame
* Copyright (c) 2015, Thomas Ammann, Johannes Finckh
*
* @author Thomas Amann, Johannes Finckh
* @version 1.0
*/
package controller.impl;
import com.google.inject.Inject;
import controller.IController;
import controller.IGamefieldGraphAdapter;
import model.IPlayer;
import model.impl.Player;
import observer.IObservable;
import observer.IObserver;
import java.util.ArrayList;
import java.util.List;
public class Controller implements IController, IObservable {
private static final int MINSTONES = 3;
private static final int ANZSTONESGES = 18;
private static final int STONESPLAYER = 9;
private static final int SLEEPTIME = 5500;
private final List<IObserver> observers = new ArrayList<IObserver>();
private IGamefieldGraphAdapter gamefield;
private IPlayer player1, player2, current;
private int stonesPlayer1, settedStonesPlayer1;
private int stonesPlayer2, settedStonesPlayer2;
private int settedStones;
private String playerWon;
private int currentStoneToDelete;
private int selected;
@Inject
public Controller(IGamefieldGraphAdapter pGamefield) {
this.gamefield = pGamefield;
this.player1 = new Player("Player1", 'w');
this.player2 = new Player("Player2", 's');
this.stonesPlayer1 = STONESPLAYER;
this.stonesPlayer2 = STONESPLAYER;
this.current = this.player1;
this.settedStones = 0;
this.playerWon = "";
this.currentStoneToDelete = 0;
this.selected = 0;
this.settedStonesPlayer1 = 0;
this.settedStonesPlayer2 = 0;
}
@Override
public boolean setStone(int vertex) {
boolean temp = gamefield.setStone(vertex, getCurrentPlayerColor());
if (temp) {
settedStones++;
this.incSettedStonesPlayer();
this.getAnzClosedMills(vertex);
this.updateObservers(vertex);
}
return temp;
}
@Override
public int getSettedStonesPlayer1() {
return this.settedStonesPlayer1;
}
@Override
public int getSettedStonesPlayer2() {
return this.settedStonesPlayer2;
}
private void incSettedStonesPlayer() {
if (current.equals(player1)) {
this.settedStonesPlayer1++;
} else {
this.settedStonesPlayer2++;
}
}
@Override
public char getVertexColor(int vertex) {
return gamefield.getColor(vertex);
}
@Override
public boolean moveStone(int vertex) {
if (selected == 0) {
if ((this.getVertexColor(vertex) == 'n') || (this.getVertexColor(vertex) != current.getColor())) {
return false;
}
this.selected = vertex;
return true;
} else if (selected == vertex) {
return false;
} else {
boolean temp = this.moveStone(selected, vertex);
this.selected = 0;
return temp;
}
}
@Override
public boolean moveStone(int start, int end) {
boolean temp = gamefield.move(start, end, this.getCurrentPlayerColor());
if (temp) {
this.getAnzClosedMills(end);
this.updateObservers(end);
}
return temp;
}
@Override
public boolean removeStone(int vertex) {
char colorVertex = gamefield.getColor(vertex);
if (colorVertex == current.getColor()) {
return false;
}
boolean temp = gamefield.removeStone(vertex);
if (temp) {
this.decStonesPlayer(colorVertex);
}
return temp;
}
private void decStonesPlayer(char color) {
if (color == 'w') {
this.stonesPlayer2--;
} else if (color == 's') {
this.stonesPlayer1--;
}
}
@Override
public int getAnzClosedMills(int vertex) {
this.currentStoneToDelete = gamefield.numberOfMills(vertex, this.getCurrentPlayerColor());
return this.currentStoneToDelete;
}
@Override
public boolean gameEnded() {
if (this.stonesPlayer1 < MINSTONES) {
this.playerWon = this.player2.getName();
return true;
} else if (this.stonesPlayer2 < MINSTONES) {
this.playerWon = this.player1.getName();
return true;
}
return false;
}
@Override
public String getWinningPlayer() {
return this.playerWon;
}
@Override
public boolean requireInitial() {
return (settedStones != ANZSTONESGES);
}
@Override
public String getCurrentPlayerName() {
return current.getName();
}
@Override
public void setNextPlayer() {
if (current.equals(player1)) {
current = player2;
} else {
current = player1;
}
}
@Override
public char getCurrentPlayerColor() {
return current.getColor();
}
@Override
public void millDeleteStone(int vertex) {
if (this.removeStone(vertex)) {
this.currentStoneToDelete--;
}
this.updateObservers(vertex);
}
@Override
public int getCurrentStonesToDelete() {
return this.currentStoneToDelete;
}
@Override
public void registerObserver(IObserver observer) {
observers.add(observer);
}
@Override
public void unregisterObserver(IObserver observer) {
observers.remove(observer);
}
@Override
public void updateObservers(int vertex) {
if (this.currentStoneToDelete == 0) {
this.setNextPlayer();
}
for (IObserver observer : observers) {
observer.update(current, this.currentStoneToDelete, this.gameEnded());
}
if (this.gameEnded()) {
endThread ende = new endThread();
ende.start();
}
}
class endThread extends Thread {
public void run() {
try {
sleep(SLEEPTIME);
} catch (InterruptedException e) {
}
System.exit(0);
}
}
}