случайная генерация пещеры в гейммейкере

Я хочу создать игру по исследованию пещер в разработчике игр 8.0. Я сделал блочный объект и генератор, но я застрял. Вот мой код для генератора

var r;
r = random_range(0, 1);
repeat(room_width/16) {
    repeat(room_height/16) {
        if (r == 1) {
            instance_create(x, y, obj_block)
        }
        y += 16;
    }
    x += 16;
}

теперь я всегда получаю пустую рамку


person user2942734    schedule 20.11.2013    source источник


Ответы (7)


Вам нужно использовать irandom(1), чтобы получить целое число. Вы также должны поместить его в цикл, чтобы он каждый раз генерировал новое значение.

person Timtech    schedule 23.11.2013

Во втором операторе вы генерируете случайное действительное значение и сохраняете его в r. На самом деле вам нужно выбрать одно из двух значений. Я рекомендую вам использовать для этого функцию choose(...). Вот исправленное утверждение:

r = choose(0,1);    //Choose either 0 or 1 and store it in r

Кроме того, переместите приведенный выше оператор во внутренний цикл. (Потому что вы хотите решить, хотите ли вы разместить блок в указанном (x, y) месте в каждом месте, верно?)

Кроме того, я рекомендую вам заменить sprite_width и sprite_height вместо того, чтобы использовать значение 16 напрямую, чтобы любые изменения, которые вы вносите в спрайт, соответствующим образом корректировали результирующее расположение блоков.

Вот код с исправлениями:

var r;
repeat(room_width/sprite_width) {
    repeat(room_height/sprite_height) {
        r = choose(0, 1);
        if (r == 1)
            instance_create(x, y, obj_block);
        y += sprite_height;
    }
    x += sprite_width;
}

Это должно сработать. Надеюсь, это поможет!

person Awol    schedule 05.12.2013

Похоже, вы создаете экземпляр только в том случае, если r == 1. Разве вы не должны создавать экземпляр каждый раз?

person user1210093    schedule 20.11.2013
comment
Я хочу сделать пещерную игру с генерацией пещеры сверху вниз. - person user2942734; 20.11.2013

  1. Присвоение переменной r = random_range(0, 1); находится вне цикла. Поэтому выполняется только один раз перед запуском цикла.

  2. random_range(0, 1) возвращает случайное действительное число от 0 до 1 (не целое число!). Но у вас if (r == 1) - вероятность получить 1 очень мала.

например:

repeat(room_width/16) {
    repeat(room_height/16) {
        if (irandom(1)) {
            instance_create(x, y, obj_block)
        }
        y += 16;
    }
    x += 16;
}
person Dmi7ry    schedule 22.11.2013

Вот возможное, может быть, даже лучшее решение:

length = room_width/16;
height = room_height/16;

for(xx = 0; xx < length; xx+=1)
{
    for(yy = 0; yy < height; yy+=1)
    {
    if choose(0, 1) = 1 {
    instance_create(xx*16, yy*16, obj_block); }
    }
}

если вам нужны случайные пещеры, вам, вероятно, следует удалить случайные участки этих блоков, а не только отдельные.

person Psylution    schedule 10.12.2013

Для получения бонусных очков вы можете использовать начальное значение для генерации случайной пещеры. У вас также может быть случайная генерация пути, которая будет иметь гарантированный путь к финишу со случайными открытиями и поддельными путями, которые генерируются случайным образом из этого пути. Затем вы можете заполнить дополнительные места другими случайными элементами.

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

person Mark    schedule 16.01.2014

Проблема в первой строке, вам нужно поставить r = что-то в цикле for

person Robert Bielka    schedule 27.07.2018