# odd-numbered rows are right-shifted by half a tile width class Map(object): def __init__(self): self._arr = [] self._list = [] self._finalized = False def add(self, row, col, tile): self._extend(row, col) self._arr[row][col] = tile self._list.append(tile) self._finalized = False def get(self, row, col): if row < 0 or len(self._arr) <= row: return None if col < 0 or len(self._arr[row]) <= col: return None return self._arr[row][col] def _extend(self, row, col): while len(self._arr) <= row: self._arr.append([]) while len(self._arr[row]) <= col: self._arr[row].append(None) def _finalize(self): if self._finalized: return self._neighbors = {} def check(_r, _c, tile): n = self.get(_r, _c) if n: self._neighbors[_c].append(n) for row, r in enumerate(self._arr): for col, tile in enumerate(r): if tile: self._neighbors[tile] = [] offset = row & 1 for i in range(2): c = col - 1 + i + offset check(row - 1, c) check(row + 1, c) check(row, col - 1) check(row, col + 1) self._finalized = True def number(self): self._finalize()