为什么或在哪里会出现 nil 值?

我正在使用 geany 运行此程序。问题是,控制台返回我正在尝试索引一个 nil 值,但我不知道是在第 63 行、80 行还是其他行。我真的是编程初学者,所以我不知道和理解很多东西,如果你能保持简单,我会非常感激。

错误信息如下:

lua: TTC.Lua:65: attempt to index a nil vallue (field'?')
stack traceback:
 TTC.Lua:65: in function 'preenche_tabuleiro'
 TTC.Lua:82: in main chunk
[C]:in ?

这是代码:

function cria_tabuleiro()
    return {{_, _, _}, {_, _, _}, {_, _, _}}
end

function pula_linha(_)
    for __ = 0, _ do print() end
end

function abertura_do_jogo()
    pula_linha(7)
    print("\t-_-_-_-_-_-_-_-_-_-_-_-_-")
    print("\t-      TIC-TAC-TOE      -")
    print("\t-_-_-_-_-_-_-_-_-_-_-_-_-")
end

function checa_OS()
    os.getenv("HOME")
    if home == nil then return "|", "--", " " end
    return "↓", "→ ", "."
end

function recebe_nomes()
    jogs = {}
    for _ = 1,2 do
        msg = ("Digite o nome do jogador numero %s: ")
        io.write(msg:format(_))
        table.insert(jogs, io.read())
    end
    return jogs
end


function imprimir_tabuleiro(T, SB, SD)
    abertura_do_jogo()
    pula_linha(2)
    print(string.format("\t\t    A B C\n\t\t    %s %s %s" , SB, SB, SB))
    for _ = 1,3 do
        io.write(string.format("\t\t %s%s", _, SD))
        print(table.concat(T[_], " "))
    end
    pula_linha(5)
end

function ler_jogada(JOGADORES, X)
    jogada = {}
    checa_jog = function(jog)
        coluna = string.byte(jog:upper()) - 64
        linha = tonumber(jog:sub(2))
        if coluna >= 1 and coluna <= 3 and linha >= 1  and linha <= 3 then
            return coluna, linha
        else
            print("Sua jogada foi invalida, tente novamente")
            ler_jogada(jogadores, X)
            end
        end
    pula_linha(2)
    io.write(string.format("%s, digite sua jogada (EX:B3, A2, ETC...) : ", JOGADORES[X]))
    table.insert(jogada, io.read())
    col, lin = checa_jog(jogada[1])
end

function preenche_tabuleiro(tabuleiro, POS_VAZIA, PECAS, jogadores, _, COL, LIN)
    if tabuleiro[LIN][COL] == POS_VAZIA then
        tabuleiro[LIN][COL] = PECAS
    else
        msg = "%s, voce tentou uma posicao ja preenchida. jogue novamente."
        print(msg:format(jogadores[_]))
        preenche_tabuleiro(tabuleiro, POS_VAZIA, PECAS, jogadores, _, ler_jogada(jogadores, _))
    return tabuleiro
    end
end

abertura_do_jogo()
SETA_BAIXO, SETA_DIREITA, POS_VAZIA = checa_OS()
tabuleiro = cria_tabuleiro(POS_VAZIA)
jogadores = recebe_nomes()
PECAS = {"X", "O"}
imprimir_tabuleiro(tabuleiro, SETA_BAIXO, SETA_DIREITA)
for _ in pairs(jogadores) do
    preenche_tabuleiro(tabuleiro, POS_VAZIA, PECAS[_], jogadores, _, ler_jogada(jogadores, _))
end
点赞
用户7396148
用户7396148

ler_jogada函数不会返回lincol值,但在这里您正在使用它,就好像它有返回值:

preenche_tabuleiro(tabuleiro, POS_VAZIA, PECAS[_], jogadores, _, ler_jogada(jogadores, _))

ler_jogada设置全局变量:

col, lin = checa_jog(jogada[1])

所以当您将其作为最后一个参数传递给preenche_tabuleiro时,您将得到COLLIN的值为nil

如果您在第64行之前添加一个print,您可以看到问题:print(LIN, COL, lin, col)

2020-12-24 16:40:19