diff options
Diffstat (limited to 'src/jrummikub')
-rw-r--r-- | src/jrummikub/control/RoundControl.java | 5 | ||||
-rw-r--r-- | src/jrummikub/control/turn/AbstractTurnControl.java | 12 | ||||
-rw-r--r-- | src/jrummikub/control/turn/BaseAIControl.java | 75 | ||||
-rw-r--r-- | src/jrummikub/control/turn/ITurnControl.java | 19 |
4 files changed, 87 insertions, 24 deletions
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java index 6a1befa..67c177f 100644 --- a/src/jrummikub/control/RoundControl.java +++ b/src/jrummikub/control/RoundControl.java @@ -114,8 +114,9 @@ public class RoundControl { turnControl = TurnControlFactory.getFactory( roundState.getActivePlayer().getPlayerSettings().getTurnControlType()) .create(); - turnControl.setup(roundState.getActivePlayer(), clonedTable, view, - inspectOnly, mayRedeal); + turnControl + .setup(roundState.getGameSettings(), roundState.getActivePlayer(), + clonedTable, view, inspectOnly, mayRedeal); turnControl.getEndOfTurnEvent().add(new IListener() { @Override public void handle() { diff --git a/src/jrummikub/control/turn/AbstractTurnControl.java b/src/jrummikub/control/turn/AbstractTurnControl.java index e493718..3c89708 100644 --- a/src/jrummikub/control/turn/AbstractTurnControl.java +++ b/src/jrummikub/control/turn/AbstractTurnControl.java @@ -1,5 +1,6 @@ package jrummikub.control.turn; +import jrummikub.model.GameSettings; import jrummikub.model.IHand; import jrummikub.model.IPlayer; import jrummikub.model.ITable; @@ -8,19 +9,19 @@ import jrummikub.util.IEvent; import jrummikub.view.IView; /** - * Abstract base class for TurnControls + * Abstract base class for TurnControls */ public abstract class AbstractTurnControl implements ITurnControl { protected Event endOfTurnEvent = new Event(); protected Event redealEvent = new Event(); + protected GameSettings settings; protected IPlayer player; protected IHand hand; protected ITable table; protected IView view; protected boolean inspectOnly; protected boolean mayRedeal; - @Override public IEvent getEndOfTurnEvent() { @@ -31,10 +32,11 @@ public abstract class AbstractTurnControl implements ITurnControl { public Event getRedealEvent() { return redealEvent; } - + @Override - public void setup(IPlayer player, ITable table, IView view, - boolean inspectOnly, boolean mayRedeal) { + public void setup(GameSettings settings, IPlayer player, ITable table, + IView view, boolean inspectOnly, boolean mayRedeal) { + this.settings = settings; this.player = player; this.hand = player.getHand(); this.table = table; 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(); + } } }); } diff --git a/src/jrummikub/control/turn/ITurnControl.java b/src/jrummikub/control/turn/ITurnControl.java index 5d0cd49..decd718 100644 --- a/src/jrummikub/control/turn/ITurnControl.java +++ b/src/jrummikub/control/turn/ITurnControl.java @@ -1,5 +1,6 @@ package jrummikub.control.turn; +import jrummikub.model.GameSettings; import jrummikub.model.IPlayer; import jrummikub.model.ITable; import jrummikub.util.Event; @@ -10,19 +11,21 @@ public interface ITurnControl { /** * Start the turn * - * @param hand - * active player's hand + * @param settings + * the game settings + * @param player + * the active player * @param table - * current table + * current table * @param view - * view for user interaction. + * view for user interaction. * @param inspectOnly - * the current turn doesn't allow any table manipulation + * the current turn doesn't allow any table manipulation * @param mayRedeal - * true when the current player may decide to redeal + * true when the current player may decide to redeal */ - public void setup(IPlayer player, ITable table, IView view, - boolean inspectOnly, boolean mayRedeal); + public void setup(GameSettings settings, IPlayer player, ITable table, + IView view, boolean inspectOnly, boolean mayRedeal); /** * Get the event that is emitted when the turn is over |