目前為止,被設計出來而又應用廣泛的算法有很多,如貪婪算法、遺傳算法和一些常用的排序算法等等。下面,向大家介紹游戲中用得最多的算法——排序算法。
我們知道,在游戲場景里,在近處的游戲角色會遮擋住遠處的角色。要做到這一點,一種方法是可以把所有的角色按它們的坐標值進行排序,然后以遠到近把玩家“放”入到游戲場景里。常用的排序算法有四種:選擇排序、冒泡排序、插入排序和快速排序。以下我們僅以最簡單的冒泡排序法為例來加深大家對算法的理解。
對一組有N個元素的數組,我們把它的每一個元素想象成一個泡泡。從最底部的元素開始,將各相鄰的元素進行比較,若下面的元素大于上面的元素時,則把它們的值進行交換,即較大的元素將“往上冒泡”。如此類推,我們將要進行N-1次的“冒泡”。template < class T >
void bubbli_sort( T a[], int n )
{
int i,j,last_pos;
i = n - 1;
while( i > 0 )
{
last_pos = 0;
for( j = 0; j < i; j++ )
{
if( a[j+1] < a[j] ){
T temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
last_pos = j;
}
}
i = last_pos;}}
二、游戲數據的大管家——數據結構
數據結構是什么呢?這是一個很抽象的概念,沒有統一的名詞解釋。你可以把它理解為數據在計算機中的組織形式。經典的數據結構,在網絡游戲中都能得到體現。下面我們為大家舉例并介紹。
1.道具包管理——線性表
在任何網絡游戲中,你的道具包里也會放著許多珍貴的道具。在程序中需要把這些數據組織起來,方便管理。使用線性表可以簡單方便地做到。線性表是一組元素以線性的結構組織起來,如(e1,e2,…en)。線性表一般分為數組與鏈表兩類。
數組里的元素以連續的內存空間存放,因此可以用內存地址檢索到對應的數據元素,訪問元素很方便。但如果要進行插入/刪除數據元素,就要做一些內存移動了,效率比較低。而鏈表的數據元素存放在任意的物理內存位置,相鄰的元素以指針作為“鏈扣”串連起來。如單向鏈表,元素e1有一個指針指向它的后繼節點e2,這個指針就是它們之間的“鏈扣”。當進行插入/刪除數據元素時,只要改變相應的“鏈扣”就可以,不需要做內存移動,效率相對于數組要高。
我在開始玩《夢幻西游》時,在城里走了幾圈就接了滿身的任務。這讓我很煩惱,不知從哪個任務開始做起,這時我想到了隊列。隊列是一種“先進先出(first-in-first out, FIFO)”的數據結構。就好像是在銀行里排隊,排在前面的先服務。每次接到任務就把該任務壓進任務隊列里,要做任務時就從任務隊列里取出一個任務,這樣哪個任務先接到就先做哪個任務。
也許你不喜歡這樣方式,你想做一個賞金獵人,哪個任務報酬多的就先做哪個任務。這樣普通的隊列就滿足不了你的需求了,你需要的是優先級隊列。優先級隊列在插入元素時,優先高的元素插入隊列前面。把任務的報酬設成是優先級數據,那么你每次在任務隊列里取出任務時,就能保證這個任務是你現接的任務里報酬最高的。
堆和棧在概念上不大一樣,這里所說的堆棧是指棧(stack)。棧是一種“先進后出”的數據結構。就好像是疊盤子,疊在最上面的盤子最先拿來使用。隊列和堆??赡苁鞘褂妙l率最高的數據結構了。在匹配表達式應用中,堆棧發揮了巨大的作用。還有經典的漢諾塔問題,如果沒有堆棧的幫助,你可不知道要搬碟子搬到什么時候了。這里我想舉一個Word的例子,這個例子比較形象。誰都會有失誤,在Word里發生了誤操作一點也不需要驚慌,因為Word有“撤消”的功能,可以撤消你之前的操作。把用戶的操作壓入棧里,要撤消操作時就從棧彈出最近發生的操作。這樣可以很方便地實現這個功能。
2019-04-01
2019-03-28
2018-09-09
2018-04-12
2018-03-29
2018-01-11
2018-01-11