AIUtil now needs game settings, both hand and player do not anymore
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@342 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
278edc37a9
commit
d276b03c39
10 changed files with 140 additions and 137 deletions
|
@ -7,18 +7,33 @@ import java.util.Comparator;
|
|||
import java.util.List;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import jrummikub.model.GameSettings;
|
||||
import jrummikub.model.Stone;
|
||||
import jrummikub.model.StoneColor;
|
||||
import jrummikub.model.StoneSet;
|
||||
import jrummikub.util.Pair;
|
||||
|
||||
/**
|
||||
* A collection of several AI utility methods
|
||||
* A collection of several AI utility methods with given game settings
|
||||
*
|
||||
*/
|
||||
public class AIUtil {
|
||||
|
||||
private AIUtil() {
|
||||
GameSettings settings;
|
||||
List<StoneColor> stoneColors;
|
||||
|
||||
/**
|
||||
* The utility class's methods calculate their results based on the game
|
||||
* settings
|
||||
*
|
||||
* @param settings
|
||||
* the underlying game settings
|
||||
*/
|
||||
public AIUtil(GameSettings settings) {
|
||||
this.settings = settings;
|
||||
|
||||
stoneColors = new ArrayList<StoneColor>(Arrays.asList(StoneColor.values()));
|
||||
stoneColors.retainAll(settings.getStoneColors());
|
||||
}
|
||||
|
||||
private static class SearchState {
|
||||
|
@ -47,7 +62,7 @@ public class AIUtil {
|
|||
* @return the sets that have the desired point total or the highest found
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Pair<List<StoneSet>, Integer> findSetsWithTotalPoints(
|
||||
public Pair<List<StoneSet>, Integer> findSetsWithTotalPoints(
|
||||
int pointsMissing,
|
||||
TreeMap<Pair<Integer, StoneColor>, Integer> stoneCounts, int jokerCount) {
|
||||
|
||||
|
@ -63,14 +78,13 @@ public class AIUtil {
|
|||
bestResult = new Pair<List<StoneSet>, Integer>(
|
||||
Collections.<StoneSet> emptyList(), 0);
|
||||
|
||||
for (int value = 13; value >= 1; value--) {
|
||||
for (StoneColor color : StoneColor.values()) {
|
||||
for (int value = settings.getHighestValue(); value >= 1; value--) {
|
||||
for (StoneColor color : stoneColors) {
|
||||
Pair<Integer, StoneColor> stone = new Pair<Integer, StoneColor>(value,
|
||||
color);
|
||||
|
||||
if (stoneCounts.containsKey(stone)) {
|
||||
decrementStoneCount(stoneCounts, stone);
|
||||
|
||||
result = findRunsWithTotalPoints(new SearchState(pointsMissing
|
||||
- value, stoneCounts, jokerCount), stone, 1);
|
||||
if (result.getSecond() >= pointsMissing)
|
||||
|
@ -109,7 +123,7 @@ public class AIUtil {
|
|||
return bestResult;
|
||||
}
|
||||
|
||||
private static Pair<List<StoneSet>, Integer> findGroupsWithTotalPoints(
|
||||
private Pair<List<StoneSet>, Integer> findGroupsWithTotalPoints(
|
||||
SearchState searchState, int value, List<StoneColor> chosenColors,
|
||||
StoneColor testedColor) {
|
||||
|
||||
|
@ -175,7 +189,7 @@ public class AIUtil {
|
|||
return bestResult;
|
||||
}
|
||||
|
||||
private static Pair<List<StoneSet>, Integer> findRunsWithTotalPoints(
|
||||
private Pair<List<StoneSet>, Integer> findRunsWithTotalPoints(
|
||||
SearchState searchState, Pair<Integer, StoneColor> testedStone,
|
||||
int runLength) {
|
||||
|
||||
|
@ -262,12 +276,12 @@ public class AIUtil {
|
|||
}
|
||||
}
|
||||
|
||||
static StoneColor getNextColor(StoneColor color) {
|
||||
int index = Arrays.binarySearch(StoneColor.values(), color) + 1;
|
||||
if (index >= StoneColor.values().length) {
|
||||
StoneColor getNextColor(StoneColor color) {
|
||||
int index = stoneColors.indexOf(color) + 1;
|
||||
if (index >= stoneColors.size()) {
|
||||
return null;
|
||||
}
|
||||
return StoneColor.values()[index];
|
||||
return stoneColors.get(index);
|
||||
}
|
||||
|
||||
private final static Comparator<Pair<Integer, StoneColor>> comparator = new Comparator<Pair<Integer, StoneColor>>() {
|
||||
|
|
|
@ -43,9 +43,9 @@ public class RoundControl {
|
|||
* Create a new RoundControl using the given gameState and view
|
||||
*
|
||||
* @param roundState
|
||||
* initial round state
|
||||
* initial round state
|
||||
* @param view
|
||||
* view used for user interaction
|
||||
* view used for user interaction
|
||||
*/
|
||||
public RoundControl(IRoundState roundState, IView view) {
|
||||
this.roundState = roundState;
|
||||
|
@ -89,10 +89,10 @@ public class RoundControl {
|
|||
}
|
||||
|
||||
view.getTablePanel().setStoneSets(clonedTable);
|
||||
view.setCurrentPlayerName(roundState.getActivePlayer()
|
||||
.getPlayerSettings().getName());
|
||||
view.setCurrentPlayerColor(roundState.getActivePlayer()
|
||||
.getPlayerSettings().getColor());
|
||||
view.setCurrentPlayerName(roundState.getActivePlayer().getPlayerSettings()
|
||||
.getName());
|
||||
view.setCurrentPlayerColor(roundState.getActivePlayer().getPlayerSettings()
|
||||
.getColor());
|
||||
view.setHasLaidOut(roundState.getActivePlayer().getLaidOut());
|
||||
|
||||
if (!isHuman)
|
||||
|
@ -106,15 +106,14 @@ public class RoundControl {
|
|||
.getTurnControlType() == HUMAN;
|
||||
boolean inspectOnly = roundState.getTurnNumber() < 1;
|
||||
boolean mayRedeal = inspectOnly
|
||||
&& roundState.getActivePlayer().getHand()
|
||||
.getIdenticalStoneCount() >= 3;
|
||||
&& roundState.getActivePlayer().getHand().getIdenticalStoneCount() >= 3;
|
||||
|
||||
if (isHuman) {
|
||||
view.getPlayerPanel().setEndTurnMode(inspectOnly, mayRedeal);
|
||||
}
|
||||
turnControl = TurnControlFactory.getFactory(
|
||||
roundState.getActivePlayer().getPlayerSettings()
|
||||
.getTurnControlType()).create();
|
||||
roundState.getActivePlayer().getPlayerSettings().getTurnControlType())
|
||||
.create();
|
||||
turnControl.setup(roundState.getActivePlayer(), clonedTable, view,
|
||||
inspectOnly, mayRedeal);
|
||||
turnControl.getEndOfTurnEvent().add(new IListener() {
|
||||
|
@ -136,10 +135,8 @@ public class RoundControl {
|
|||
void deal() {
|
||||
for (int i = 0; i < roundState.getPlayerCount(); i++) {
|
||||
IHand hand = roundState.getNthNextPlayer(i).getHand();
|
||||
for (int j = 0; j < roundState.getGameSettings()
|
||||
.getNumberOfStonesDealt(); j++) {
|
||||
hand.drop(roundState.getGameHeap().drawStone(), new Position(0,
|
||||
0));
|
||||
for (int j = 0; j < roundState.getGameSettings().getNumberOfStonesDealt(); j++) {
|
||||
hand.drop(roundState.getGameHeap().drawStone(), new Position(0, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -150,13 +147,11 @@ public class RoundControl {
|
|||
|
||||
int totalValue = 0;
|
||||
for (StoneSet set : newSets) {
|
||||
totalValue += set.classify(roundState.getGameSettings())
|
||||
.getSecond();
|
||||
totalValue += set.classify(roundState.getGameSettings()).getSecond();
|
||||
}
|
||||
|
||||
return totalValue == 0
|
||||
|| totalValue >= roundState.getGameSettings()
|
||||
.getInitialMeldThreshold();
|
||||
|| totalValue >= roundState.getGameSettings().getInitialMeldThreshold();
|
||||
}
|
||||
|
||||
private void endOfTurn() {
|
||||
|
@ -195,8 +190,7 @@ public class RoundControl {
|
|||
}
|
||||
if (!roundState.getActivePlayer().getLaidOut()) {
|
||||
// Player touched forbidden stones
|
||||
if (!tableSetDifference(clonedTable, roundState.getTable())
|
||||
.isEmpty()) {
|
||||
if (!tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) {
|
||||
rejectMove();
|
||||
return;
|
||||
}
|
||||
|
@ -205,8 +199,7 @@ public class RoundControl {
|
|||
return;
|
||||
}
|
||||
}
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(), clonedTable);
|
||||
|
||||
roundState.setTable(clonedTable);
|
||||
|
||||
|
@ -222,8 +215,7 @@ public class RoundControl {
|
|||
}
|
||||
|
||||
private void rejectMove() {
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(), clonedTable);
|
||||
// deal penalty, reset
|
||||
roundState.getGameHeap().putBack(tableDiff);
|
||||
dealPenalty(tableDiff.size());
|
||||
|
@ -310,13 +302,13 @@ public class RoundControl {
|
|||
int stonePoints = 0;
|
||||
|
||||
if (!player.getLaidOut()) {
|
||||
stonePoints = playerHand.isInitialMeldPossible() ? 200 : 100;
|
||||
stonePoints = playerHand.isInitialMeldPossible(roundState
|
||||
.getGameSettings()) ? 200 : 100;
|
||||
} else {
|
||||
stonePoints = playerHand.getStonePoints();
|
||||
stonePoints = playerHand.getStonePoints(roundState.getGameSettings());
|
||||
}
|
||||
|
||||
bestScore = updateBestScore(bestScore, -stonePoints,
|
||||
playerHand.getSize());
|
||||
bestScore = updateBestScore(bestScore, -stonePoints, playerHand.getSize());
|
||||
|
||||
points.add(-stonePoints);
|
||||
pointSum += stonePoints;
|
||||
|
|
Reference in a new issue