summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/turn/BaseAIControl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/control/turn/BaseAIControl.java')
-rw-r--r--src/jrummikub/control/turn/BaseAIControl.java75
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();
+ }
}
});
}