Fixed bug in AI (threw Internal AI Error, stones in hand weren't
solved) git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@464 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
ac3c13c50b
commit
0ada4609a0
1 changed files with 25 additions and 43 deletions
|
@ -101,10 +101,8 @@ public class TurnLogic {
|
|||
for (int i = 0; i < jokerIDs.size(); i++) {
|
||||
StoneState left = stones.get(jokerIDs.get(i));
|
||||
|
||||
HashSet<Integer> leftLeftGroup = new HashSet<Integer>(
|
||||
left.leftGroup);
|
||||
HashSet<Integer> leftLeftRun = new HashSet<Integer>(
|
||||
left.leftRun);
|
||||
HashSet<Integer> leftLeftGroup = new HashSet<Integer>(left.leftGroup);
|
||||
HashSet<Integer> leftLeftRun = new HashSet<Integer>(left.leftRun);
|
||||
leftLeftGroup.remove(null);
|
||||
leftLeftRun.remove(null);
|
||||
int runID, groupID;
|
||||
|
@ -216,8 +214,8 @@ public class TurnLogic {
|
|||
public boolean isInterested(HashSet<Integer> changes) {
|
||||
return !(Collections.disjoint(changes, leftRun)
|
||||
&& Collections.disjoint(changes, rightRun)
|
||||
&& Collections.disjoint(changes, leftGroup) && Collections
|
||||
.disjoint(changes, rightGroup));
|
||||
&& Collections.disjoint(changes, leftGroup) && Collections.disjoint(
|
||||
changes, rightGroup));
|
||||
}
|
||||
|
||||
public <T extends Comparable<T>> boolean lessThan(T a, T b) {
|
||||
|
@ -285,8 +283,7 @@ public class TurnLogic {
|
|||
if (!other.runNeighbor(this) || !other.rightRun.contains(id)) {
|
||||
leftRun.remove(i);
|
||||
changed = true;
|
||||
} else if (other.rightRun.size() == 1
|
||||
&& other.onTable == Boolean.TRUE) {
|
||||
} else if (other.rightRun.size() == 1 && other.onTable == Boolean.TRUE) {
|
||||
changed |= leftRun.retainAll(Arrays.asList(i));
|
||||
changed |= onTable != Boolean.TRUE;
|
||||
onTable = true;
|
||||
|
@ -306,8 +303,7 @@ public class TurnLogic {
|
|||
if (!this.runNeighbor(other) || !other.leftRun.contains(id)) {
|
||||
rightRun.remove(i);
|
||||
changed = true;
|
||||
} else if (other.leftRun.size() == 1
|
||||
&& other.onTable == Boolean.TRUE) {
|
||||
} else if (other.leftRun.size() == 1 && other.onTable == Boolean.TRUE) {
|
||||
changed |= rightRun.retainAll(Arrays.asList(i));
|
||||
changed |= onTable != Boolean.TRUE;
|
||||
onTable = true;
|
||||
|
@ -324,8 +320,7 @@ public class TurnLogic {
|
|||
relevantChanges.retainAll(changes);
|
||||
for (int i : relevantChanges) {
|
||||
StoneState other = top.stones.get(i);
|
||||
if (!other.groupNeighbor(this)
|
||||
|| !other.rightGroup.contains(id)) {
|
||||
if (!other.groupNeighbor(this) || !other.rightGroup.contains(id)) {
|
||||
leftGroup.remove(i);
|
||||
changed = true;
|
||||
} else if (other.rightGroup.size() == 1
|
||||
|
@ -350,8 +345,7 @@ public class TurnLogic {
|
|||
if (!this.groupNeighbor(other) || !other.leftGroup.contains(id)) {
|
||||
rightGroup.remove(i);
|
||||
changed = true;
|
||||
} else if (other.leftGroup.size() == 1
|
||||
&& other.onTable == Boolean.TRUE) {
|
||||
} else if (other.leftGroup.size() == 1 && other.onTable == Boolean.TRUE) {
|
||||
changed |= rightGroup.retainAll(Arrays.asList(i));
|
||||
changed |= onTable != Boolean.TRUE;
|
||||
onTable = true;
|
||||
|
@ -407,9 +401,8 @@ public class TurnLogic {
|
|||
private boolean checkLonelyStone() {
|
||||
boolean changed = false;
|
||||
@SuppressWarnings("unchecked")
|
||||
List<HashSet<Integer>> sets = Arrays.<HashSet<Integer>> asList(
|
||||
leftGroup, rightGroup, leftRun, rightRun, leftGroup,
|
||||
rightGroup, leftRun);
|
||||
List<HashSet<Integer>> sets = Arrays.<HashSet<Integer>> asList(leftGroup,
|
||||
rightGroup, leftRun, rightRun, leftGroup, rightGroup, leftRun);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (isNullSet(sets.get(i)) && isNullSet(sets.get(i + 1))
|
||||
&& isNullSet(sets.get(i + 2))) {
|
||||
|
@ -443,8 +436,8 @@ public class TurnLogic {
|
|||
|
||||
private boolean checkStoneCanBeOnTable() throws Contradiction {
|
||||
boolean changed = false;
|
||||
if (leftGroup.isEmpty() || rightGroup.isEmpty()
|
||||
|| leftRun.isEmpty() || rightRun.isEmpty()) {
|
||||
if (leftGroup.isEmpty() || rightGroup.isEmpty() || leftRun.isEmpty()
|
||||
|| rightRun.isEmpty()) {
|
||||
if (onTable == Boolean.TRUE) {
|
||||
throw new Contradiction();
|
||||
}
|
||||
|
@ -472,23 +465,14 @@ public class TurnLogic {
|
|||
}
|
||||
|
||||
public boolean isSolved() {
|
||||
boolean solved = false;
|
||||
if (onTable == Boolean.FALSE) {
|
||||
return solved;
|
||||
return true;
|
||||
}
|
||||
if (onTable == null || color == null || value == null) {
|
||||
return solved;
|
||||
return false;
|
||||
}
|
||||
if (leftRun.size() > 1 || rightRun.size() > 1
|
||||
|| leftGroup.size() > 1 || rightGroup.size() > 1) {
|
||||
return solved;
|
||||
}
|
||||
solved = bothGoupAndRun();
|
||||
return solved;
|
||||
}
|
||||
|
||||
private boolean bothGoupAndRun() {
|
||||
if (!((isNullSet(leftRun) && isNullSet(rightRun)) || (isNullSet(leftGroup) && isNullSet(rightGroup)))) {
|
||||
if (leftRun.size() > 1 || rightRun.size() > 1 || leftGroup.size() > 1
|
||||
|| rightGroup.size() > 1) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -557,18 +541,17 @@ public class TurnLogic {
|
|||
@Override
|
||||
public int compare(Pair<Stone, Boolean> o1, Pair<Stone, Boolean> o2) {
|
||||
int cmp;
|
||||
cmp = ((Boolean) o1.getFirst().isJoker()).compareTo(o2
|
||||
.getFirst().isJoker());
|
||||
cmp = ((Boolean) o1.getFirst().isJoker()).compareTo(o2.getFirst()
|
||||
.isJoker());
|
||||
if (cmp != 0) {
|
||||
return -cmp;
|
||||
}
|
||||
cmp = (o1.getFirst().getColor()).compareTo(o2.getFirst()
|
||||
.getColor());
|
||||
cmp = (o1.getFirst().getColor()).compareTo(o2.getFirst().getColor());
|
||||
if (cmp != 0) {
|
||||
return cmp;
|
||||
}
|
||||
cmp = ((Integer) o1.getFirst().getValue()).compareTo(o2
|
||||
.getFirst().getValue());
|
||||
cmp = ((Integer) o1.getFirst().getValue()).compareTo(o2.getFirst()
|
||||
.getValue());
|
||||
return cmp;
|
||||
}
|
||||
});
|
||||
|
@ -635,8 +618,7 @@ public class TurnLogic {
|
|||
ArrayList<Stone> setStones = new ArrayList<Stone>();
|
||||
while (true) {
|
||||
setStones.add(inputStones.get(stone.id));
|
||||
if (isNullSet(stone.rightRun)
|
||||
&& isNullSet(stone.rightGroup)) {
|
||||
if (isNullSet(stone.rightRun) && isNullSet(stone.rightGroup)) {
|
||||
break;
|
||||
}
|
||||
Integer rightRunID = stone.rightRun.iterator().next();
|
||||
|
|
Reference in a new issue