先來幾個迷宮給大家玩一玩
![電子迷宮遊戲的製作-第0張](https://imgheybox.max-c.com/bbs/2024/05/29/9706925e0a96d299a6532b671655c55b/thumb.jpeg)
![電子迷宮遊戲的製作-第1張](https://imgheybox.max-c.com/bbs/2024/05/29/75ea56189ac7bdf32a23f41c45d226f6/thumb.jpeg)
![電子迷宮遊戲的製作-第2張](https://imgheybox.max-c.com/bbs/2024/05/29/cab23bd20646b97065a20df259e60a7a/thumb.jpeg)
是不是很簡單呢?別急,這只是簡單和普通模式,困難模式不好給大家玩,這個下面會介紹,接下來進入正題
硬件部分:該項目是用STM32G030F6P6作為主控芯片,控制OLED屏幕來實現的。
原理圖
PCB
原理圖部分,硬件比較簡單,由幾部分組成
- 一個STM32G030F6P6主控IC
- 一組復位電路
- 5個按鍵
- 一個5V轉3.3V的662k電路
- 一組用於USB type-c電路
6.一組燒錄接口
成品如下圖
成品正面
成品背面
接下來,就是軟件部分
首先用STM32 Cube MX配置好一組SPI和溫度傳感器,用來控制OLED,再配置若干個GPIO口作為按鍵引腳。如下圖所示
STM32引腳配置
配置完成後就開始寫代碼了,配置OLED初始化函數什麼的網上都有,這裡就講迷宮邏輯
首先判斷選擇的難度,如果是簡單,則分配5X5的區域,如果是普通或者困難,則分配成25X12個區域。再用線條畫出縱橫交錯的網格,把區域劃分出來,每個區域為5x5的像素點。如下圖所示
簡單模式
普通和困難模式
這裡我介紹一下困難模式的玩法,經常玩口袋妖怪寶石版的小夥伴應該對冠軍之路洞穴或者某些道館很有印象,就是那種只有一小部分視野的迷宮,如下圖所示
我做這個困難模式的靈感也取自於口袋妖怪,原理下面會講
介紹完這些,接下來就是介紹生成迷宮的思路了,在生成之前,要先設置路徑,實際原理就是消除掉特定的線,如圖A所示,比如說上一步是從上面下來的,現在要往左,現在的直線座標在紅線上,所以就要變換到黃色的線上,把它消除
圖A
這個迷宮的生成方式是先選定一個出口位置,然後一步一步走通,所以要先選定一個出口,在這裡,所有的迷宮都是隨機生成的,生成方式是調用STM32內置的溫度傳感器。其特點是速度越快,精度越低。所以正好可以利用這個特點,因為生成的速度肯定是越快越好,其次速度快,精度就低,產生的數就會越不穩定,就可以當成隨機數來使用了。
判斷出口的位置需要2次。先用隨機數判斷出口在哪一側,再判斷出口的具體位置。確定完位置後,就可以確定玩家起始位置了。在簡單和普通模式中,起始位置都是在出口斜對面,如圖B所示,比如出口是黃色,在第一排倒數第二個位置,則玩家起始位置在最後一排的第二個紅色的位置上。如果是困難模式,則玩家起點會在迷宮的正中間位置。
圖B
有了出口位置,就可以開始生成了,雖然是隨機數,但依然可能出現連續好幾個走同一方向的情況,如圖C所示
圖C
這樣就會大大降低難度,於是我規定簡單難度不能連續走兩步同一個方向,走一步後如果下一步依然是同一個方向,就跳過這次隨機數,直到隨機出不同的數為止。普通和困難的是不能連續走三步。在此,如果走到沒路了,就回到上一個區域,然後檢測該區域有沒有其他路可以走,當然,還是用隨機數。這個原理是:所有區域都在一個數組內,每個區域都用一個char變量表示,也就是8個位,高4位的每一位代表歷史路徑,比如說這個區域是從上面走下來的,就寫成0X80,歷史路徑只有一條,且無法更改。低4位為它接下來走的路,所以可能會走3條路,加上一條歷史的路,變成一個十字路口。如圖D所示。
圖D
另外由於之前說的,普通模式下,最多隻能走兩步,但是最多可能會有5個區域連成一條直線,如圖E所示,往左走後,由於沒路了,所以要後退回藍色圓圈的區域,再往右走兩步
如果這條路走過,就不會再走到這個點上,除非返回到那。如圖F所示,藍色圓圈的區域,看似有下左右能走,但因為左邊有走過了,所以無法再走,只能走下邊和右邊
生成完畢後玩家的移動就會依據每個區域的char變量來判斷,這樣就不會出現穿牆的現象。而困難模式下,地圖大小和普通的一樣,只是只能顯示玩家周圍的3個區域。原理是我先像普通難度那樣生成迷宮,然後創建一個數組,把迷宮存進去,生成玩家後再從數組裡找到它周圍的3個區域,再生成出來。
在簡單和普通難度下,玩家每次移動的時候只需要清除玩家當前位置,然後在下個位置生成出來就行。在困難模式下,玩家每次移動都會清除屏幕,然後確定玩家下一次的位置,並且從存儲迷宮的數組裡面找到玩家周圍3個區域的數據,一起顯示出來。
每走一步都會判斷,如果玩家位置和出口位置重疊,就會顯示成功的字符。
我,講完啦,篇幅有限,只是大概講了下思路,具體軟硬件我放在網盤裡了,想了解的歡迎大家自取
鏈接:https://pan.baidu.com/s/1o6NRfcAb0sk3RAWKW-50rg?pwd=2e2b
提取碼:2e2b