陣列在遊戲開發中的應用

很多遊戲,像Tetris(俄羅斯方塊)、Sokoban(推箱子)的邏輯實現都是依靠對資料的操縱,把離散的資料用資料結構儲存起來,就能對其做很多事情。

比如在Tetris中,我們可以把每一塊離散的空間都放到一個二維陣列裡面,然後給陣列裡面的每一個元素一個ASCII,比如#表示方塊,.表示空位置。方塊旋轉的時候可以乘以一個2d旋轉矩陣,然後讓方塊轉動到對應的位置;當有一行全部被#擠滿的時候,那一行將被刪除,並且在上面的所有方塊往下移動一格。然後我們可以把這個二維陣列用繪圖API畫出來。

再比如Sokoban,我們可以用@表示玩家,#表示牆壁,O表示箱子,^表示坑。然後基於二維陣列進行各種邏輯上的處理,比如要讓玩家移動,要保證玩家前面不能有牆壁,舉一個簡單的例子,這裡用lua

local map = [] for width = 1; i = maxWidth do -- lua的table自增從1開始! map[width] = [] end -- 省略一些初始化過程~ -- ... -- 如果玩家的左側沒有牆壁,那麼玩家就向左移動一格 if map[player.x - 1][player.y] ~= "#" then player.x = player.x - 1 end

只要你掌握了怎麼操縱陣列,那麼對於很多功能的實現就會變得非常簡單!像關卡生成或者尋路演算法等等,都需要對資料進行各種操縱。

甚至關卡編輯器我們也可以使用各種格子。

在SHENZHEN I/O中,玩家如果要製作自己的關卡,就要自己寫lua,其中關卡編輯器就是一個asciiMap!玩家把地圖用ascii的方式打成字串,然後後臺就會把這個table拿去解析成一個二維陣列。

我自己用一些比較原始的遊戲引擎做遊戲的時候,也喜歡寫asciiMap,然後解析成二維陣列,進而寫一些邏輯。

再比如尋路演算法,如果你的遊戲地圖是用二維陣列表示的,那麼就能通過操縱各種資料來實現尋路。這裡我們用一個叫做BFS的演算法。

使用BFS需要一個Quene,我們簡略畫一個地圖。其中下面的@是玩家,E是敵人,#是牆壁,.是空地

E..#..@ ..#.#.. .......

首先我們要建立另一個二維陣列,#標記為-9999,空地標記為0,@標記為0,E自身是9999。在@的位置對四周非-9999的進行標記,此輪標記為1,然後把標記為1的位置記錄到Quene,Quene的原則是先進先出。

E..#.1@ ..#.#.1 .......

接下來就可以對1的這個位置做剛才一樣的事情,但是我們是從Quene裡面提取的位置,直到Quene沒有東西為止。之後的asciiMap應該大致如此:(x表示10,因為這裡放不下了)

E9x#21@ 98#6#21 8765432

然後E(敵人)就可以找周圍更小一點的數,如果更小就走這一格,最後就能走到玩家的位置。

再比如Solitaire(單人紙牌),像蜘蛛紙牌/空當接龍之類的,也很需要對陣列進行操縱

Solitaire有很多行,很多列,然後每一個元素裡面存一個數字,數字表示對應的牌,舉個簡單的例子:

1 8 15 2 9 16 3 10 17 4 11 18 5 12 19 6 13 20 7 14 21

隨便打了一點,當然正常Solitaire是隨機的,亂序的,不像我這麼整齊。

我們都知道,撲克牌一共四種花色,每種花色13張牌,我們就可以1-13一個花色;14-26一個花色以此類推。

再然後我們可能要堆疊牌,比如我們要把紅桃7放到紅桃8上面,這裡紅桃是1-13,那麼我們要判斷當前牌的id+1是否等於要放到的牌上面(是否等於8)

總結

所以對於很多遊戲來說,陣列是一個很強大的工具!如果你能很好的用在你的遊戲上,這會很有幫助!

隨便看看 更多