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()