使用 Lua 表作为二维数组

Posted

技术标签:

【中文标题】使用 Lua 表作为二维数组【英文标题】:Using Lua tables as 2-dimensional arrays 【发布时间】:2013-08-15 04:42:58 【问题描述】:

我是 Lua 初学者,我尝试使用 Love2D 库在 Lua 中创建一些东西。

在加载函数中,我创建了一个表格并将其与元素(即数字)一起上传,以供以后用作多维数组。

function love.load()

    Maximum_X = 32      
    Maximum_Y = 16

    Start_X = 64
    Start_Y = 32

    MapTable =                            -- empty table

    for i=1,Maximum_X*Maximum_Y do          -- uploading table
        table.insert(MapTable, 2)
  end


end

然后我创建了一个函数来改变表格。因为我只是在试验表格,所以只有一个改变的值。至少,我想。

function KatamoriGen()

    MapTable[4] = 3     

end


function love.update(dt)

KatamoriGen()

end

之后,我将表格的元素打印在一个 32 列和 16 行的矩阵中。我看到这里不仅第1行的第4个元素改变了,而且第2行的第2个元素和第4行的第1个元素都变成了3。

这显然意味着Table[posX*posY] 也不起作用,因为乘法的结果是像4 这样的数字,并且操作会改变每个元素

X coordinate + Y coordinate = posX*posY

是真的。在示例代码中,这个等式的右边是 4。

一个小问题:为什么会这样?

主要问题是:如何准确识别MapTable 的元素?如何为 Lua 表实现 X 和 Y 维度?将它们用作二维数组?也许桌子?

编辑:这是绘图功能:

function love.draw()    

for j=1,16 do
    for i=1,32 do
    love.graphics.draw(Tileset[MapTable[j*Maximum_X + i]], Start_X + 32*(i-1), Start_Y + 32*(j-1))
    end
end

end

现在我很清楚这是错误的,正确的规则是MapTable[j*Maximum_X + i],但我得到一个错误:“预期的参数类型:预期的用户数据”

【问题讨论】:

你能把你所有的代码都发过来吗?特别是您进行打印的位置。就目前而言,加载和更新功能将按照您的预期工作,即仅更新单个值(尽管它会在更新循环中重复执行) 看来我搞砸了。抽签是下一个:function love.draw(),然后在另一个循环中有一个循环来制作矩阵,这是最里面循环的主体:love.graphics.print(MapTable[i*j], Start_X + 32*(i-1), Start_Y + 32*(j-1)) 之后是一个end,ofc。现在我很清楚这是错误的,正确的规则是MapTable[j*Maximum_X + i],但我得到一个错误:“预期的参数类型:预期的用户数据”为了清楚起见,它也发布在 OP 中。 试试 MapTable[(j-1)*Maximum_X + i]。这样它从索引 1 开始,而不是 Maximum_X+1 哦,是的,就是这样。现在对我来说清楚。谢谢! 【参考方案1】:

您还可以使用多维度表。比如:

local MapTable = 
local Maximum_X, Maximum_Y = 32, 16
local Start_X, Start_Y = 64, 32

function love.load()
    for y = 1,Maximum_Y do
        local row = 
        for x = 1,Maximum_X do
            table.insert(row,2)
        end
        table.insert(MapTable,row)
    end
end

function love.draw()
    for y,row in ipairs(MapTable) do
        for x,idx in ipairs(row) do
            love.graphics.draw(Tileset[idx], Start_X + 32*(x-1), Start_Y + 32*(y-1))
        end
    end
end

【讨论】:

所以它实际上是一个表,如果我能看清楚的话,内部表包含每一行。相当聪明!我试图考虑在表中使用表,但没有考虑使用它们来存储每一行​​。 虽然这段代码没有显示出来,但是你可以使用MapTable[row][col]访问元素。 你可以通过使用row[x]=2MapTable[y]=row来避免table.insert【参考方案2】:

作为Alex shows it,问题不在于表格的工作方式,而在于我以错误的方式显示数字。表可以用作一维数组,然后一切都很好。

虽然这不是将它们用作二维数组的解决方案,但主要问题已经解决了。

【讨论】:

以上是关于使用 Lua 表作为二维数组的主要内容,如果未能解决你的问题,请参考以下文章

lua table怎么用二维数组

如何在 Lua 中的二维表上创建迭代器?

php中一个二维数组,怎么吧数组中的数据作为value插入到数据库某个表中

Lua学习十----------Lua数组

c语言中怎么用二维数组作为函数参数

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )