Change clues interface
This commit is contained in:
@@ -25,10 +25,12 @@ class NeighbourClue<A : ItemClass<A>, B : ItemClass<B>>(val a: Item<A>, val b: I
|
||||
|
||||
if (ia != -1) {
|
||||
if (ib != -1) return ib == ia - 1 || ib == ia + 1
|
||||
return rowB.getOrNull(ia - 1).hasNoSelection() || rowB.getOrNull(ia + 1).hasNoSelection()
|
||||
return rowB.getOrNull(ia - 1).hasNoSelection() || rowB.getOrNull(ia + 1)
|
||||
.hasNoSelection()
|
||||
}
|
||||
if (ib != -1) {
|
||||
return rowA.getOrNull(ib - 1).hasNoSelection() || rowA.getOrNull(ib + 1).hasNoSelection()
|
||||
return rowA.getOrNull(ib - 1).hasNoSelection() || rowA.getOrNull(ib + 1)
|
||||
.hasNoSelection()
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -133,20 +135,24 @@ class TripletClue<A : ItemClass<A>, B : ItemClass<B>, C : ItemClass<C>>(
|
||||
if (ia != -1) {
|
||||
return when (ib) {
|
||||
-1 -> when (ic) {
|
||||
-1 -> (rowB[ia - 1].hasNoSelection() && rowC[ia - 2].hasNoSelection()) || (rowB[ia + 1].hasNoSelection() && rowC[ia + 2].hasNoSelection())
|
||||
ia - 2 -> rowB[ia - 1].hasNoSelection()
|
||||
ia + 2 -> rowB[ia + 1].hasNoSelection()
|
||||
-1 -> (rowB.getOrNull(ia - 1).hasNoSelection() && rowC.getOrNull(ia - 2)
|
||||
.hasNoSelection()) ||
|
||||
(rowB.getOrNull(ia + 1).hasNoSelection() && rowC.getOrNull(ia + 2)
|
||||
.hasNoSelection())
|
||||
|
||||
ia - 2 -> rowB.getOrNull(ia - 1).hasNoSelection()
|
||||
ia + 2 -> rowB.getOrNull(ia + 1).hasNoSelection()
|
||||
else -> false
|
||||
}
|
||||
|
||||
ia - 1 -> when (ic) {
|
||||
-1 -> rowC[ia - 2].hasNoSelection()
|
||||
-1 -> rowC.getOrNull(ia - 2).hasNoSelection()
|
||||
ia - 2 -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
ia + 1 -> when (ic) {
|
||||
-1 -> rowC[ia + 2].hasNoSelection()
|
||||
-1 -> rowC.getOrNull(ia + 2).hasNoSelection()
|
||||
ia + 2 -> true
|
||||
else -> false
|
||||
}
|
||||
@@ -156,19 +162,28 @@ class TripletClue<A : ItemClass<A>, B : ItemClass<B>, C : ItemClass<C>>(
|
||||
}
|
||||
if (ib != -1) {
|
||||
when (ic) {
|
||||
-1 -> return (rowA[ib - 1].hasNoSelection() && rowC[ib + 1].hasNoSelection()) || (rowA[ib + 1].hasNoSelection() && rowC[ib - 1].hasNoSelection())
|
||||
ib - 1 -> return rowA[ib + 1].hasNoSelection()
|
||||
ib + 1 -> return rowA[ib - 1].hasNoSelection()
|
||||
-1 -> return (rowA.getOrNull(ib - 1).hasNoSelection() && rowC.getOrNull(ib + 1)
|
||||
.hasNoSelection()) ||
|
||||
(rowA.getOrNull(ib + 1).hasNoSelection() && rowC.getOrNull(ib - 1)
|
||||
.hasNoSelection())
|
||||
|
||||
ib - 1 -> return rowA.getOrNull(ib + 1).hasNoSelection()
|
||||
ib + 1 -> return rowA.getOrNull(ib - 1).hasNoSelection()
|
||||
}
|
||||
}
|
||||
if (ic != -1) {
|
||||
return (rowB[ic - 1].hasNoSelection() && rowA[ic - 2].hasNoSelection()) || (rowB[ic + 1].hasNoSelection() && rowA[ic + 2].hasNoSelection())
|
||||
return (rowB.getOrNull(ic - 1).hasNoSelection() && rowA.getOrNull(ic - 2)
|
||||
.hasNoSelection()) ||
|
||||
(rowB.getOrNull(ic + 1).hasNoSelection() && rowA.getOrNull(ic + 2)
|
||||
.hasNoSelection())
|
||||
}
|
||||
return rowA.mapIndexed { index, gameCell -> if (gameCell.hasNoSelection()) index else null }
|
||||
.filterNotNull()
|
||||
.any { index ->
|
||||
(rowB.getOrNull(index - 1).hasNoSelection() && rowC.getOrNull(index - 2).hasNoSelection()) ||
|
||||
(rowB.getOrNull(index + 1).hasNoSelection() && rowC.getOrNull(index + 2).hasNoSelection())
|
||||
(rowB.getOrNull(index - 1).hasNoSelection() && rowC.getOrNull(index - 2)
|
||||
.hasNoSelection()) ||
|
||||
(rowB.getOrNull(index + 1).hasNoSelection() && rowC.getOrNull(index + 2)
|
||||
.hasNoSelection())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ class SameColumnClueTest : ClueTest() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `if a is set, but b is not an option in the same column, it's considered invalid`() {
|
||||
fun `if a is set, but b is set to a wrong value, it's considered invalid`() {
|
||||
val grid = createGrid { null }
|
||||
|
||||
for (ia in 0 until size - 1) {
|
||||
@@ -52,8 +52,7 @@ class SameColumnClueTest : ClueTest() {
|
||||
val b = grid[ib][jb]
|
||||
|
||||
a.selection = a.solution
|
||||
b.selection = null
|
||||
b.options.remove(b.solution)
|
||||
b.selection = b.solution
|
||||
|
||||
expect(SameColumnClue(a.solution, b.solution).isValid(grid)).toEqual(false)
|
||||
expect(SameColumnClue(b.solution, a.solution).isValid(grid)).toEqual(false)
|
||||
@@ -75,16 +74,16 @@ class SameColumnClueTest : ClueTest() {
|
||||
val b = rowB[i]
|
||||
rowA.forEachIndexed { index, gameCell ->
|
||||
if (index < i) {
|
||||
gameCell.options.remove(a.solution)
|
||||
gameCell.selection = rowA.options.filter { it != a.solution }.random()
|
||||
} else {
|
||||
gameCell.options.add(a.solution)
|
||||
gameCell.selection = null
|
||||
}
|
||||
}
|
||||
rowB.forEachIndexed { index, gameCell ->
|
||||
if (index < i) {
|
||||
gameCell.options.add(b.solution)
|
||||
gameCell.selection = null
|
||||
} else {
|
||||
gameCell.options.remove(b.solution)
|
||||
gameCell.selection = rowB.options.filter { it != b.solution }.random()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,16 +125,16 @@ class TripletClueTest : ClueTest() {
|
||||
@Test
|
||||
fun `grid with a set and no b and c as option on the same side is considered invalid`() {
|
||||
val grid = createGrid { null }
|
||||
val a = grid[2][3]
|
||||
val b = grid[0][2]
|
||||
val c = grid[1][1]
|
||||
val rowA = grid[2]
|
||||
val rowB = grid[0]
|
||||
val rowC = grid[1]
|
||||
val a = rowA[3]
|
||||
val b = rowB[2]
|
||||
val c = rowC[1]
|
||||
|
||||
a.selection = a.solution
|
||||
b.options.remove(b.solution)
|
||||
c.options.add(c.solution)
|
||||
|
||||
grid[0][4].options.add(b.solution)
|
||||
grid[1][5].options.remove(c.solution)
|
||||
rowB[4].selection = rowC[3].solution
|
||||
c.selection = rowC[3].solution
|
||||
|
||||
expect(TripletClue(a.solution, b.solution, c.solution).isValid(grid)).toEqual(false)
|
||||
expect(TripletClue(c.solution, b.solution, a.solution).isValid(grid)).toEqual(false)
|
||||
|
||||
Reference in New Issue
Block a user