From 061e7ab305cd6eb16b8ea35987b30a838386ddee Mon Sep 17 00:00:00 2001 From: Bennet Gerlach Date: Tue, 31 May 2011 04:56:09 +0200 Subject: Base AI is now able to meld initially properly git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@346 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/control/turn/BaseAIControl.java | 75 +++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 9 deletions(-) (limited to 'src/jrummikub/control/turn/BaseAIControl.java') 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 entry : hand){ + Stone stone = entry.getFirst(); + if (stone.getValue() == target.getValue() && stone.getColor() == target.getColor()) { + return stone; + } + } + for(Pair 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 stones = new ArrayList(); + + for (Pair entry : hand) { + stones.add(entry.getFirst()); + } + + Pair, Integer>, Integer> counts = AIUtil + .countStones(stones); + + AIUtil aiUtil = new AIUtil(settings); + + Pair, 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 handStones = new ArrayList(); + 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(); + } } }); } -- cgit v1.2.3