路亞函式庫

由於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

成員函式 

empty
佇列是否為空,是的話回傳 true 否則回傳 false
size
回傳目前佇列的大小,也就是目前有幾個數字在裡面
top
回傳頂端元素(也就是目前佇列內的最大值)
push
將一個數字放入佇列中
pop
移除頂端元素(也就是移除目前住列內的最大值)




"stack.lua"

堆疊(維基百科)

堆疊是容器的一種,就像一個罐子一樣,最後放進去的東西會在最上面。

常用於反轉一個數列。

簡單示意:

一開始為空:

      
      
      
     
└---┘

丟入 1 --push(1)

│      
      
      
  1  
└---┘

丟入 2  --push(2)

│      
      
  2  
  1  
└---┘

丟入 3  --push(3)

│      
  3  
  2  
  1  
└---┘

取得頂端元素 --top()


     
│      
  3  
  2  
  1  
└---┘

移除頂端元素 --pop()


│            │      
  3              
  2    →   2  
  1          1  
└---┘      └---┘ 


成員函式

empty
堆疊是否為空,是的話回傳 true 否則回傳 false
size
回傳目前堆疊的大小,也就是目前有幾個數字在裡面
top
回傳頂端元素(也就是最後放入的數值)
push
將一個數字放入堆疊中
pop
移除頂端元素(也就是移除最後放入的值)




Compeador,
2015年10月23日 清晨5:26
v.1
Compeador,
2015年10月23日 清晨5:41
v.2
Author profile image
Ka Kit Lau
Nov 21, 2015, 11:25:26 PM
好清晰o3o