FPGA实现 贪吃蛇

简介: 笔记

一. 硬件


黑金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)
begin
  if(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;
  else
  direct <= direct;
end



四. 蛇的刷新


通过观察移动情况可以知道,蛇的当前节下一时刻的位置是前一节的当前位置。

蛇头除外,蛇头的位置需要根据方向来判断,然后计算

于是就有了如下代码

//刷新蛇 18:10 x   9:1  y
  else if(speed >= SPEED)
  begin
  case(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;
  endcase
  for(i = 1;i<= sub_index ;i=i+1)
    Snake[i] <= Snake[i-1];
  end


五. 食物的刷新


当吃到食物之后,就刷新食物的位置,这里食物随机的数据不是很好,周期性重复,但不影响游戏的运行
//生成食物
always@(posedge clk or negedge rst)
begin
  if(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;
  else
  lcd_data_out = 24'hffffff;
end


效果图如下 下载链接

关注微信公众号 FPGA之旅 回复 FPGA贪吃蛇免费获取

56.jpgimage.jpeg

公众号:FPGA之旅

目录
相关文章
|
定位技术 异构计算
|
存储 算法 定位技术
|
异构计算
FPGA项目二:4位闪烁灯设计(下)
FPGA项目二:4位闪烁灯设计
165 1
FPGA项目二:4位闪烁灯设计(下)
|
异构计算
|
异构计算
【FPGA的小娱乐】在tft显示屏上画X型
【FPGA的小娱乐】在tft显示屏上画X型
106 0
【FPGA的小娱乐】在tft显示屏上画X型
|
芯片
蓝桥杯嵌入式之 LED 闪烁
蓝桥杯嵌入式之 LED 闪烁
401 0
|
Linux
ARM6818开发板输入设备(触摸屏)操作(开发五子棋游戏)
ARM6818开发板输入设备(触摸屏)操作(开发五子棋游戏)
462 0