这篇笔记记录一段早期为"消灭星星"小游戏写的 Lua 代码,用一维表模拟二维数组,支持按 (x, y) 读写格子数据。思路很朴素:把二维坐标映射到一维下标,通过 y * len + x 定位元素。
实现思路
Lua 本身没有原生的二维数组,但 table 足够灵活,可以自己封装出一套类似二维数组的访问接口。下面这段代码把所有格子都存在同一个 Array 表里,用一个 len 字段记录行宽,再用简单的算式把 (x, y) 换算成线性下标,从而实现 create / get / set 三个基本操作。
完整代码
Array={len=10}
function Array:create(x,y,initValue)
for i=0,y do
for ii=0,x do
Array[ii+self["len"]*i]=initValue
end
end
self["len"]=x-1
return Array
end
function Array:get(x,y)
return Array[y*self["len"]+x]
end
function Array:set(x,y,value)
Array[y*self["len"]+x]=value
end
local array=Array:create(10,10,0)
for i=0,array["len"] do
for ii=0,array["len"] do
array:set(i,ii,50+ii)
io.write(array:get(i,ii).. "\t")
end
print(" ")
end
用途与局限
这段代码的初衷是在"消灭星星"的开发中用来保存棋盘数据,跑起来可以模拟出一个二维数组的效果,按行列读写都没问题。
但它的问题也很明显:不适合在其他场景里直接套用,bug 也不少。最典型的一点是,它只能创建一个二维数组实例;如果同时创建多个,不同数组之间的数据会互相覆盖、产生重叠,原因在于所有数据都写进了同一个全局的 Array 表,而没有为每个实例独立开辟存储空间。