天天看點

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

@

目錄

起因

分析

畫線(棋盤)

畫迷宮

方塊移動

結語

先看效果圖(線上電腦嘗試位址http://biggsai.com/maze.html):

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲
我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

又到深夜了,我按照以往在<code>公衆号</code>寫着資料結構!這占用了我大量的時間!我的超越妹妹嚴重缺乏陪伴而 怨氣滿滿!

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

超越妹妹時常埋怨,認為資料結構這麼抽象難懂的東西沒啥作用,常會問道:天天寫這玩意,有啥作用。而我答道:能幹事情多了,比如寫個小遊戲啥的!

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

當我碼完字準備睡覺時:寫不好别睡覺!

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

如果用資料結構與算法造出東西來呢?

什麼東西簡單容易呢?我百度一下,我靠,這個鳥遊戲原來不好搞啊,得接觸一堆不熟悉的東西,搞不來搞不來。

有了(<code>靈光一閃</code>),寫個猜數字遊戲,問他加減乘除等于幾。

超越妹妹又不是小孩子,糊弄不過去。

經過一番折騰,終于在半夜12點确定寫迷宮小遊戲了。大概弄清楚其中的幾個步驟。

大概是:

畫線—&gt;畫迷宮(擦線)—&gt;方塊移動、移動限制(不出界不穿牆)—&gt;完成遊戲。

對于html+js(canvas)畫的東西,之前學過javaswing應該有點映像。在html中有個<code>canvas</code> 的畫布,可以在上面畫一些東西和聲明一些監聽(鍵盤監聽)。

對于迷宮來說,那些線條是沒有屬性的,隻有<code>位置x,y</code>,你操作這個畫布時候,可能和我們習慣的面相對象思維不一樣。是以,在你設計的線或者點的時候,記得那個點、線在什麼位置,在後續劃線還是擦線還是移動的時候根據這個位置進行操作。

實作效果

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

随機迷宮怎麼生成?怎麼搞?一臉懵逼。

因為我們想要迷宮,那麼就需要這個迷宮出口和入口有連通路徑,你可能壓根不知道迷宮改怎麼生成,用的什麼算法。小聲BB:用并查集(不相交集合)。

迷宮和不相交集合有什麼聯系呢?(<code>規則</code>)

之前筆者在前面資料結構與算法系列中曾經介紹過并查集(不相交集合),它的主要功能是森林的合并,不聯通的通過并查集能夠快速将兩個森林合并,并且能夠快速查詢兩個節點是否在同一個森林中!

而<code>我們的随機迷宮</code>:在每個方格都不聯通的情況下,是一個棋盤方格,這也是它的初始狀态。而這個節點可以跟鄰居可能相連,也可能不相連。我們可以通過<code>并查集</code>實作。

具體思路為:(主要了解并查集)

1:定義好不想交集合的基本類和方法(<code>search,union</code>等)

2:數組初始化,每一個數組元素都是一個集合,值為-1

3:随機查找一個格子(一維資料要轉換成二維,有點麻煩),在随機找一面牆(也就是找這個格子的上下左右),還要判斷找的格子出沒出界。

具體在格子中找個随機數m——&gt;随機數m在二維中的位置<code>[m/長,m%長]</code>——&gt;這個二維的上下左右随機找一個位置p<code>[m/長+1,m%長]</code>或<code>[m/長-1,m%長]</code>或<code>[m/長,m%長+1]</code>或<code>[m/長,m%長-1]</code>——&gt;判斷是否越界

4:判斷兩個格子(一維數組編号)是否在一個集合(并查集查找)。如果在,則重新找,如果不在,那麼把牆挖去

5:把牆挖去有點繁瑣,需要考慮奇偶判斷它那種牆(上下還是左右,還要考慮位置),然後擦掉。(根據數組轉換成真實距離)。具體為找一個節點,根據位置關系找到一維數組的号位用并查集判斷是否在一個集合中。

6:最終得到一個完整的迷宮。直到第一個(1,1)和(n,n)聯通停止。雖然采用随機數找牆,但是效果并不是特别差。其中要搞清一維二維數組的關系。一維是真實資料,并查集操作。二維是位置。要搞懂轉化!

注意:避免混淆,搞清數組的位址和邏輯矩陣位置。數組從0開始的,邏輯上你自己判斷。别搞混淆!

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

主要邏輯為:

那麼在前面的代碼為

實作效果:

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲
我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

這部分我采用的方法不是動态真的移動,而是一格一格的跳躍。也就是當走到下一個格子将目前格子的方塊擦掉,在移動的那個格子中再畫一個方塊。選擇方塊是因為方塊更友善擦除,可以根據像素大小精準擦除。

另外,再移動中要注意不能穿牆、越界。那麼怎麼判斷呢?很好辦,我們再前面會判斷兩個格子是否聯通,如果不連通我們将把這個牆拆開。再拆的時候把這個牆的時候記錄這兩點拆牆可走即可(數組)

另外,事件的監聽上下左右查一查就可以得到,添加按鈕對一些事件監聽,這些不是最主要的。

為了豐富遊戲可玩性,将方法封裝,可以設定關卡(隻需改變迷宮大小)。這樣就可以實作通關了。另外,如果寫成動态存庫那就更好了。

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲

線上嘗試位址,代碼直接檢視網頁源代碼即可!

筆者前端能力和算法能力有限,寫的可能不是特别好,還請見諒!當然,筆者歡迎和一起熱愛學習的人共同進步、學習!歡迎關注筆者公衆号:bigsai,如果感覺不錯,歡迎關注、點贊!蟹蟹!

我用資料結構花了一夜給女朋友寫了個h5走迷宮小遊戲