Pausing now possible during AI turns

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@469 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Bennet Gerlach 2011-06-18 23:06:06 +02:00
parent 1bddf11ce0
commit 92bea55251
2 changed files with 61 additions and 35 deletions

View file

@ -21,10 +21,13 @@ import jrummikub.util.Pair;
*/ */
public class AIControl extends AbstractTurnControl { public class AIControl extends AbstractTurnControl {
private TurnLogic logic; private TurnLogic logic;
private boolean turnDone = false;
boolean useBackgroundThread = true; boolean useBackgroundThread = true;
long startTime; long startTime;
private boolean isPaused = false;
private boolean turnDone = false;
private boolean readyToEmit = false;
@Override @Override
public void startTurn() { public void startTurn() {
timer.startTimer(); timer.startTimer();
@ -32,10 +35,26 @@ public class AIControl extends AbstractTurnControl {
compute(); compute();
} }
@Override
protected void timeOut() { protected void timeOut() {
executeTurn(); executeTurn();
} }
@Override
protected void pauseTurn() {
super.pauseTurn();
isPaused = true;
}
@Override
protected void resumeTurn() {
super.resumeTurn();
isPaused = false;
if (readyToEmit) {
emitEndOfTurn();
}
}
@Override @Override
protected void cleanUp() { protected void cleanUp() {
if (logic != null) if (logic != null)
@ -44,36 +63,13 @@ public class AIControl extends AbstractTurnControl {
super.cleanUp(); super.cleanUp();
} }
private void emitEndOfTurn() {
turnDone = true;
long turnLength = System.currentTimeMillis() - startTime;
if (useBackgroundThread) {
Timer timer = new Timer(Math.max(0,
(int) (1000 + Math.random() * 2000 - turnLength)),
new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
cleanUp();
endOfTurnEvent.emit();
}
});
timer.setRepeats(false);
timer.start();
} else {
cleanUp();
endOfTurnEvent.emit();
}
}
private void compute() { private void compute() {
switch (turnInfo.getTurnMode()) { switch (turnInfo.getTurnMode()) {
case MAY_REDEAL: case MAY_REDEAL:
emitEndOfTurn(); endTurn();
break; break;
case INSPECT_ONLY: case INSPECT_ONLY:
emitEndOfTurn(); endTurn();
break; break;
case NORMAL_TURN: case NORMAL_TURN:
turn(); turn();
@ -157,24 +153,23 @@ public class AIControl extends AbstractTurnControl {
for (StoneSet set : result) { for (StoneSet set : result) {
turnInfo.getTable().drop( turnInfo.getTable().drop(
set, set,
new Position(10 * (Math.random() * 2 - 1), 5 * (Math new Position(10 * (Math.random() * 2 - 1),
.random() * 2 - 1))); 5 * (Math.random() * 2 - 1)));
for (Stone stone : set) { for (Stone stone : set) {
turnInfo.getHand().pickUp(stone); turnInfo.getHand().pickUp(stone);
} }
} }
} }
emitEndOfTurn(); endTurn();
} }
private void doNotMoveExistingSets(List<StoneSet> result) { private void doNotMoveExistingSets(List<StoneSet> result) {
outerLoop: for (Iterator<Pair<StoneSet, Position>> it = turnInfo outerLoop: for (Iterator<Pair<StoneSet, Position>> it = turnInfo.getTable()
.getTable().iterator(); it.hasNext();) { .iterator(); it.hasNext();) {
Pair<StoneSet, Position> pair = it.next(); Pair<StoneSet, Position> pair = it.next();
setSearch: for (Iterator<StoneSet> it2 = result.iterator(); it2 setSearch: for (Iterator<StoneSet> it2 = result.iterator(); it2.hasNext();) {
.hasNext();) {
StoneSet set = it2.next(); StoneSet set = it2.next();
if (set.getSize() != pair.getFirst().getSize()) { if (set.getSize() != pair.getFirst().getSize()) {
continue; continue;
@ -191,6 +186,37 @@ public class AIControl extends AbstractTurnControl {
} }
} }
private void endTurn() {
turnDone = true;
long turnLength = System.currentTimeMillis() - startTime;
if (useBackgroundThread) {
Timer timer = new Timer(Math.max(0,
(int) (1000 + Math.random() * 2000 - turnLength)),
new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
emitEndOfTurn();
}
});
timer.setRepeats(false);
timer.start();
} else {
emitEndOfTurn();
}
}
private void emitEndOfTurn() {
readyToEmit = true;
if (isPaused) {
return;
}
cleanUp();
endOfTurnEvent.emit();
}
/** /**
* Get the factory for the base AI control * Get the factory for the base AI control
* *

View file

@ -34,12 +34,12 @@ public abstract class AbstractTurnControl implements ITurnControl {
return redealEvent; return redealEvent;
} }
private void pauseTurn() { protected void pauseTurn() {
timer.stopTimer(); timer.stopTimer();
view.enablePauseMode(true); view.enablePauseMode(true);
} }
private void resumeTurn() { protected void resumeTurn() {
timer.startTimer(); timer.startTimer();
view.enablePauseMode(false); view.enablePauseMode(false);
} }