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:
parent
1bddf11ce0
commit
92bea55251
2 changed files with 61 additions and 35 deletions
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue