2D-массивы в LUA невозможны в цикле? - PullRequest
0 голосов
/ 05 июня 2018

По какой-то причине я застрял на этой проблеме целую вечность.Я не могу понять, как определить grid [i] без сброса всех его значений.Я хочу сделать так, чтобы программа проверяла, занята ли точка в двумерном массиве, тогда она не будет размещать блок.

radius = 10

grid = {}

while true do
    for i = -radius,radius do
        grid[i] = {}
        for j = -radius,radius do
            if math.sqrt(math.pow(i,2)+math.pow(j,2))<radius and (not grid[i][j] or grid[i][j] == 0) then
                print("Placing..")
            else
                part:Destroy()
                grid[i][j] = 0
            end
        end
    end
end

1 Ответ

0 голосов
/ 05 июня 2018
radius = 10

grid = {}

while true do
    for i = -radius,radius do
        grid[i] = {}
--      ^ This line here!
        for j = -radius,radius do
            if math.sqrt(math.pow(i,2)+math.pow(j,2))<radius and (not grid[i][j] or grid[i][j] == 0) then
                print("Placing..")
            else
                part:Destroy()
                grid[i][j] = 0
            end
        end
    end
end

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

Я предполагаю, что вы хотите добавить новую таблицу только в том случае, если ее еще нет;это может быть достигнуто с помощью

grid[i] = grid[i] or {}

Другими словами, «установите для grid [i] значение grid [i], если оно имеет значение, или {} в противном случае».Первый ничего не делает, а второй создает новую строку, только если он еще не существует.Это довольно распространенная идиома Lua.

Следует отметить, что этот код имеет большой потенциал для оптимизации. Здесь PDF-файл, подробно описывающий наиболее распространенные способы повышения скорости кода Lua, а здесь - более удобный для начинающих список, если вы не хотите читать всю статью целиком.по теме:)

...