2011-04-17 270 views
1

我有以下代碼Lua for循環幫助!

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) 
     ) 

任何想法我做錯了什麼?

謝謝!

+0

如果是Lua 5.1,除非你確定它是你需要的,否則不要使用'table.getn'。使用'#'。 – 2011-04-17 04:26:55

+0

不是100%確定你使用#表示什麼? – Steven 2011-04-17 04:35:08

+0

爲什麼你用'while'代替'for for'? – 2011-04-17 04:40:21

回答

0

您必須在每個內部循環之後將j重置爲1。因爲:內循環第一次完成後,j將增加64次。但是你想從j開始重新設置1.

在另一種編程語言的代碼中,請注意,這個j的重新設置是照顧的。

5

這是您的代碼清理版本。

注意變化:

  1. 使用local變量,而不是全局性的。使用#代替table.getn()
  2. 使用數字for循環代替while
  3. 缺少分號。

如果您將取消註釋io.write()來電和註釋掉print s,您將以可讀方式打印出您的地圖。

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 

P.S.確保你已閱讀Programming in Lua 2nd Edition書。請注意,該版本在線提供,是第一版,它描述了較早的Lua 5.0。