2013-01-10 182 views
1

在Lua(Codea on ipad)中,我製作了一個程序,其中有四對XY座標,這些座標放在同一個ID(count = count + 1) 當我第一次使用一對測試代碼時,要檢測XY座標何時觸摸表格中的座標之一(座標已經存在)。 我這樣做是使用這段代碼:Lua表檢查是否有任何變量匹配任何值

if (math.abs(xposplayer - posx) < 10) and (math.abs(yposplayer - posy) < 10) and id < (count - 10) then 

這段代碼在這個循環正在播放:

for id,posx in pairs(tableposx) do 
posy = tableposy[id] 

這個工作它就像我想!

但現在我已經與8桌(tableposx1 tableposy1,...) 我想檢查是否任何當前座標觸及任何表中的任何座標(永遠),所以我試過了:

for id,posx1 in pairs(tableposx1) do 
posy1 = tableposy1[id] 
posy2 = tableposy2[id] 
posx2 = tableposx2[id] 
posy3 = tableposy3[id] 
posx3 = tableposx3[id] 
posy4 = tableposy4[id] 
posx4 = tableposx4[id] 

這一點四倍(四個當前座標)

if ((math.abs(xposplayer1 - posx1) < 10) and (math.abs(yposplayer1 - posy1) < 10)) 
or ((math.abs(xposplayer1 - posx2) < 10) and (math.abs(yposplayer1 - posy2) < 10)) 
or ((math.abs(xposplayer1 - posx3) < 10) and (math.abs(yposplayer1 - posy3) < 10)) 
or ((math.abs(xposplayer1 - posx4) < 10) and (math.abs(yposplayer1 - posy4) < 10)) 
and (id < (count - 10)) 

但這總是(幾乎)爲真。並且因爲有時候表中的值是零,它會給我一個錯誤,說它不能比較某個零值。

在此先感謝,Laurent

回答

1

您應該使用表格來組織這些值。使用一個表來表示職位,它包含一系列「座標」表。這樣你可以用for循環迭代所有的座標,並且確保表格中的每個項目代表座標對,你可以寫一些通用函數來測試其有效性。

function GetNewCoords(x_, y_) 
    x_ = x_ or 0 
    y_ = y_ or 0 
    return { x = x_, y = y_} 
end 

function CoordsAreValid(coords) 
    if (coords == nil) return false 
    return coords.x ~= 0 or coords.y ~= 0 
end 

local positions = {} 
table.insert(positions, GetNewCoords(5, 10)) 
table.insert(positions, GetNewCoords(-1, 26)) 
table.insert(positions, GetNewCoords()) 
table.insert(positions, GetNewCoords(19, -10)) 

for _, coords in pairs(positions) do 
    if (CoordsAreValid(coords)) then 
     print(coords.x, coords.y) 
    end 
end 
2

從刪除複製粘貼代碼開始。使用類似posy[n],而不是posy1posy2 ...而同爲其他:tableposy[n][id]代替tableposy1[id] ..

之後,你可以使用循環做比較,在同一行。您可以將比較重構爲在比較之前檢查nil的函數。

+0

你能給我一個這樣的循環和所謂的「無檢查」的例子嗎? – Laurent

相關問題