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