【友晶】基于FPGA的贪吃蛇游戏设计(七)——食物(苹果)的产生

13 篇文章 0 订阅
12 篇文章 2 订阅

食物产生模块完成的任务是:每次初始化就给定一个食物坐标比如(24,10),然后蛇运动的过程中用蛇头坐标跟食物坐标对比是否重合来判断是否吃掉了食物,如果相同食物就被吃掉,然后由随机数产生新的食物坐标。

单元划分

蛇要吃掉的食物大小为16*16个像素(蛇头大小也是16*16, 蛇身每一节大小也是16*16)。

显示器分辨率是640*480,假设16*16算作一个单元,那么640*480可以看作是40*30个单元的一个长方形。这些单元的坐标范围是[39:0],[29:0];去掉墙壁厚度(墙壁占用一个单元的厚度),食物可产生的坐标范围为:[38:1],[28:1]。

代码设计

1 产生分数累加信号

当蛇头坐标和食物坐标相同时,表示蛇吃掉一个食物,就将 add_cube 信号置1,然后产生新的食物坐标,当新的食物坐标产生以后,在时钟的下一节拍下add_cube信号又被置0,等待下次坐标再次相同:

2 产生随机数

这里用加法产生随机数。

random_num寄存器没有初始化,所以它的初始值是不确定的,然后随着每次吃食物的时间不确定性,random_num+999就是一个非常具有随机数特征的数。

每当蛇吃掉一个食物,就要同时产生一个新的食物,游戏中采用随机数高六位为食物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的完整代码如下:

//食物(苹果)产生控制模块
//初始化给定一个食物坐标,输入蛇头坐标跟食物坐标对比来判断是否吃掉食物,如果被吃掉,就产生新的苹果坐标
module apple_generate(
  input clk,  //时钟25MHz
  input rst_n,//系统复位
  
  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;  //用加法产生随机数  
    //随机数高六位为食物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    //判断随机数是否超出频幕坐标范围 将随机数转换为下个苹果的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

贪吃蛇系列连载文章:

  ​
1. 基于FPGA的贪吃蛇游戏设计(一)

2. 基于FPGA的贪吃蛇游戏设计(二)——数码管驱动模块

3. 基于FPGA的贪吃蛇游戏设计(三)——计分模块

4. 基于FPGA的贪吃蛇游戏设计(四)——VGA驱动模块色块显示

5. 基于FPGA的贪吃蛇游戏设计(五)——VGA驱动模块字符显示

6. 基于FPGA的贪吃蛇游戏设计(六)——VGA驱动模块图片显示

7. 基于FPGA的贪吃蛇游戏设计(七)——食物(苹果)的产生

8. 基于FPGA的贪吃蛇游戏设计(八)——状态机设计

9. 基于FPGA的贪吃蛇游戏设计(九)——蛇身控制

关注“友晶Terasic”公众号可获取源码下载地址。

移植到DE1-SOC、DE2-115时代码无需改变,只需修改引脚分配即可。

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值