lua:尝试对字段'?'(空值)进行索引

现在我在下面的代码中一直遇到这个错误:

box.lua:31: 尝试对字段'?'(空值)进行索引

我试图纠正这个错误,但失败了。

以下是完整的代码:

    function ChatSystem(event, player, msg, Type, lang)
        local Guid = player:GetGUIDLow()
        if flag[Guid] ~= 0 then
            local daan = quiz["box"][flag[Guid]][2];
            local t = msg;
            if (t+1 == daan+1) then
                player:SendBroadcastMessage("[注意]正确")
                SetPlayerFlag(player, 0)
                SetPlayererror(player, 0)
            else
                cuowu[Guid] = error[Guid] + 1;
                if cuowu[Guid] >= quiz["frequency"] then
                    SetPlayererror(player, 0)
                    Kick( player )
                else
                    player:SendBroadcastMessage("[注意]  错误"..cuowu[Guid].."   "..quiz["box"][flag[Guid]][1].."");
                end
            end
        end
    end


    function Start (event, player, item, count)
        local datigailv = math.random(1, 100)
        if (datigailv <= quiz["Chance"])then
            local select = math.random(1, 5)
            local Guid = player:GetGUIDLow()
            SetPlayerFlag(player, select)
            SetPlayererror(player, 0)
            player:SendBroadcastMessage("[注意]回答我的问题:"..quiz["box"][flag[Guid]][1].."");
        end
    end

    RegisterPlayerEvent(32, Start)
    RegisterPlayerEvent(18, ChatSystem);
点赞
用户12918181
用户12918181

在数组嵌套数组的错误很难追踪,如果可能的话,尽量避免这样做,或者添加一些断言,如 assert(quiz["box"][flag[Guid]]) 来检查是否有这样的数组值。

在 Lua 中,你可以使用 flag[Guid] = nil 来删除值,而不是 flag[Guid] = 0

我没有使用数组和动态问题生成的版本:

local quiz = {
  chance = 2,    -- 频率
  frequency = 3  -- 错误次数
}

local quiz_flags = {}  -- 存储玩家的状态

function ChatSystem(event, player, msg, Type, lang)
  local quiz_info = quiz_flags[player:GetGUIDLow()]
  if quiz_info then
    if tonumber(msg) == quiz_info.answer then
      player:SendBroadcastMessage('[Notice] 正确!')
      quiz_flags[player:GetGUIDLow()] = nil    -- 删除状态信息
    elseif quiz_info.count >= quiz.frequency then
      quiz_flags[player:GetGUIDLow()] = nil    -- 删除状态信息
      Kick(player)    -- 踢出玩家
    else
      player:SendBroadcastMessage('[Notice] 错误!第 '..quiz_info.count..' 次尝试, '..quiz_info.question..'=?')
      quiz_info.count = quiz_info.count + 1
    end
  end
end

function Start(event, player, item, count)
  if math.random(1, 100) <= quiz.chance then
    -- 生成数学表达式
    local q = math.random(1,3)..(math.random(1,2) == 1 and '+' or '*')..math.random(1,3)
    quiz_flags[player:GetGUIDLow()] = {
      count = 1,
      question = q,
      answer = load('return '..q)()    -- 计算答案
    }
    player:SendBroadcastMessage('[Notice] 回答我的问题: '..q)
  end
end

RegisterPlayerEvent(32, Start)
RegisterPlayerEvent(18, ChatSystem)
2020-11-17 18:55:25