arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇

ops/2024/11/14 6:26:51/

1.前言:
1.1本实验实现的贪吃蛇能穿越边界,结束游戏的唯一条件是贪吃蛇到达指定长度
1.2本实验所用LCD可能不是LCD12864,LCD12864所用库为u8glib,笔者在词库中并没有找到型号为ST77355的初始化函数,而是在ucglib中找到,其方法为
Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/13, /*data=*/11, /*cd=*/9, /*cs=*/10, /*reset=*/8);
1.3代码由学长LCD1602修改而来
2.接线方式

蓝牙模块RXDTXDGNDVCC
Arduino unopin7pin65vGND
ST7735S模块BLKCSDCRSTSDASCLVDDVCC
Arduino uno3.3vpin10pin9pin8pin11pin13未接GND

3.话不多说上代码

点击查看代码

#include 
#include 
#include "Ucglib.h"
#define maxlength 4 //蛇最大长度
Ucglib\_ST7735\_18x128x160\_SWSPI ucg(/*sclk=*/13, /*data=*/11, /*cd=*/9, /*cs=*/10, /*reset=*/8);
SoftwareSerial BT(6, 7);
char val;//蓝牙接收字符
int snake_length = 1;//蛇目前长度
int snake_x[maxlength], snake_y[maxlength];
int direction = 6;//方向判断和闪屏控制
int x = 10;
int y = 10;//记录变化的位置
int food_x;
int food_y;//食物
int gameOver = 0;//结束条件
void setup(void) {//delay(1000);ucg.begin(UCG_FONT_MODE_TRANSPARENT);//ucg.begin(UCG\_FONT\_MODE\_SOLID);ucg.clearScreen();BT.begin(9600);snake_x[0] = 10;snake_y[0] = 10;food_x = 10 + 10 * random(0, 9);food_y = 10 + 10 * random(0, 9);
}void loop(void) {if (direction == 6) {//欢迎界面ucg.setFont(ucg_font_ncenR12_tr);//字体设置ucg.setPrintPos(40, 80);//设定显示坐标ucg.print("welcome");} elseucg.drawFrame(10, 10, 100, 100);//游戏区域,有没有无所谓if (BT.available()) {val = BT.read();if (val == 'w' && direction != 2) direction = 0;if (val == 's' && direction != 0) direction = 2;if (val == 'a' && direction != 1) direction = 3;if (val == 'd' && direction != 3) direction = 1;}if (direction == 0) y -= 10;  //wif (direction == 1) x += 10;  //dif (direction == 2) y += 10;  //sif (direction == 3) x -= 10;  //aif (x < 10) x = 100;if (x > 100) x = 10;if (y < 10) y = 100;if (y > 100) y = 10;//到达边界后穿过边界if (x == food_x && y == food_y) {//行动后吃到食物snake_length++;while (1) {int flag = 1;//跳出循环标志food_x = 10 + 10 * random(0, 9);food_y = 10 + 10 * random(0, 9);//重新生成一个食物for (int i = snake_length - 1; i >= 0; i--) {//遍历蛇身看食物是否生成在身上if ((food_x == snake_x[i]) && (food_y == snake_y[i]) || ((food_x == x) && (food_y == y))) {flag = 0;break;}}if (snake_length == maxlength) {//游戏结束条件gameOver = 1;direction=5;//结束后显示gameover时的闪屏控制break;}if (flag) break;}}if (direction != 6) {for (int i = snake_length - 1; i > 0; i--) {snake_x[i] = snake_x[i - 1];snake_y[i] = snake_y[i - 1];}snake_x[0] = x;snake_y[0] = y;if (gameOver) {if(direction==5){ucg.clearScreen();direction=1;}else{ucg.setFont(ucg_font_ncenR12_tr);ucg.setPrintPos(40, 80);ucg.print("gameover");}}if (!gameOver) {ucg.clearScreen();for (int i = 0; i < snake_length; i++) {ucg.drawFrame(snake_x[i], snake_y[i], 10, 10);}ucg.drawFrame(food_x, food_y, 10, 10);}}
}

4.来人上图
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再上
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还上
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
使用手机app蓝牙串口调试,发送wasd,对应上左下右

5.回顾(复习看)
头文件:、 、

5.1LCD相关函数
LCD初始化
Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/13, /*data=*/11, /*cd=*/9, /*cs=*/10, /*reset=*/8);
显示矩形,其左上角坐标为(snake_x[i], snake_y[i]),长度和宽度为10
ucg.drawFrame(snake_x[i], snake_y[i], 10, 10);
显示像素点,其坐标坐标为(x,y)
ucg.drawPixel(x,y)
清屏
ucg.clearScreen();
初始化,两者区别不知道
ucg.begin(UCG_FONT_MODE_TRANSPARENT); //ucg.begin(UCG_FONT_MODE_SOLID);
字体、显示坐标、显示函数
ucg.setFont(ucg_font_ncenR12_tr); ucg.setPrintPos(40, 80); ucg.print("welcome");

