From b4f53e17f21f21b44279d6e6e0720710fb31f661 Mon Sep 17 00:00:00 2001 From: Niels Serup Date: Wed, 8 Aug 2012 21:45:05 +0200 Subject: [PATCH] Basic colour box and colour well interaction implemented. --- robotgame/level3.py | 82 +++++++++++++++++++++++++++++++--- robotgame/logic/colourboxes.py | 26 +++++------ 2 files changed, 89 insertions(+), 19 deletions(-) diff --git a/robotgame/level3.py b/robotgame/level3.py index 86e4511..e83c081 100644 --- a/robotgame/level3.py +++ b/robotgame/level3.py @@ -31,7 +31,9 @@ import os import pygame import random import re +import itertools +import worldobject import level import player import tile @@ -39,21 +41,83 @@ import block import boulder import lever - import logic.colourboxes + +class ActionBlock(block.Block): + def __init__(self, level, x, y, action, movable=True): + self.__dict__.update(locals()) + block.Block.__init__( + self, level, x, y, img=level.imgs['block1'], + movable=movable) + self._last_pos = None + + def update(self, e, t, dt): + if (self.x, self.y) != self._last_pos and not self.is_moving: + self.action(self) + self._last_pos = self.x, self.y + + worldobject.WorldObject.update(self, e, t, dt) + +class ColorWell(block.Block): + def __init__(self, level, x, y): + self.__dict__.update(locals()) + worldobject.WorldObject.__init__( + self, level, x, y, movable=False) + self.img = pygame.Surface((128, 96)) + self.set_colour(0, 0, 0) + + def set_colour(self, r, g, b): + self.well_colour = r * 255, g * 255, b * 255 + self.img.fill(self.well_colour) + + class Level3(level.Level): def __init__(self, game, graphics_dir, paused=False): level.Level.__init__(self, game, graphics_dir, size=(64*20, 48*20), paused=paused) - self.dimensions = 20, 20 + self.dimensions = 10, 10 - for i in range(self.dimensions[0]): - for j in range(self.dimensions[1]): - self.tiles.append( - tile.Tile(self, i*64, j*48, self.imgs['ground1'])) + # for i in range(self.dimensions[0]): + # for j in range(self.dimensions[1]): + # self.tiles.append( + # tile.Tile(self, i*64, j*48, self.imgs['ground1'])) + boxes = logic.colourboxes.generate_colour_boxes(1, 3) + boxes += boxes + boxes += [logic.colourboxes.generate_random_box(1) for _ in range(3)] + random.shuffle(boxes) + + pos_colour = {} + for box, (x, y) in zip(boxes, itertools.product(range(3, 6), range(3, 6))): + self.tiles.append(tile.Tile(self, x * 64, (y + 1) * 48, self.imgs['ground1'])) + pos_colour[(x, y)] = box + + blocks = [ActionBlock(self, 64 * i, 0, action=None, movable=True) + for i in range(1, 4)] + self.objects.extend(blocks) + + wells = [ColorWell(self, 64 * 5, 0)] + self.objects.extend(wells) + + def update_wells(block): + cur_boxes = [] + for block in blocks: + box = pos_colour.get((block.x / 64, block.y / 48)) + if box: + cur_boxes.append(box) + + if not cur_boxes: + well_colours = [(0, 0, 0)] * len(wells) + else: + well_colours = logic.colourboxes.get_colours(cur_boxes) + for i in range(len(wells)): + wells[i].set_colour(*well_colours[i]) + + for b in blocks: + b.action = update_wells + self.draw_background() @@ -73,3 +137,9 @@ class Level3(level.Level): def restart(self): for obj in self.objects: obj.reset_pos() + +def infrange(): + n = 0 + while True: + yield n + n += 1 diff --git a/robotgame/logic/colourboxes.py b/robotgame/logic/colourboxes.py index d5a03f2..7f22418 100644 --- a/robotgame/logic/colourboxes.py +++ b/robotgame/logic/colourboxes.py @@ -72,20 +72,20 @@ def generate_random_box(nwells): r = lambda: random.choice((0, 1)) return [(r(), r(), r()) for _ in range(nwells)] +def get_colours(boxes): + colours = [] + for i in range(len(boxes[0])): + r, g, b = boxes[0][i] + for j in range(1, len(boxes)): + r1, g1, b1 = boxes[j][i] + r ^= r1 + g ^= g1 + b ^= b1 + colours.append((r, g, b)) + return colours + 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 + return all(c == 1 for c in itertools.chain(*get_colours(boxes)))