Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Язык Луа и движок solar почему индексы в двумерном массиве нужно менять местами?

Inco Gnito Ученик (45), на голосовании 2 недели назад
Что то не пойму, создаю двумерный массив:

for i = 1, 10 do
playerTab[i] = {}
for j = 1, 10 do
local playerCell = display.newImageRect( mainGroup, objectSheet, 10, cellSize, cellSize )
playerCell.x = start_x + (i - 1) * cellSize
playerCell.y = start_y + (j - 1) * cellSize
playerTab[i][j] = playerCell
end
end

при обращении playerTab[1][9] я ожидаю что это будет 1 ряд 9 столбец как на рисунке, но все наоборот 1 столбец 9 ряд.
Где ошибка?Другой код работает правильно, тут первое число 9 это ряд, второе число 1 это столбец:

What the table will look like filled with this code local cnt = 0
local enemyTab = {}
for i = 1, 10 do
enemyTab[i] = {}
for j = 1, 10 do
cnt = cnt + 1
enemyTab[i][j] = cnt
end
end

print(enemyTab[9][1])
Голосование за лучший ответ
gggamer palcevst Ученик (246) 1 месяц назад
**Причина, по которой вам нужно менять местами индексы в двумерном массиве Lua с движком Solar, заключается в порядке, в котором Solar перебирает элементы массива.**

В Lua массивы индексируются с единицы, и первый индекс обычно представляет собой строку, а второй - столбец. Однако Solar перебирает элементы массива в обратном порядке: сначала по столбцам, а затем по строкам.

**В вашем коде:**

```lua
for i = 1, 10 do
playerTab[i] = {}
for j = 1, 10 do
local playerCell = display.newImageRect(mainGroup, objectSheet, 10, cellSize, cellSize)
playerCell.x = start_x + (i - 1) * cellSize
playerCell.y = start_y + (j - 1) * cellSize
playerTab[i][j] = playerCell
end
end
```

**Вы добавляете элементы в массив `playerTab` следующим образом:**

1. Вы создаете новую строку в массиве `playerTab` с индексом `i`.
2. В этой новой строке вы добавляете новый элемент с индексом `j`.

**Однако Solar будет перебирать элементы массива `playerTab` следующим образом:**

1. Он переберет все элементы в первом столбце (j = 1) от строки 1 до строки 10.
2. Затем он переберет все элементы во втором столбце (j = 2) от строки 1 до строки 10.
3. И так далее.

**Из-за этого порядок элементов в массиве `playerTab` будет перевернут по сравнению с тем, что вы ожидаете.**

**Чтобы исправить это, вам нужно поменять местами индексы `i` и `j` при добавлении элементов в массив:**

```lua
for i = 1, 10 do
playerTab[i] = {}
for j = 1, 10 do
local playerCell = display.newImageRect(mainGroup, objectSheet, 10, cellSize, cellSize)
playerCell.x = start_x + (j - 1) * cellSize
playerCell.y = start_y + (i - 1) * cellSize
playerTab[j][i] = playerCell
end
end
```

**Теперь код будет работать правильно, и `playerTab[1][9]` будет ссылаться на элемент в 1-м ряду и 9-м столбце.**

**В другом коде:**

```lua
local cnt = 0
local enemyTab = {}
for i = 1, 10 do
enemyTab[i] = {}
for j = 1, 10 do
cnt = cnt + 1
enemyTab[i][j] = cnt
end
end

print(enemyTab[9][1])
```

**Он работает правильно, потому что вы добавляете элементы в массив `enemyTab` в том же порядке, в котором Solar будет их перебирать.**

**В этом коде:**

1. Вы создаете новую строку в массиве `enemyTab` с индексом `i`.
2. В этой новой строке вы добавляете новый элемент с индексом `j`.

**Solar будет перебирать элементы массива `enemyTab` в том же порядке:**

1. Он переберет все элементы в первом столбце (j = 1) от строки 1 до строки 10.
2. Затем он переберет все элементы во втором столбце (j = 2) от строки 1 до строки 10.
3. И так далее.

**Поэтому `enemyTab[9][1]` будет ссылаться на элемент в 9-м ряду и 1-м столбце.**


**Дополнительные советы:**

* **Используйте функции `table.insert()` и `table.remove()` для добавления и удаления элементов из массива.** Эти функции автоматически обновляют индексы элементов в массиве.
* **Используйте функцию `table.sort()` для сортировки элементов массива.**
* **Используйте функцию `table.concat()` для объединения нескольких таблиц в одну.**


**Документация:**

* Lua Arrays: [неправильный URL удален]
* Solar API: [неправильный URL удален]
Inco GnitoУченик (45) 1 месяц назад
это с какой нейронки взят ответ?
Похожие вопросы