由於Lua裡面已經有一些可以用的現成函式,所以種類可能較同人陣少。 這裡提供了Lua沒有但是其他語言(如C++)卻有的方便函式來使用。 函式庫的引用 如果您想要在您的主程式(通常為 main.lua )使用函式庫,請複製下面程式碼並在主程式 最開頭 貼上 。 if priority_queue == nil then --如果 priority_queue尚未被引用 dofile("priority_queue.lua")-- 引用 priority_queue dofile("stack.lua")--順便引用 stack,也可以再引用其他函式end 如何使用 priority_queue / stack 這類的STL container (容器) ? 像是stack(堆疊) / prioriet queue (優先佇列) 是一種特別的資料型別,每個都具有其特色; 例如 : 優先佇列的第一個數值(頂端元素) 永遠是最大的 ;stack則像是罐子,最慢丟進去的東西在最上面(頂端元素)。 要使用之前,您必須先宣告容器的名稱,就和變數一樣,只不過多了點小花樣: can_can = stack.new() (名稱) = (型別) .new() name = data_struct_type.new() 當然,這些東西不是放著當花瓶的,裡面有提供一些功能來進行操作;操作這些特殊型別的功能稱為成員函式。 最簡單、容易理解的成員函式莫過於 push() 了,如果要把一樣東西(假設數字為 5 ) 丟入 容器中(上面已宣告 can_can ) 則是: can_can : push(5) (名稱) : (要執行的動作/函式)( (參數,如果需要的話) ) name:function(parameter) 值得注意的是,並不是所有成員函式都需要參數;例如: 取得頂端元素 .top() 中就不需要參數,但為了讓電腦知道我們是要執行函式,所以必須加上' ( ) ' ,但不用放東西在裡面。 下面的程式碼結合了優先佇列和堆疊的特性: 利用優先佇列將視野內敵人的生命值放入優先佇列,之後利用堆疊先入後出的特性將敵人生命值由小到大輸出 (如果沒有經過堆疊直接輸出會是由大到小) --引用函式庫if priority_queue == nil then --如果優先佇列尚未被引用 dofile("priority_queue.lua")--引用優先佇列 dofile("stack.lua")--順便引用堆疊 prio_scan_delay=0 -- 設定掃描冷卻時間(見下面)endenemies = game.findVisibleEnemies() -- 尋找視野內的敵人if #enemies > 1 and prio_scan_delay < game.now then --如果敵人數量大於1,而且掃描冷卻時間已完成 hp_list = priority_queue.new() -- 宣告優先佇列,名稱 :生命列表 print_hp = stack.new()--利用堆疊反向輸出生命列表內容 for i,found in ipairs(enemies) do hp_list : push(found.hp) -- 將敵人的生命值丟入優先佇列內 end prio_scan_delay = game.now + 3000 --設定再次掃描冷卻時間3秒 while hp_list:empty() == false do -- 如果生命列表還有東西 print_hp:push(hp_list:top()) -- 將目前最大的數值丟入堆疊內 hp_list:pop()--移除優先佇列內最大的數值 (也就是說,下一個就是第二大的 ) end game.log("start print")--開始輸出 while print_hp:empty() == false do -- 如果堆疊內還有東西 game.log(print_hp:top())--輸出堆疊最上面的東西 print_hp:pop()--把堆疊最上面的東西移除 end game.log("end print")--輸出完畢end 下面圖片是執行的結果: 在路亞思路中,將目前看到的敵人生命值由小到大顯示。 ![]() 舉這個超級明顯的例子大概能猜到要用優先佇列作什麼了吧XD~ 下方開始介紹功能以及可使用的函氏成員 "priority_queue .lua" 優先佇列 (複雜版:維基百科) 優先佇列可以將儲存一堆數字,就像陣列一樣。 其特色為:數列中的第一個數字必為最大值。 舉例: 一個數列:{1,9,4,6,3} 依序放入優先佇列後會變為: {9,6,4,1,3} 我們可以利用這個性質進行排序: 每次取出最大值,直到最後一個被取出,佇列為空時,取出的順序必然是有順序的數列。 拿上面的例子開刀(結合堆疊): 優先佇列:{9,6,4,1,3} 堆疊:{} ↓ 優先佇列:{x,6,4,1,3} -> {3,6,4,1} -> {6,3,4,1} 堆疊:{9,} ↓ 優先佇列:{x,3,4,1} -> {1,3,4} -> {4,3,1} 堆疊:{6,9} ↓ 優先佇列:{x,3,1} -> {1,3} -> {3,1} 堆疊:{4,6,9} ↓ 優先佇列:{x,1} -> {1}(剩下一個,直接取出) 堆疊:{3,4,6,9} -> {1,3,4,6,9} ↓ 優先佇列:{} 取出:{1,3,4,6,9} 如果不斷輸出堆疊頂端元素(位於第一個位置的數字) 直到堆疊為空: 輸出: 1,3,4,6,9 成員函式
"stack.lua" 堆疊(維基百科) 堆疊是容器的一種,就像一個罐子一樣,最後放進去的東西會在最上面。 常用於反轉一個數列。 簡單示意: 一開始為空: │ │ │ │ │ │ │ │ └---┘ 丟入 1 --push(1) │ │ │ │ │ │ │ 1 │ └---┘ 丟入 2 --push(2) │ │ │ │ │ 2 │ │ 1 │ └---┘ 丟入 3 --push(3) |
Lua-路亞修行 >
路亞函式庫
Ka Kit Lau
Nov 21, 2015, 11:25:26 PM
好清晰o3o
