一. 硬件
- 黑金AX4010
- AN430显示屏(480*272)
- 蓝牙模块
- 安卓手机
采用app通过蓝牙模块来操作蛇的移动情况
二. 数据的存储
reg[18:0] Snake[0:7]; //蛇 18:10 x 9:1 y 0 :flag 是否是蛇身
reg[17:0] Food; // 食物
三. 蛇的移动的方向
- 通过上下左右来控制蛇移动的方向
- 上下左右的命令是app通过蓝牙发送过来的
//方向
always@(posedge clk or negedge rst)
beginif(rst == 1'b0)direct <= 2'b00;else if(up == 1'b1 && direct != 2'b01)direct <= 2'b00;else if(down == 1'b1 && direct != 2'b00)direct <= 2'b01;else if(left == 1'b1 && direct != 2'b11)direct <= 2'b10;else if(right == 1'b1 && direct != 2'b10)direct <= 2'b11;elsedirect <= direct;
end
四. 蛇的刷新
- 通过观察移动情况可以知道,蛇的当前节下一时刻的位置是前一节的当前位置。
- 蛇头除外,蛇头的位置需要根据方向来判断,然后计算
于是就有了如下代码
//刷新蛇 18:10 x 9:1 yelse if(speed >= SPEED)begincase(direct)2'b00:Snake[0][9:1] <= Snake[0][9:1] - 'd25;2'b01:Snake[0][9:1] <= Snake[0][9:1] + 'd25;2'b10:Snake[0][18:10] <= Snake[0][18:10] - 'd25;2'b11:Snake[0][18:10] <= Snake[0][18:10] + 'd25;endcasefor(i = 1;i<= sub_index ;i=i+1)Snake[i] <= Snake[i-1];end
五. 食物的刷新
- 当吃到食物之后,就刷新食物的位置,这里食物随机的数据不是很好,周期性重复,但不影响游戏的运行
//生成食物
always@(posedge clk or negedge rst)
beginif(rst == 1'b0)Food <= {9'd40,9'd50};else if(eated == 1'b1)Food <= {1'b0,Food[8]^Food[7]^Food[6]^Food[5],Food[7:1],1'b0,Food[16:10],Food[9]^Food[17]};
end
六. 蛇和食物的显示
- 这里采用极为简单的方式来显示,通过几个if else块来判断是否有显示
always@(posedge clk)
begin if(cur_x >= Snake[0][18:10] && cur_x < Snake[0][18:10] + 'd25 && cur_y >= Snake[0][9:1] && cur_y < Snake[0][9:1]+'d25 && cur_y >= Snake[0][9:1] && cur_y < Snake[0][9:1]+'d25 && Snake[0][0] == 1'b1)lcd_data_out = 24'hABCDEF;else if(cur_x >= Snake[1][18:10] && cur_x < Snake[1][18:10] + 'd25 && cur_y >= Snake[1][9:1] && cur_y < Snake[1][9:1]+'d25 && cur_y >= Snake[1][9:1] && cur_y < Snake[1][9:1]+'d25 && Snake[1][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Snake[2][18:10] && cur_x < Snake[2][18:10] + 'd25 && cur_y >= Snake[2][9:1] && cur_y < Snake[2][9:1]+'d25 && cur_y >= Snake[2][9:1] && cur_y < Snake[2][9:1]+'d25 && Snake[2][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Snake[3][18:10] && cur_x < Snake[3][18:10] + 'd25 && cur_y >= Snake[3][9:1] && cur_y < Snake[3][9:1]+'d25 && cur_y >= Snake[3][9:1] && cur_y < Snake[3][9:1]+'d25 && Snake[3][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Snake[4][18:10] && cur_x < Snake[4][18:10] + 'd25 && cur_y >= Snake[4][9:1] && cur_y < Snake[4][9:1]+'d25 && cur_y >= Snake[4][9:1] && cur_y < Snake[4][9:1]+'d25 && Snake[4][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Snake[5][18:10] && cur_x < Snake[5][18:10] + 'd25 && cur_y >= Snake[5][9:1] && cur_y < Snake[5][9:1]+'d25 && cur_y >= Snake[5][9:1] && cur_y < Snake[5][9:1]+'d25 && Snake[5][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Snake[6][18:10] && cur_x < Snake[6][18:10] + 'd25 && cur_y >= Snake[6][9:1] && cur_y < Snake[6][9:1]+'d25 && cur_y >= Snake[6][9:1] && cur_y < Snake[6][9:1]+'d25 && Snake[6][0] == 1'b1)lcd_data_out = 24'hFACDEB;else if(cur_x >= Food[17:9] && cur_x < Food[17:9] + 'd25 && cur_y >= Food[8:0] && cur_y < Food[8:0]+'d25 && cur_y >= Food[8:0] && cur_y < Food[8:0]+'d25)lcd_data_out = 24'hFACDEB;elselcd_data_out = 24'hffffff;
end
效果图如下 下载链接
关注微信公众号 FPGA之旅 回复 FPGA贪吃蛇免费获取