5.2蓝牙相关函数
SoftwareSerial BT(6, 7);
读app发来的信息
if (BT.available()) char val = BT.read();

6.说明
如有同道中人,请删去注释


http://www.ppmy.cn/ops/34080.html

相关文章

【精】hadoop、HIVE大数据从0到1部署及应用实战

目录 基本概念 Hadoop生态 HIVE hdfs(hadoop成员) yarn(hadoop成员) MapReduce(hadoop成员) spark flink storm HBase kafka ES 实战 安装并配置hadoop 环境准备 准备虚拟机 安装ssh并设置免密登录 安装jdk 安装、配置并启动hadoop 添加hadoop环境变量&…

Kubernetes基础(三十)-imagefs与nodefs限制

kubelet可以对磁盘进行管控&#xff0c;但是只能对nodefs与imagefs这两个分区进行管控。其中 imagefs: docker安装目录所在的分区nodefs: kubelet的启动参数--root-dir所指定的目录&#xff08;默认/var/lib/kubelet&#xff09;所在的分区 接下来&#xff0c;我们来验证一下…

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类&#xff0c;子类&#xff0c;特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口&#xff0c;源码编译之后就是interf…

SQL注入基础-5

一、Access注入 1、asp网站常用数据库&#xff1a;access&#xff0c;mssql 2、access数据库 (1)没有库&#xff0c;没有端口 (2)结构&#xff1a;表--》字段--》数据 3、注入流程&#xff1a; 判断类型判断表名&#xff1a;遍历、爆破判断列名判断列名下的数据长度查出数…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展&#xff0c;其核心目标是将 Kubernetes 转化为一个通用的控制平面&#xff0c;使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能&#xff0c;Crossplane 对 Kubernetes 集群…

DS:顺序表、单链表的相关OJ题训练(1)

欢迎各位来到 Harper.Lee 的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu可以来后台找我交流哦&#xff01; 在DS&#xff1a;单链表的实现 和 DS&#xff1a;顺序表的实现这两篇文章中&#xff0c;我详细介绍了顺序表和单链表的…

【protobuf】protobuf 开发 (二)

紧接着上一篇文章https://blog.csdn.net/qq_37387199/article/details/137890740 获取丢失的代码 拿到丢失的源代码需要去 Google 的 protobuf GitHub 仓库&#xff0c;地址在 https://github.com/protocolbuffers/protobuf 可以下载压缩包&#xff0c;也可以使用 Git 克隆。…

Mac基于Docker-ubuntu构建c/c++编译环境

编译环境安装和使用被充分验证&#xff0c;如有期望补充的内容欢迎留言评论。 目录 前言 Docker desktop下载安装 修改镜像源 选择ubuntu镜像 docker容器启动 参数说明: 宿主机与docker容器文件共享 宿主机与docker容器拷贝文件 为 Ubuntu 配置 ssh、vim、make 相关工…