Example #1
0
 def test_neighbour_for_edge(self):
     b = Board(self.conf)
     b.add_to_board('58', (-1, 0), tile.ROTATIONS.deg180)
     self.assertEquals(b.neighbour_for_edge((0,0), tile.EDGES.top), None)
     self.assertEquals(b.neighbour_for_edge((0,0), tile.EDGES.bottom), None)
     self.assertEquals(b.neighbour_for_edge((0,0), tile.EDGES.right), None)
     self.assertEquals(b.neighbour_for_edge((0,0), tile.EDGES.left), b.grid[(-1, 0)])
Example #2
0
    def test_html_render(self):
        b = Board(self.conf)
        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        b.add_to_board('6', (1, 0), tile.ROTATIONS.deg90)
        b.add_to_board('7', (-1, 0), tile.ROTATIONS.deg270)
        b.add_to_board('4', (2, 0), tile.ROTATIONS.deg180)

        h = HtmlRenderer.render(b)
Example #3
0
 def test_table_pos_to_grid(self):
     b = Board(self.conf)
     b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
     b.add_to_board('6', (1, 0), tile.ROTATIONS.deg90)
     b.add_to_board('7', (-1, 0), tile.ROTATIONS.deg270)
     b.add_to_board('4', (2, 0), tile.ROTATIONS.deg180)
     self.assertEquals(Renderer.table_pos_to_grid(0, 0, b), (-1, 0))
     self.assertEquals(Renderer.table_pos_to_grid(3, 0, b), (2, 0))
Example #4
0
    def test_entities(self):
        b = Board(self.conf)
        b.add_to_board('58', (-1, 0), tile.ROTATIONS.deg180)
        b.add_to_board('17', (-1, -1), tile.ROTATIONS.deg180)
#        b.add_to_board('59', (-2, 0), tile.ROTATIONS.deg0)
#        b.add_to_board('6', (-1, 1), tile.ROTATIONS.deg0)
#        b.add_to_board('45', (-3, 0), tile.ROTATIONS.deg0)


        print b.entities()
Example #5
0
    def test_is_legal_on_location(self):
        b = Board(self.conf)
        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)

        self.assertTrue(b.is_legal_on_location('6', (1, 0), tile.ROTATIONS.deg90))
        self.assertFalse(b.is_legal_on_location('6', (1, 0), tile.ROTATIONS.deg180))
        self.assertFalse(b.is_legal_on_location('6', (1, 0), tile.ROTATIONS.deg270))
        self.assertFalse(b.is_legal_on_location('6', (1, 0), tile.ROTATIONS.deg0))
Example #6
0
    def test_playable_locations(self):
        b = Board(self.conf)
        l = b.playable_locations()
        self.assertEquals(len(l), 4)

        # can only play cloister below starter
        l = b.playable_locations('2')
        self.assertEquals(len(l), 1)
        self.assertEquals(l.pop(), (0, -1))

        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        l = b.playable_locations()
        # remove 1, add 3 => 6
        self.assertEquals(len(l), 6)
Example #7
0
    def test_neighbours_for(self):
        b = Board(self.conf)
        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)

        n = b.neighbours_for((0,0))
        self.assertEquals(type(n[0]), PlayedTile)
        self.assertEquals(type(n[1]), tuple)
        self.assertEquals(type(n[2]), tuple)
        self.assertEquals(type(n[3]), tuple)

        n = b.neighbours_for((0,-1))
        self.assertEquals(type(n[0]), tuple)
        self.assertEquals(type(n[1]), PlayedTile)
        self.assertEquals(type(n[2]), tuple)
        self.assertEquals(type(n[3]), tuple)

        n = b.neighbours_for((10,10))
        self.assertTrue(all(type(l) is tuple for l in n))
Example #8
0
    def test_add_to_board(self):
        b = Board(self.conf)
        self.assertEquals(b.grid.get((0, -1), None), None)
        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        self.assertEquals(b.grid[(0, -1)].tile.name, "cloister")

        self.assertEquals(b.grid.get((1, 0), None), None)
        b.add_to_board('6', (1, 0), tile.ROTATIONS.deg90)
        self.assertEquals(b.grid[(1, 0)].tile.name, "cloisterroad")

        self.assertEquals(b.grid.get((-1, 0), None), None)
        b.add_to_board('7', (-1, 0), tile.ROTATIONS.deg270)
        self.assertEquals(b.grid[(-1, 0)].tile.name, "cloisterroad")

        self.assertEquals(b.grid.get((2, 0), None), None)
        b.add_to_board('4', (2, 0), tile.ROTATIONS.deg180)
        self.assertEquals(b.grid[(2, 0)].tile.name, "cloister")

        # Play an already played tile again, should fail
        try:
            b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
            self.fail("Tile should already be played")
        except ValueError, v:
            pass
