[Scratch] 隨機迷宮小精靈 (Random Maze Pacman) 遊戲
最近算是難得的 Scratch 興致大爆發,
接連寫了好幾個 Scratch 遊戲,像是之前的:
今天又寫了「隨機迷宮小精靈」遊戲,
覺得算是蠻有挑戰性的一個題目吧~
原本我想做的是可以隨機產生一個迷宮,
但一定要有一條路線可以從起點走到終點,
光是這個條件,就難倒我許久了…
(演算法學得很差,對不起大學教授們…)
試了半天,後來終於試出一個不是很效率的方法,
那就是我先從一個固定的起點 (左下角) 開始,
隨機找左右上下四個方向移動,
如果目標點沒有被占掉的話,就允許產生一個分支延伸到那點。
然後允許從這兩點隨機選一點出發,一樣上下左右延動。
也就是說,最後我會製造出從左下角長出來的一棵隨機樹。
同樣的,我從右上角出發,一樣長出一顆隨機樹。
利用陣列 (Scratch 裡的清單),我把它們分別用 1 和 2 標記,
並要求 1 和 2 這兩類節點,至少要接觸 2 次以上,
保證迷宮至少有兩條路線可以從起點到終點。
(因為發現只有一條路線的話,太容易卡死)
使用這個方法,可以製造出隨機的迷宮,每次都會不一樣:
(這裡我讓左下角和右上角延伸出來的樹,
使用不同的顏色,方便觀察他們的接觸點,
實際程式會讓顏色都是一樣的)
我用的這個方法並不是很有效率,
因為它可能會常常隨機選到一點,那點的四個方向都不能再延伸出去…
最極端的狀況,就是每次隨機選點時都選到同一點,
那可能這棵樹就永遠建不出來…
不過幸好目前還不太常遇到這情況,
但是如果要求接觸點要增加的話,就可能會遇到問題,
因為可能根本就沒有空間可以再讓這兩棵樹接觸了…
另外在產生迷宮時的一個問題,
就是它產生的很慢,你可以看到它一步一步產生每個分支,
雖然那樣也是有個不錯的效果,
但對迷宮而言,產生的時間太久了,要耗掉好幾秒鐘…
後來發現,是因為我用畫筆畫每一條線時,可能都在重繪螢幕…
於是我將主要程式放到一個 Main 函式裡,
然後將這函式設定成 Run without screen refresh,
也就是執行時不要重繪螢幕,
產生迷宮的速度就變成飛快的了:
雖然可以產生迷宮了,但其實它的難度太低…
產生迷宮的難度對我來說頗高,
但是產生出來的迷宮,幾乎是一眼就能看出來路線怎麼走…
因此決定把它改成類似「小精靈」的遊戲,
隨機產生一些禮物和怪物,
使用者必須操控主角企鵝,去吃掉所有的禮物來過關:
在改成小精靈遊戲的時候,遇到的另一個問題是,
「什麼情況才能往這方向移動?」
原本在迷宮陣列裡,我只用了三種標記:
0 代表不是路、1 代表從左下角延伸出來的、2 代表從右上角延伸出來的,
但就算是這格子裡是 1,右邊也是 1,也不代表它一定可以往右走過去
(因為迷宮的路線可能是「↑→↓」才能到右邊那格)…
於是我又存了另一個陣列,
在建立迷宮時,把每次產生的分支起點和終點都存起來。
這樣在使用者操控主角時,就會根據目前的位置,
來找尋有接觸到目前點的分支,就知道能不能移掉到指定方向了~
有興趣的人,
可以來玩一下這個 隨機迷宮小精靈 (Random Maze Pacman) 遊戲喔~