1

我有以下已知可以正常工作的 JS 脚本,并为restrictCount值生成正确的值 12 。

var radius = 4
var gnWide = radius * 2 - 1;
var gnHigh = radius * 2 - 1;
var restrictTable = [];
var restrictCount = 0;
var gride = [];
var grido = [];

for (var y = 0; y < gnHigh; y++) {
    restrictTable[y] = [];
    for (var x = 0; x < gnWide; x++) {
        restrictTable[y][x] = 0;
    }
}

for (var y = 0; y < gnHigh; y++) {
    gride[y] = [];
    grido[y] = [];
    for (var x = 0; x < radius; x++) {
        gride[y][x] = 0;
        grido[y][x] = 0;
    }
}

function makeHexagon() {
    var cne = Math.ceil(radius/2) - radius%2;
    for (var y = 0; y < gnHigh; y++) {
        for (var x = 0; x < cne; x++) {
            gride[y][x] = 1;
            gride[y][radius-x-1] = 1;
        }
        if (y < radius-1)
            cne--;
        else if (y > radius-1-radius%2)
            cne++;
    }
    cne = Math.ceil(radius/2) - radius%2 - 1;
    for (var y = 0; y < gnHigh; y++) {
        for (var x = 0; x < cne; x++) {
            grido[y][x] = 1;
            grido[y][radius-x-2] = 1;
        }
        if (y < radius-1-radius%2)
            cne--;
        else if (y > radius-2)
            cne++;
    }
}

function combineTables() {
    for (var y = 0; y < gnHigh; y++) {
        for (var x = 0; x < gnHigh; x++) {
            if (x%2 == 0) {
                var value = gride[y][x/2]
                restrictTable[y][x] = value
                restrictCount += value
            } else {
                var value = grido[y][Math.floor(x/2)]
                restrictTable[y][x] = value
                restrictCount += value
            }
        }
    }
}

makeHexagon()
combineTables()
alert(restrictCount)

我需要把它翻译成 Lua 4 代码。但是,表索引让我感到困惑。在 JS 表中以 0 开头。在 Lua 中,它们以 1 开头。它们在这段代码中经常混合使用,这让我很反感。这是我的尝试,结果是 11 而不是 12:

radius = 4
gnWide = radius * 2 - 1
gnHigh = radius * 2 - 1
restrictTable = {}
restrictCount = 0
gride = {}
grido = {}

for y = 1, gnHigh do
    restrictTable[y] = {}
    for x = 1, gnWide do
        restrictTable[y][x] = 0
    end
end

for y = 1, gnWide do
    gride[y] = {}
    grido[y] = {}
    for x = 1, radius do
        gride[y][x] = 0
        grido[y][x] = 0
    end
end

function makeHexagon()
    cne = ceil(radius/2) - mod(radius,2)
    for y = 1, gnHigh do
        for x = 1, cne do
            gride[y][x] = 1
            gride[y][radius-x] = 1
        end
        if (y < radius) then
            cne = cne - 1
        elseif (y > radius-mod(radius,2)) then
            cne = cne + 1
        end
    end
    cne = ceil(radius/2) - mod(radius,2) - 1
    for y = 1, gnHigh do
        for x = 1, cne do
            grido[y][x] = 1
            grido[y][radius-x-1] = 1
        end
        if (y < radius-mod(radius,2)) then
            cne = cne - 1
        elseif (y > radius-1) then
            cne = cne + 1
        end
    end
end

function combineTables()
    for y = 1, gnHigh do
        for x = 1, gnWide do
            if (mod(x,2) == 1) then
                local value = gride[y][ceil(x/2)]
                restrictTable[y][x] = value
                restrictCount = restrictCount + value
            else
                local value = grido[y][x/2]
                restrictTable[y][x] = value
                restrictCount = restrictCount + value
            end
        end
    end
end

makeHexagon()
combineTables()
print(restrictCount)

有人可以仔细检查我的代码吗?我找不到错误。谢谢!

4

0 回答 0