Example #9
0
    def test_impossible_play(self):
        """From actual random output:
        INFO:root:Played tile 1 at location (0, 0), rotated 0
        INFO:root:Played tile 58 at location (-1, 0), rotated 2
        INFO:root:Played tile 17 at location (-1, -1), rotated 2
        INFO:root:Played tile 29 at location (-2, -1), rotated 0
        INFO:root:Played tile 9 at location (0, -1), rotated 2
        INFO:root:Played tile 28 at location (1, -1), rotated 0
        INFO:root:Played tile 43 at location (1, -2), rotated 1
        INFO:root:Played tile 61 at location (-2, -2), rotated 0
        DEBUG:root:Could not play tile 2, Played tiles: 8
        """

        b = Board(self.conf)
        b.add_to_board('58', (-1, 0), tile.ROTATIONS.deg180)
        b.add_to_board('17', (-1, -1), tile.ROTATIONS.deg180)
        b.add_to_board('29', (-2, -1), tile.ROTATIONS.deg0)
        b.add_to_board('9', (0, -1), tile.ROTATIONS.deg180)
        b.add_to_board('28', (1, -1), tile.ROTATIONS.deg0)
        b.add_to_board('43', (1, -2), tile.ROTATIONS.deg90)
        b.add_to_board('61', (-2, -2), tile.ROTATIONS.deg0)

        # no playable positions for the cloister now:
        self.assertEquals(b.playable_locations('2'), set())
Example #10
0
    def test_extremes(self):
        b = Board(self.conf)
        self.assertEquals(b.extremes(), ((-1,1), (1,-1)))

        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        self.assertEquals(b.extremes(), ((-1,1), (1,-2)))

        b.add_to_board('6', (1, 0), tile.ROTATIONS.deg90)
        self.assertEquals(b.extremes(), ((-1,1), (2,-2)))

        b.add_to_board('7', (-1, 0), tile.ROTATIONS.deg270)
        self.assertEquals(b.extremes(), ((-2,1), (2,-2)))

        b.add_to_board('4', (2, 0), tile.ROTATIONS.deg180)
        self.assertEquals(b.extremes(), ((-2,1), (3,-2)))
Example #11
0
    def test_dimensions(self):
        b = Board(self.conf)
        self.assertEquals(b.dimensions(), (3,3))

        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        self.assertEquals(b.dimensions(), (3,4))

        b.add_to_board('6', (1, 0), tile.ROTATIONS.deg90)
        self.assertEquals(b.dimensions(), (4,4))

        b.add_to_board('7', (-1, 0), tile.ROTATIONS.deg270)
        self.assertEquals(b.dimensions(), (5,4))

        b.add_to_board('4', (2, 0), tile.ROTATIONS.deg180)
        self.assertEquals(b.dimensions(), (6,4))
Example #12
0
    def test_tile_to_id(self):
        b = Board(self.conf)
        self.assertEquals(Renderer.tile_to_id(b.grid[(0,0)]), 'starter000')

        b.add_to_board('2', (0, -1), tile.ROTATIONS.deg0)
        self.assertEquals(Renderer.tile_to_id(b.grid[(0,-1)]), 'cloister0-10')
def main():
    if len(sys.argv) < 2:
        sys.stderr.write("Usage: construct_random_board <tileset>\n")
        return 1

    logging.getLogger().setLevel(logging.DEBUG)

    print "Loading ..."
    json = load_config(sys.argv[1])

    validate_tileset_config(json, set(['city', 'field', 'road']))


    seed = int(time.time())
    #seed = 1333213878
    print "Constructing with seed %s ..." % (seed)

    random.seed(seed)

    b = Board(json)
    failed_count = 0
    while len(b.tilesleft) > 0:
        tile = random.sample(b.tilesleft, 1)[0]
        locations = b.playable_locations(tile)

        location = None
        playable_locations = []
        location_neighbour_count = 0
        for l in locations:
            count = count_neighbours(b, l)

            if count > location_neighbour_count:
                location_neighbour_count = count
                playable_locations = []
                playable_locations.append(l)
                location = l
            elif count == location_neighbour_count:
                playable_locations.append(l)

        #location = random.sample(locations, 1)[0]
        if not playable_locations:
            logging.debug('Could not play tile %s\n%s' % (tile, b))
            failed_count += 1
            continue

        most_playable = 0
        location = None
        for l in playable_locations:
            count = 0
            for r in ROTATIONS.values():
                if b.is_legal_on_location(tile, l, ROTATIONS[r]):
                    count += 1

            if count >= most_playable:
                most_playable = count
                location = l

        #location = random.sample(playable_locations, 1)[0]

        for r in ROTATIONS.values():
            if b.is_legal_on_location(tile, location, ROTATIONS[r]):
                b.add_to_board(tile, location, ROTATIONS[r])
                break

    print 'Done, had to retry %d tiles' % failed_count

    print b
    d = b.dimensions()
    print 'Board size: %dx%d' % (d[0], d[1])

    filename = 'board.html'
    print "Rendering to %s" % (filename)
    html = HtmlRenderer.render(b)
    file = open(filename, 'w')
    file.write(html)
    file.close()