【问题标题】:Lua for loop help!Lua for 循环帮助!
【发布时间】:2011-04-17 03:54:53
【问题描述】:

我有以下代码

tile_width = 64;
tile_height = 64;

tile_map = {
    {1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,1,2,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,2,1,1,1,1,1}
}

i=1;
j=1;
while i<table.getn(tile_map) do
    while j<table.getn(tile_map[i]) do
        print(tile_map[i][j]);
        x = (j * tile_width / 2) + (i * tile_width / 2)
        y = (i * tile_height / 2) - (j * tile_height / 2)
        print(x);
        print(y);
        j = j+1;
    end
i = i+1;
end

它可以工作,但它只显示第一行的值,而不会进入第二行、第三行等。

我想用另一种语言做什么

for (i = 0; i < tile_map.size; i++):
    for (j = 0; j < tile_map[i].size j++):
        draw(
            tile_map[i][j],
            x = (j * tile_width / 2) + (i * tile_width / 2)
            y = (i * tile_height / 2) - (j * tile_height / 2)
        )

知道我做错了什么吗?

谢谢!

【问题讨论】:

  • 如果是 Lua 5.1,请不要使用table.getn,除非你完全确定它是你需要的。使用#
  • 不是 100% 确定您所说的使用 # 是什么意思?
  • 你为什么用while而不是for
  • 即表长度运算符。 lua.org/manual/5.1/manual.html#2.5.5

标签: lua


【解决方案1】:

这是您的代码的清理版本。

注意变化:

  1. 使用local 变量而不是全局变量。
  2. 使用# 代替table.getn() 作为表大小。
  3. 使用数字for 循环而不是while
  4. 缺少分号。

如果您取消注释io.write() 呼叫并注释掉prints,您的地图将以可读的方式打印出来。

local tile_width = 64
local tile_height = 64

local tile_map = {
    {1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,3,1,1,1,1,1,1},
    {1,1,1,1,1,1,2,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,2,1,1,1,1,1}
}

for i = 1, #tile_map do
  local row = tile_map[i]
  for j = 1, #row do
    --io.write(row[j])
    print(row[j])
    local x = (j * tile_width / 2) + (i * tile_width / 2)
    local y = (i * tile_height / 2) - (j * tile_height / 2)
    print(x)
    print(y)
  end
  --io.write("\n")
end

附:确保您已阅读 Programming in Lua 2nd Edition 书籍。请注意,在线提供的版本是第一版,它描述的是较旧的 Lua 5.0。

【讨论】:

    【解决方案2】:

    您必须在每个内部循环之后将 j 重置为 1。因为:在第一次完成内部循环后,j 将增加 64 次。但是你想从 j 设置为 1 重新开始。

    在其他编程语言的代码中,请注意对 j 的重新设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2011-04-20
      • 2015-03-30
      • 2018-07-17
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多