Я глубоко не разбирался. Заметил проблему на таком коде:
def waves(self, _hexes=None):
"""Yields waves starting from hexes one by one.
Each wave is a list. You can exclude some hexes
from yielded list and continue iterating on filtered list.
"""
hexes = [self]
if _hexes is not None:
hexes.extend(_hexes)
visited = set(hexes)
lastwave = list(hexes)
while lastwave:
newwave = []
for nc in lastwave:
for nnc in nc.neighbours():
if nnc not in visited:
visited.add(nnc)
newwave.append(nnc)
yield newwave
lastwave = newwave
Это запуск стандартного волнового алгоритма от точки, возвращает список-волну на каждом шаге. Из этой волны можно исключать нужные точки, чтобы от них не бежала следующая волна.
В cython, насколько помню, волна не желала бежать вообще.