package pdp.scrabble.ia.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import pdp.scrabble.dictionary.DAWGItf;
import pdp.scrabble.game.Bag;
import pdp.scrabble.game.Board;
import pdp.scrabble.game.GameEnvironment;
import pdp.scrabble.game.Player;
import pdp.scrabble.game.exception.BoardWrongWordPlace;
import pdp.scrabble.ia.AbstractAlgoStep;
import pdp.scrabble.ia.AbstractMoveGenStep;
import pdp.scrabble.ia.AbstractSimulationStep;
import pdp.scrabble.ia.MoveModel;
public class SimpleSimulator extends AbstractSimulationStep {
private int simulationDepth = 2;
private AbstractMoveGenStep generationAlgo;
public SimpleSimulator(AbstractAlgoStep previous, GameEnvironment env,
Player current) {
super(env, current, previous);
generationAlgo = new DawgMoveGen(environment, current,
(DAWGItf) env.getDictionary(),
new BestMoves(moves, new EvaluatorImpl(internalEnv, null), 1));
}
@Override
public int simulate(MoveModel move) {
/*TODO clone current player
/* create virtual opponent
/* for each simulation :
/* give him unseen letters
/* run simulation
/* get result
/* return average */
GameEnvironment localEnv = internalEnv.clone();
Player simPlayer = localEnv.getPlayer(usedPlayer.getID());
//filling opponents racks with unseen letters
for (Player p : localEnv.getPlayerList())
if (p.getID()!=simPlayer.getID())
p.getRack().fill();
//playing submitted move
move.play(localEnv.board(), simPlayer);
simPlayer.addScore(localEnv.board().getWordPoints());
try {
localEnv.board().validate(true);
} catch (BoardWrongWordPlace e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
simPlayer.getRack().fill();
//completing first turn
for (Player p : localEnv.getPlayerList()) {
if (p.getID()!=simPlayer.getID()) {
generationAlgo.generate(localEnv.board(), p.getRack());
generationAlgo.getBestMove().play(localEnv.board(), p);
p.addScore(localEnv.board().getWordPoints());
try {
localEnv.board().validate(true);
} catch (BoardWrongWordPlace e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//playing remaining turns
for (int i=0 ; i<simulationDepth ; i++) {
for (Player p : localEnv.getPlayerList()) {
generationAlgo.generate(localEnv.board(), p.getRack());
generationAlgo.getBestMove().play(localEnv.board(), p);
p.addScore(localEnv.board().getWordPoints());
try {
localEnv.board().validate(true);
} catch (BoardWrongWordPlace e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//computing point differences
Player first=localEnv.getPlayer((simPlayer.getID()==0?1:0));
for (Player p : localEnv.getPlayerList()) {
if (p!=simPlayer && p.getScore()>first.getScore())
first=p;
}
return simPlayer.getScore()-first.getScore();
}
}