2015-04-08 3 views
0

Я пытаюсь создать игру, в которой 100 камней разбросаны по большой серии координат случайным образом. Проблема в том, что иногда скалы могут перекрывать друг друга. Решение, с которым я столкнулся, состояло в том, чтобы проверить, перекрываются ли камни друг с другом, и если они это сделают, создайте новые случайные генерации координат для скалы снова и снова, пока они не столкнутся ни с чем. Я не совсем уверен, как это сделать; Я пытался обнаружить столкновение между камнем и рок-списком, но все, что происходит, это то, что он думает, что он сталкивается с самим собой и всегда возвращается как истина. Функция __init__ генерирует координаты с random.randint(-2500,2500). Когда камни создаются в цикле for, каждая скала добавляется в список. В функции обновления он проверяет прямоугольное столкновение между камнями. Как я могу это исправить? Спасибо, ответ был бы очень признателен. Спросите меня, нужна ли вам дополнительная информация.Pygame Random Terrain Spawning

+0

вы можете проверить столкновения с перечнем пород, прежде чем добавить координаты нового рока в список рока? –

+0

Есть ли столкновение только в том случае, если элементы находятся в одной и той же координате, или вам нужно проверить перекрытие прямоугольника/полигона? Если последний, все элементы одинакового размера? –

+0

Близко связан: [Генерировать случайные неповторяющиеся выборки из массива чисел] (http://stackoverflow.com/q/26815096) –

ответ

1

Ну, я думаю, есть несколько способов, вы можете подойти к этой проблеме:

1) Первый будет тот, который вы уже использовали, вы бы проверить столкновения каждый раз, когда вы генерировать камень и, если столкновение существует регенерация позиции для данной скалы

2) Второй вариант заключается в том, чтобы нарезать ваше «поле» на прямоугольники размера скалы, как на черепицу, поэтому создавая список возможных позиций, что-то например:

possible_positions = [(i, j) for i in range(x_size_field//x_size_rock) for j in range(y_size_field//y_size_rock)] 
for i in range(n_of_rocks): 
    rock_pos = random.choice(possible_positions) 
    possible_positions.remove(rock_pos) 

Но этот подход мог бы подразумевать в заданном наборе возможных положений, которые создают «равномерное» распределение горных пород.

3) Так что, если это действительно необходимо, чтобы поставить камни на абсолютные случайные позиции, вы можете создать список возможных позиций, например следующее:

possible_positions = [[(i, j) for j in range(y_size_field-y_size_rock)] for i in range(x_size_field-x_size_rock)] 
for i in range(n_of_rocks): 
    # X and Y represente positions on the list not on the field 
    x = random.randint(0, len(possible_positions)) 
    y = random.randint(0, len(possible_positions[x])) 

    # The rock positions 
    rock_pos = possible_positions[x][y] 

    # Now we remove the positions on the region of the new rock 
    for i in range(x,x+x_size_rock): 
     possible_positions[i] = possible_positions[i][0:y] + possible_positions[i][y+y_size_rock:-1] 

    if [] in possible_positions: 
     possible_positions.remove([]) 

конечно, этот код может генерировать ошибки (его довольно простой код), и она нуждается в оптимизации, но я думаю, что вы можете получить общее Ideia от этого.

К сожалению о моем английском

+0

Я полностью понимаю, что вы пытаетесь сказать. Первоначально я имел в виду реализовать карту плитки для игры, и я все еще могу, но только для скал и ландшафта, таких как песок. Я определенно попытаюсь понять, работает ли это вместо того, что у меня есть до сих пор. – Bagel