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