第一個函數是生成 16 個隨機列表的函數 generatelist。
它的具體代碼如下:
on generatelist
global gempty,randomlist
set randomlist = []
repeat with x = 1 to 16
addat(randomlist,random(x),x)
end repeat
end
因為 lingo 沒有提供對列表隨機排列的功能,所以這里使用了來自 tab julius 先生的《lingo !高級指南》中的一段代碼,它非常巧妙地通過循環語句中使用 addat(),random()函數生成隨機列表。它在循環中先隨機產生列表位置,并將其賦予 1-16 中的值,當 addat()函數向列表中相同位置添加值時,它會將位置推后,這種特殊的工作方式將不會出現重復現象。
第二個函數也是最重要的一個函數 exchange()。 它有一個參數, . 此參數為通道號。當在一個與空白垂直或水平相鄰的拼圖上單擊時,應將二者的角色對換,即,空白所在的通道將角色換為被單擊的通道的角色,而單擊的通道的角色換為空白。并將被單擊的通道號賦予標識空白所在通道的變量 gempty。函數中的變量 x 為臨時變量,用于作替換時暫存數據。
on exchange n
global gempty
set x to the membernum of sprite gempty
set the membernum of sprite gempty to the membernum of sprite n
set the membernum of sprite n to x
updatestage
set gempty = n
end
此函數用在每個循環幀中 1-16 號通道,用法如下:
on mouseup
if inlist(1) then
exchange 1
puppetsound "click"
end if
end
這里用到了另一個編寫的函數 inlist(),此函數用于判別當前被單擊的通道是否在可移動列表 m 中,如果是在列表 m 中,則返回 true。
函數 inlist() 代碼如下:
on inlist cnt
set countnum = count(m)
repeat with x = 1 to countnum
if cnt = getat(m,x) then
return true
exit repeat
end if
end repeat
end
其中m 為當前可移動通道號列表,首先函數使用count()函數計算列表 m 中成員的個數,并將其賦予變量 countnum,變量 countnum 為循環檢測的終止變量。循環語句中,判定 inlist() 的參數 cnt 是否在列表 m 中。如果在其中,則返回 true,并退出循環。
另外一個函數是 move(),它將返回當前可移動通道列表。
on move sth
return getat(mlist,sth)
end
它根據空白所在通道號來返回當前可移動拼圖通道號列表。這里我使用了一個二維列表 mlist = [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16],其中 m1,m2,m3, ……為空白在 1,2,3,4,5, …..時,可移動通道號列表。舉例,如第一張圖,當空白處為 16 號通道,可以移動的通道為 12 和 15 ,即,m16 = [12,15]。所有這些列表將在on startmovie 事件句柄中初始化。具體代碼如下:
on startmovie
global gempty,randomlist,first,finish,tmp,m1,m2,m3,m4,m5,
m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,mlist,m
set m = []
set tmp = []
set finish = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
set m1 = [2,5]
set m2 = [1,3,6]
set m3 = [2,4,7]
set m4 = [3,8]
set m5 = [1,6,9]
set m6 = [2,5,7,10]
set m7 = [3,6,8,11]
set m8 = [4,7,12]
set m9 = [5,10,13]
set m10 = [6,9,11,14]
set m11 = [7,10,12,15]
[1] [2] 下一頁
新聞熱點
疑難解答