检查2D数组是否有相同的值

我正在尝试制作一个游戏,我有一个二维数组

就像这样:

Grid[x][y]

假设其中有以下值:

12345
1        2        5        2        5
2        2        3        1        1
1        4        3        4        5
1        3        3        3        5  <-- 匹配这一行
3        5        3        4        5
2        4        3        4        5
2        4        4        4        5

在中间(索引 4)我想检查是否至少有 3 次相同的数字,如果有 4 次相同的呢?甚至是 5 次。

你该如何检查这个?有什么好方法可以找到相同的数字并删除那些相同的数字...我卡在想出这样的逻辑来制作这样的东西。

这是我尝试过的:

grid = {}
for x = 1, 5 do
  grid[x] = {finish = false}
  for y = 1, 7 do
    grid[x][y] = {key= math.random(1,4)}
  end
end

function check(t)
  local tmpArray = {}
  local object
  for i = 1,5 do
    object = t[i][1].key
    if object == t[i+1][1].key then
      table.insert( tmpArray, object )
    else
      break
    end
  end
end

print_r(grid)
check(grid)
print_r(grid)

其中 print_r 打印了 grid:

function print_r ( t )
    local print_r_cache={}
    local function sub_print_r(t,indent)
        if (print_r_cache[tostring(t)]) then
            print(indent.."*"..tostring(t))
        else
            print_r_cache[tostring(t)]=true
            if (type(t)=="table") then
                for pos,val in pairs(t) do
                    if (type(val)=="table") then
                        print(indent.."["..pos.."] => "..tostring(t).." {")
                        sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
                        print(indent..string.rep(" ",string.len(pos)+6).."}")
                    else
                        print(indent.."["..pos.."] => "..tostring(val))
                    end
                end
            else
                print(indent..tostring(t))
            end
        end
    end
    sub_print_r(t,"  ")
end

它并不是那么好用,因为我检查它后面的索引,如果那个不一样,它就不会添加最后一个.. 我不知道这是否是最好的方法...

如果我“删除”匹配的索引,我的计划是将其上面或下面的索引行移动到第 4 个索引行...但首先要做的是。

点赞
用户869951
用户869951

你应该比较第二个索引而不是第一个:在下面这个表中

g = {{1,2,3}, {4,5,6}}

g[1] 是第一行 {1,2,3},而不是第一列(即第一和第二行的第一个元素 {1,4})。你在之前的帖子中也犯了同样的错误,你应该重新阅读有关表的 Lua 文档。你应该像下面这样做:

for i = 1,#t do
     object = t[i][1].key
     if object == t[i][2].key then

这仅会比较行中的前两个项。如果你想要检查行是否有任何相同的连续项,你将不得不循环第二个索引,从1到 #t[i]-1

以下的 print 函数可能更有用,因为它将表格打印成网格形式,易于查看 before/after:

function printGrid(g)
    for i, t in ipairs(g) do
        print('{' .. table.concat(t, ',') .. '}')
    end
end
2014-04-05 20:38:32