Fixed invalid moves without laying out stones and cleaned up rule
checks git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@259 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
9290db240a
commit
102299d0ff
2 changed files with 114 additions and 65 deletions
|
@ -108,85 +108,64 @@ public class RoundControl {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* after a legal move
|
||||
*
|
||||
* @return win or no win
|
||||
*/
|
||||
private boolean postLegalMove() {
|
||||
roundState.setTable(clonedTable);
|
||||
private boolean laidOutEnough() {
|
||||
List<StoneSet> newSets = tableSetDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
|
||||
if (roundState.getActivePlayer().getHand().getSize() == 0) {
|
||||
win();
|
||||
return true;
|
||||
int totalValue = 0;
|
||||
for (StoneSet set : newSets) {
|
||||
totalValue += set.classify().getSecond();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean notLaidOutYet(Set<Stone> tableDiff) {
|
||||
boolean win = false;
|
||||
if (tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) {
|
||||
// laid sthg out and didn't change table
|
||||
List<StoneSet> newSets = tableSetDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
|
||||
int totalValue = 0;
|
||||
for (StoneSet set : newSets) {
|
||||
totalValue += set.classify().getSecond();
|
||||
}
|
||||
|
||||
if (totalValue >= roundState.getGameSettings()
|
||||
.getInitialMeldThreshold()) {
|
||||
|
||||
roundState.getActivePlayer().setLaidOut(true);
|
||||
win = postLegalMove();
|
||||
return win;
|
||||
} else {
|
||||
// deal penalty, reset
|
||||
roundState.getGameHeap().putBack(tableDiff);
|
||||
dealPenalty(tableDiff.size());
|
||||
return win;
|
||||
}
|
||||
} else {
|
||||
// deal penalty, reset
|
||||
roundState.getGameHeap().putBack(tableDiff);
|
||||
dealPenalty(tableDiff.size());
|
||||
return win;
|
||||
}
|
||||
return totalValue >= roundState.getGameSettings()
|
||||
.getInitialMeldThreshold();
|
||||
}
|
||||
|
||||
private void endOfTurn() {
|
||||
checkTurn();
|
||||
roundState.nextPlayer();
|
||||
prepareTurn();
|
||||
}
|
||||
|
||||
private void checkTurn() {
|
||||
if (!clonedTable.isValid()) {
|
||||
rejectMove();
|
||||
return;
|
||||
}
|
||||
if (!roundState.getActivePlayer().getLaidOut()) {
|
||||
// Player touched forbidden stones
|
||||
if (!tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) {
|
||||
rejectMove();
|
||||
return;
|
||||
}
|
||||
if (!laidOutEnough()) {
|
||||
rejectMove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
|
||||
roundState.setTable(clonedTable);
|
||||
|
||||
if (tableDiff.isEmpty()) {
|
||||
// Player hasn't made a move
|
||||
if (clonedTable.isValid()) {
|
||||
roundState.setTable(clonedTable);
|
||||
}
|
||||
dealStone();
|
||||
} else {
|
||||
// Player has made a move
|
||||
if (!clonedTable.isValid()) {
|
||||
// deal penalty, reset
|
||||
roundState.getGameHeap().putBack(tableDiff);
|
||||
dealPenalty(tableDiff.size());
|
||||
} else {
|
||||
if (roundState.getActivePlayer().getLaidOut()) {
|
||||
// Player has laid out
|
||||
if (postLegalMove()) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Player hasn't laid out
|
||||
if (notLaidOutYet(tableDiff)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
roundState.getActivePlayer().setLaidOut(true);
|
||||
if (roundState.getActivePlayer().getHand().getSize() == 0) {
|
||||
win();
|
||||
}
|
||||
}
|
||||
roundState.nextPlayer();
|
||||
prepareTurn();
|
||||
}
|
||||
|
||||
private void rejectMove() {
|
||||
Set<Stone> tableDiff = tableDifference(roundState.getTable(),
|
||||
clonedTable);
|
||||
// deal penalty, reset
|
||||
roundState.getGameHeap().putBack(tableDiff);
|
||||
dealPenalty(tableDiff.size());
|
||||
|
||||
}
|
||||
|
||||
static Set<Stone> tableDifference(ITable oldTable, ITable newTable) {
|
||||
|
|
Reference in a new issue