ArduinoUNO和8x8点阵做个贪吃蛇游戏

哈喽,各位看官,小编终于抽出时间写程序发文章了。上次发文还是初秋,天还暖着呢,这次就是冬天了,希望下一篇文章不会等到春天……
在这里插入图片描述
视频链接: https://b23.tv/6K5Bie

早在两个月前,小编就入手了两个硬件:8x8点阵屏和大按键模块,而且内容都想好了,就做一个贪吃蛇——是的就是用Arduino和点阵屏做一个贪吃蛇游戏!

那今天就跟大家唠叨一下这个贪吃蛇游戏的设计思路吧,文末有源代码获取方式哦~~

前 期 准 备

1.硬件准备

这个好像是废话了,不过小编还是要提醒一下,这里用的是8x8点阵模块,是用MAX7219作为显示驱动器的,只需要5个引脚就搞定了。

除了VCC和GND以外,还有DIN、CS、CLK,分别连接到Arduino UNO的12、11、10引脚
另外大按键模块的引脚连接方式如下:
大按键模块 Arduino UNO
GND ------------- GND
VCC ------------- 5V
SW1 ------------- 5
SW2 ------------- 4
SW3 ------------- 3
SW4 ------------- 2
引脚连接好以后,别忘了在程序中设置引脚号和输入输出模式~~

2.下载库文件

小编用的是LedControl这个库,可以在ArduinoIDE中下载也可以在github上下载:https://github.com/wayoda/LedControl,然后把库文件放在Arduino安装目录的libraries库文件夹里,然后就可以在程序中导入LedControl库并且创建点阵屏对象,引用其中的程序点亮点阵屏咯

程 序 设 计

整个程序设计流程:初始化➨倒计时➨按键检测➨蛇前进、吃食物、蛇增长➨死亡检测(撞墙和自杀)➨画蛇和食物➨游戏结束
在这里插入图片描述

1.蛇前进和增长

蛇的前进和增长是整个程序设计的关键,我在程序中定义了snakeX[]和snakeY[]数组作为蛇的x坐标和y坐标,然后将两个数组的第一个元素设置为蛇头,那么蛇在移动的过程中就要不断的移动坐标数组,当然不必全部移动,只要移动蛇身长度的数组就可以了
蛇身移动完了,还有蛇头呢,蛇头是要不断获得一个新的位置的,当蛇头的位置和食物的位置相同时就是蛇吃到食物了,此时蛇身增长,食物也要随机产生新的位置。

void snakeRun() {
  //移动蛇的坐标
  for (int i = snakeLong; i > 0; i--)
  {
    snakeX[i] = snakeX[i - 1];
    snakeY[i] = snakeY[i - 1];
  }
  //设置蛇头的位置
  switch (snakeAdd) {
    case UP:   snakeX[0]--; break;
    case DOWN: snakeX[0]++; break;
    case LEFT: snakeY[0]--; break;
    case RIGHT: snakeY[0]++; break;
  }
  //蛇吃到食物
  if (snakeX[0] == foodX && snakeY[0] == foodY)
  {
    snakeLong++;//蛇身增长
    createFood();//产生新的食物坐标
  }
}
2.死亡检测

蛇的死亡检测还是比较简单的,分两种情况判断,一种是当蛇头超出点阵屏时,也就是撞墙了;另一种是蛇头撞到了自己的身体,这里直接从蛇身为3的情况开始判断的,小于3也没有机会撞到自己的身体吧
根据这两种情况,直接改变布尔类型的标志变量gameOver的状态就可以控制游戏结束了!

void deadCheck() {
  //撞墙检测
  if (snakeX[0] > 7 || snakeX[0] < 0 || snakeY[0] > 7 || snakeY[0] < 0)
  {
    gameOver = false;
  }
  //蛇头撞到自身检测
  for (int i = 3; i < snakeLong; i++)
  {
    if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0])
    {
      gameOver = false;
    }
  }
}
3.画蛇和食物

这段代码就直接调用LedControl库里的setLed语句就可以了,根据横坐标和纵坐标控制点阵屏上的点的亮灭状态,不过小编最开始直接用了清除屏幕的语句,但是出现了光电闪烁不定的情况,所以就机智的改变了方法:只控制好蛇尾走过后的点熄灭就可以了

void drawSnake() {
  lc.setLed(0, foodX, foodY, 1);
  for (int i = 0; i < snakeLong; i++)
  {
    lc.setLed(0, snakeX[i], snakeY[i], 1);
  }
  lc.setLed(0, snakeX[snakeLong - 1], snakeY[snakeLong - 1], 0); //清除显示
}

完 善 程 序

最后就是改进还完善游戏功能了,游戏开始加个倒计时效果、游戏结束加个笑脸等等,各位小伙伴如果有想加的效果也可以自行添加。

贪吃蛇的程序已经上传到后台了,想要程序的小伙伴,先关注公众号,然后在公众号回复**“贪吃蛇游戏”**,即可获得下载链接。先到先得!你值得拥有!

在这里插入图片描述

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值