diff --git a/robotgame/logic/colourboxes.py b/robotgame/logic/colourboxes.py
new file mode 100644
index 0000000..e4d1fd7
--- /dev/null
+++ b/robotgame/logic/colourboxes.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of ROBOTGAME
+#
+# ROBOTGAME is free software: you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# ROBOTGAME is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# ROBOTGAME. If not, see .
+#
+# ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
+#
+# colourboxes.py
+# --------------------
+# date created : Wed Aug 8 2012
+# copyright : (C) 2012 Niels G. W. Serup
+# maintained by : Niels G. W. Serup
+
+import random
+
+def generate_colour_boxes(nwells, nboxes):
+ """
+ Generate colour boxes that can be used to make all wells white.
+
+ Arguments:
+ nwells -- number of wells
+ nboxes -- maximum number of boxes needed to make all wells white.
+
+ Return [[(r, g, b)]]
+ where r : 0|1, g : 0|1, b : 0|1
+ """
+
+ nbits = nwells * 3
+ data = [[0 for _ in range(nboxes)] for _ in range(nbits)]
+
+ def insert_1():
+ t = random.randrange(0, nboxes)
+ for y in range(t, nboxes) + range(0, t):
+ if data[x][y] == 0:
+ data[x][y] = 1
+ break
+
+ for x in range(len(data)):
+ insert_1()
+ for _ in range(random.randrange(0, (nboxes + 1) / 2)):
+ insert_1()
+ insert_1()
+
+ boxes = []
+ for y in range(nboxes):
+ box = []
+ boxes.append(box)
+ for x in range(0, nbits, 3):
+ r = data[x][y]
+ g = data[x + 1][y]
+ b = data[x + 2][y]
+ box.append((r, g, b))
+ return boxes
+
+def generate_random_box(nwells):
+ r = lambda: random.choice((0, 1))
+ return [(r(), r(), r()) for _ in range(nwells)]
+
+def makes_all_wells_white(boxes):
+ """
+ Determine if the boxes make all wells white when XOR'ed together.
+ """
+
+ total = 0
+ for box in boxes:
+ n = 0
+ for r, g, b in box:
+ n <<= 1
+ n |= r
+ n <<= 1
+ n |= g
+ n <<= 1
+ n |= b
+ total ^= n
+ return total == 2**(len(boxes[0]) * 3) - 1
diff --git a/robotgame/logic/rollingstone.py b/robotgame/logic/rollingstone.py
index 35f2859..77d119e 100644
--- a/robotgame/logic/rollingstone.py
+++ b/robotgame/logic/rollingstone.py
@@ -129,7 +129,7 @@ def generate_simple_playfield(width, height, nturns, nstones):
turns.append(((x1, y1), None))
x, y = x1, y1
turns.append(((width - 1, height - 1), None))
-
+
if do_transpose:
turns[:] = [((y, x), {
Down: Right,
diff --git a/tests/colourboxes_tests.py b/tests/colourboxes_tests.py
new file mode 100644
index 0000000..48bcbca
--- /dev/null
+++ b/tests/colourboxes_tests.py
@@ -0,0 +1,17 @@
+
+from __future__ import print_function
+import unittest
+from robotgame.logic.colourboxes import *
+
+
+class ColourboxesTest(unittest.TestCase):
+ def test_generation(self):
+ for args in ((1, 1),
+ (2, 2),
+ (3, 3)):
+ boxes = generate_colour_boxes(*args)
+ print(boxes)
+ self.assertTrue(makes_all_wells_white(boxes))
+
+if __name__ == '__main__':
+ unittest.main()