尝试对全局变量“head”进行索引(它的值为nil)。love2d

我正在通过简单的贪吃蛇游戏尝试使用 Lua,但我一直卡在这个错误上。

代码:

function love.load()

    width, height = love.window.getDimensions()
    start= {x= width/2, y = height/2}

    snake = {}
    snake.dir = 0
    snake.speed = 300
    snake.body  = {}

    for i = 0, 5, 1 do
        table.insert(snake.body,{x=start.x,y=start.y + i })
    end

end

function love.keypressed(key)

    if key == "left" and snake.dir ~= 1 then
        snake.dir = 0
    end
    if key == "right" and snake.dir ~= 0 then
        snake.dir = 1
    end
    if key == "up" and snake.dir ~= 3 then
        snake.dir = 2
    end
    if key == "down" and snake.dir ~= 2 then
        snake.dir = 3
    end

end

function love.update(dt)

    head = snake.body[0]

    if snake.dir == 0 then
        head = {head.x - snake.speed*dt, head.y}
    end

    if snake.dir == 1 then
        head = {head.x + snake.speed*dt, head.y}
    end

    if snake.dir == 2 then
        head = {head.x, head.y - snake.speed*dt}
    end

    if snake.dir == 3 then
        head = {head.x, head.y + snake.speed*dt}
    end

    table.insert(snake.body,0,head)
    table.remove(snake.body,#snake.body)

end

function love.draw()

end

错误在 update 函数中。

还有,我该如何迭代每个蛇身部分?在 Lua 中,相当于 foreach 循环是什么?谢谢任何帮助。

点赞
用户5240636
用户5240636

Lua 中的表(数组)是以 1 为索引的,而不是 0。因此,数组中的第一项应该是 1,而不是 0。

在定义你的蛇身体时,从 1 开始而不是 0:

for i = 1, 5 do
    table.insert(snake.body,{x=start.x,y=start.y + i })
end

然后在你的更新处理程序中:

head = snake.body[1]

要遍历数组,你可以使用 ipairs 进行数值索引,或使用 pairs 进行命名索引:http://lua-users.org/wiki/ForTutorial

例如,假设 snake.body 是一个按数字引用的列表,你可以执行以下操作:

for key, value in ipairs(snake.body) do
   ...
end

要遍历 snake 上的所有内容,你可以执行以下操作:

for key, value in pairs(snake) do
   ...
end

并且在你的 keypressed 处理程序中,使用查找表是否会更简洁?

local keyToDir = { left = 0, right = 1, up = 2, down = 3 }

function love.keypressed(key)
   local dir = keyToDir[key];
   if dir then snake.dir = dir end;
end
2015-08-26 20:36:01