Terasic
基于FPGA的貪吃蛇游戲設(shè)計之食物(蘋果)產(chǎn)生
DE10-Standard/DE1-SoC/DE2-115
食物產(chǎn)生模塊完成的任務(wù)是:每次初始化就給定一個食物坐標(biāo)比如(24,10),然后蛇運動的過程中用蛇頭坐標(biāo)跟食物坐標(biāo)對比是否重合來判斷是否吃掉了食物,如果相同食物就被吃掉,然后由隨機數(shù)產(chǎn)生新的食物坐標(biāo)。
單元劃分
蛇要吃掉的食物大小為16*16個像素(蛇頭大小也是16*16, 蛇身每一節(jié)大小也是16*16)。
顯示器分辨率是640*480,假設(shè)16*16算作一個單元,那么640*480可以看作是40*30個單元的一個長方形。這些單元的坐標(biāo)范圍是[39:0],[29:0];去掉墻壁厚度(墻壁占用一個單元的厚度),食物可產(chǎn)生的坐標(biāo)范圍為:[38:1],[28:1]。
代碼設(shè)計
1產(chǎn)生分數(shù)累加信號
當(dāng)蛇頭坐標(biāo)和食物坐標(biāo)相同時,表示蛇吃掉一個食物,就將 add_cube 信號置1,然后產(chǎn)生新的食物坐標(biāo),當(dāng)新的食物坐標(biāo)產(chǎn)生以后,在時鐘的下一節(jié)拍下add_cube信號又被置0,等待下次坐標(biāo)再次相同:
2產(chǎn)生隨機數(shù)
這里用加法產(chǎn)生隨機數(shù)。
random_num寄存器沒有初始化,所以它的初始值是不確定的,然后隨著每次吃食物的時間不確定性,random_num+999就是一個非常具有隨機數(shù)特征的數(shù)。
每當(dāng)蛇吃掉一個食物,就要同時產(chǎn)生一個新的食物,游戲中采用隨機數(shù)高六位為食物x的坐標(biāo),低五位為食物y坐標(biāo)。
生成食物坐標(biāo)的代碼如下:
如果 apple_x滿足條件 random num[10:5]> 38(代表食物x坐標(biāo)與顯示器最右邊邊框重合),那apple_x值就取 random num[10:5]- 25,如果apple_x不滿足條件random num[10:5]> 38,就看apple_x滿不滿足 random_num[10:5]==0(代表食物x坐標(biāo)與顯示器最左邊邊框重合),如果apple_x滿足random_num[10:5]==0,apple_x就取1,否則apple_x就取random_num[10:5]。
apple_y 同理。
3完整代碼
apple_generate.v的完整代碼如下:
//食物(蘋果)產(chǎn)生控制模塊 //初始化給定一個食物坐標(biāo),輸入蛇頭坐標(biāo)跟食物坐標(biāo)對比來判斷是否吃掉食物,如果被吃掉,就產(chǎn)生新的蘋果坐標(biāo) module apple_generate( input clk, //時鐘25MHz input rst_n,//系統(tǒng)復(fù)位 input [5:0]head_x,//蛇的頭部x軸坐標(biāo) input [5:0]head_y,//蛇的頭部y軸坐標(biāo) output reg [5:0]apple_x,//蘋果的x軸坐標(biāo) output reg [4:0]apple_y,//蘋果的y軸坐標(biāo) output reg add_cube//蛇吃掉一個蘋果標(biāo)志 ); reg [31:0]clk_cnt; reg [10:0]random_num;//寄存器沒有初始化 always@(posedge clk) random_num <= random_num + 999; ?//用加法產(chǎn)生隨機數(shù) ? ? ?//隨機數(shù)高六位為食物x的坐標(biāo),低五位為蘋果Y坐標(biāo) ? ?always@(posedge clk or negedge rst_n) begin ? ?if(!rst_n) begin ? ? ?clk_cnt <= 0; ? ? ?apple_x <= 24; ? ? ?apple_y <= 10; ? ? ?add_cube <= 0; ? ?end ? ?else begin ? ? ?if(apple_x == head_x && apple_y == head_y) begin//當(dāng)蛇頭坐標(biāo)和蘋果坐標(biāo)一樣時,表示蛇吃掉一個蘋果 ? ? ? ?add_cube <= 1; ? ? ? ?apple_x <= (random_num[10:5] > 38) ? (random_num[10:5] - 25) : (random_num[10:5] == 0) ? 1 : random_num[10:5]; apple_y <= (random_num[4:0] > 28) ? (random_num[4:0] - 3) : (random_num[4:0] == 0) ? 1:random_num[4:0]; end //判斷隨機數(shù)是否超出頻幕坐標(biāo)范圍 將隨機數(shù)轉(zhuǎn)換為下個蘋果的X Y坐標(biāo) //如果 apple_x滿足條件 random num[10:5] > 38,那apple_x值就取 random num[10:5] - 25 //如果apple_x不滿足條件random num[10:5] > 38,就看apple_x滿不滿足 random_num[10:5] == 0, //如果apple_x滿足random_num[10:5] == 0,apple_x就取1, 否則apple_x就取random_num[10:5] //random num[10:5] > 38是蘋果x坐標(biāo)到顯示器最右邊(邊框) //random_num[10:5] == 0是蘋果x坐標(biāo)到顯示器最左邊(邊框) //apple_y 同理 else add_cube <= 0; ? ? ?end ? ?end endmodule
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603385 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120365 -
游戲
+關(guān)注
關(guān)注
2文章
742瀏覽量
26317
原文標(biāo)題:基于FPGA的貪吃蛇游戲設(shè)計(七)——食物(蘋果)的產(chǎn)生
文章出處:【微信號:友晶FPGA,微信公眾號:友晶FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論