diff options
Diffstat (limited to 'src/jrummikub/control/turn/BaseAIControl.java')
-rw-r--r-- | src/jrummikub/control/turn/BaseAIControl.java | 75 |
1 files changed, 66 insertions, 9 deletions
diff --git a/src/jrummikub/control/turn/BaseAIControl.java b/src/jrummikub/control/turn/BaseAIControl.java index fc1b97d..fbd9c75 100644 --- a/src/jrummikub/control/turn/BaseAIControl.java +++ b/src/jrummikub/control/turn/BaseAIControl.java @@ -2,13 +2,20 @@ package jrummikub.control.turn; import java.util.ArrayList; import java.util.List; +import java.util.TreeMap; import javax.swing.SwingUtilities; +import jrummikub.control.AIUtil; import jrummikub.control.ITurnTimer; import jrummikub.control.TurnTimer; +import jrummikub.model.Position; +import jrummikub.model.Stone; +import jrummikub.model.StoneColor; +import jrummikub.model.StoneSet; import jrummikub.util.Connection; import jrummikub.util.IListener; +import jrummikub.util.Pair; /** * Base class for AI players @@ -59,15 +66,61 @@ public class BaseAIControl extends AbstractTurnControl { if (mayRedeal) { emitRedeal(); } else { - if (player.getLaidOut()) { - layOut(); - } else { - emitEndOfTurn(); + turn(); + } + } + + private Stone findMatchingStone(Stone target) { + for(Pair<Stone, Position> entry : hand){ + Stone stone = entry.getFirst(); + if (stone.getValue() == target.getValue() && stone.getColor() == target.getColor()) { + return stone; + } + } + for(Pair<Stone, Position> entry : hand){ + Stone stone = entry.getFirst(); + if (stone.isJoker()) { + return stone; } } + return null; } - private void layOut() { + private Stone pickUpMatchingStone(Stone target) { + Stone match = findMatchingStone(target); + hand.pickUp(match); + return match; + } + + private void turn() { + List<Stone> stones = new ArrayList<Stone>(); + + for (Pair<Stone, Position> entry : hand) { + stones.add(entry.getFirst()); + } + + Pair<TreeMap<Pair<Integer, StoneColor>, Integer>, Integer> counts = AIUtil + .countStones(stones); + + AIUtil aiUtil = new AIUtil(settings); + + Pair<List<StoneSet>, Integer> result = aiUtil.findSetsWithTotalPoints( + Integer.MAX_VALUE, counts.getFirst(), counts.getSecond()); + + if (!player.getLaidOut() + && result.getSecond() < settings.getInitialMeldThreshold()) { + emitEndOfTurn(); + return; + } + + for (StoneSet set : result.getFirst()) { + List<Stone> handStones = new ArrayList<Stone>(); + for (Stone stone : set) { + handStones.add(pickUpMatchingStone(stone)); + } + table.drop(new StoneSet(handStones), new Position(0, 0)); + } + emitEndOfTurn(); } @@ -75,8 +128,10 @@ public class BaseAIControl extends AbstractTurnControl { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - cleanUp(); - redealEvent.emit(); + if (!stopRunning) { + cleanUp(); + redealEvent.emit(); + } } }); } @@ -98,8 +153,10 @@ public class BaseAIControl extends AbstractTurnControl { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - cleanUp(); - endOfTurnEvent.emit(); + if (!stopRunning) { + cleanUp(); + endOfTurnEvent.emit(); + } } }); } |