Вероятно, наиболее важный шаг в вашем коде отсутствует:
Если новая точка действительна, новая точка указывается как точка появления и помещается в ячейку в сетке .
Предлагаю добавить точку к cellGrid
если оно действительно:
if isValid:
cellGrid[newPointIndex[0]][newPointIndex[1]] = newPoint
points.append(newPoint)
spawnpoints.append(newPoint)
spawned = True
break
Кроме того, прежде чем добавить точку, необходимо проверить, не занята ли ячейка с индексом newPointIndex
:
newPointIndex = [int(newPoint.x/cellSize), int(newPoint.y/cellSize)]
if cellGrid[newPointIndex[0]][newPointIndex[1]] != None:
continue
neighbours = FindNeighbours(cellNumberX,cellNumberY,newPointIndex,cellGrid)
Наконец, есть проблема в функции FindNeighbours
. range(start, stop)
создает диапазон для x в start <= x < stop
.
Таким образом, останов должен быть index[0]+3
, а не index[0]+2
.
Далее диапазоны, которые контролируют 2 вложенных цикла for
,работать с x-2
до y+2
, а не с x-2
до x+2
соответственно с y-2
до y+2
:
for cellX in range(max(0,(index[0]-2)), min(cellNumberX,(index[1]+2))):
for cellY in range(max(0,(index[0]-2)), min(cellNumberY,(index[1]+2)))
Фиксированная функция должнабыть:
def FindNeighbours(cellNumberX, cellNumberY, index, cellGrid):
neighbours = []
for cellX in range(max(0, index[0]-2), min(cellNumberX, index[0]+3)):
for cellY in range(max(0, index[1]-2), min(cellNumberY, index[1]+3)):
if cellGrid[cellX][cellY] != None:
neighbours.append(cellGrid[cellX][cellY])
return neighbours
См. результат для размера 300 x 300 и радиуса 15:
Можно добиться еще лучшего результата, если всегда использовать 1-ю точку spawnpoints
вместо случайной точки:
# spawnIndex = random.randint(0,len(spawnpoints)-1)
spawnIndex = 0 # 0 rather than random
spawnpoint = spawnpoints[spawnIndex]