pioneers/Map.py

75 lines
2.3 KiB
Python

import sys
import random
# 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()
red_possibilities = dict(zip(self._list, self._list))
to_number = dict(zip(self._list, self._list))
if len(red_possibilities) != 19:
sys.stderr('Map.number() only supports maps of 19 tiles!')
return
for red in [6, 6, 8, 8]:
rp = red_possibilities.keys()
random.shuffle(rp)
tile = rp[0]
tile.roll_val = red
del to_number[tile]
del red_possibilities[tile]
for t in self._neighbors[tile]:
del red_possibilities[tile]
tiles = to_number.keys()
random.shuffle(tiles)
zipped = zip(tiles, [2, 3, 3, 4, 4, 5, 5, 9, 9, 10, 10, 11, 11, 12])
def assign_roll_val(tr):
tile, rv = tr
tile.roll_val = rv
map(assign_roll_val, zipped)