現(xiàn)在小孩子玩的最多的玩具就是手機了,不禁感慨,我們小時候都是咋過來的,有個游戲機,可以玩?zhèn)€貪吃蛇、俄羅斯方塊就不錯了??梢宰约涸O計個貪吃蛇游戲玩玩,重溫童年的經典,也讓現(xiàn)在小孩子知道,珍惜當下美好的生活。
功能實現(xiàn)說明:
此游戲較為簡單,沒有設置多余障礙物,只設置了四周的墻壁,貪食蛇所吃的蘋果隨機刷新,當蛇裝上墻壁或者自己的身體,游戲結束。
此游戲使用五個按鍵,利用Basys3上的按鈕,四個方向鍵,一個重新開始游戲按鈕,一個操作開關。使用7位數碼管進行計分,每吃到一個蘋果分數+1。使用VGA顯示游戲界面。
DIY動手指南:
Step1:材料準備
硬件:
Basys3開發(fā)板
VGA連接線及VGA顯示器一臺
軟件平臺:Vivado2016.4
Step2:系統(tǒng)框架
系統(tǒng)主要由6部分組成,分別是按鍵輸入模塊、控制模塊、數據路徑模塊、隨機生成 模塊、VGA顯示模塊和數碼管顯示模塊。
Step3:程序設計
上圖是本程序的RTL級視圖。
下面我們對于各個模塊進行分析。
1.鍵盤掃描
我們一共設置了五個按鍵,分別執(zhí)行up,down,left,right,restart這五個功能。
以up_key_press為例,介紹消抖的算法。
在每個時鐘高電平時并行執(zhí)行以下兩條語句
up_key_press<=0;
up_key_last<=0;
當有按鍵按下時,每100ms(cnt=5_0000) last=up,last輸出比up滯后一個周期,若up_key_last==0&&up==1,則說明按鍵按下,press輸出置1。
2.控制模塊
當打開開始開關并按下任意一個方向鍵時,游戲開始,當游戲結束時閃爍5下,重新開始游戲。
3.數據路徑模塊
cube_x,cube_y表示一整條蛇身體各節(jié)的格坐標。is_exist有16位,即蛇體最長為16*1格,每一位對應一個格,1為該格顯示,0則不顯示(圖中虛框)。每吃下一個蘋果蛇長度增加1,相應exist位置變?yōu)?。
蛇每次移動,對應的cube[x] = cube[x+1],即后一位的身子會移動到前一位的位置,蛇頭根據按下的按鈕來判斷是撞到了墻,還是撞到了身子,還是移動到了下一個位置。
當蛇頭和蘋果重合時,生成一個增加身長的信號,并在計數器上+1。
4.隨機生成模塊
采用偽隨機數的產生方法,比較笨拙。
每個時鐘周期random_num都在變,而我們吃下蘋果的時刻卻因走法、按鍵的時間等有所不同,所以不同時刻吃下蘋果后下一個蘋果出現(xiàn)的地方近似隨機~
5.VGA顯示模塊
使用640*480分辨率,需要分頻為25MHz的時鐘信號。
6.數碼管顯示模塊
當有增長身長信號產生時,分數也對應增加,數碼管動態(tài)掃描顯示分數。
Step4:演示