这篇笔记记录一段早期为"消灭星星"小游戏写的 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 表,而没有为每个实例独立开辟存储空间。