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.接线方式

蓝牙模块 RXD TXD GND VCC
Arduino uno pin7 pin6 5v GND
ST7735S模块 BLK CS DC RST SDA SCL VDD VCC
Arduino uno 3.3v pin10 pin9 pin8 pin11 pin13 未接 GND

3.话不多说上代码

点击查看代码
#include <SoftwareSerial.h>
#include <SPI.h>
#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");
} else
ucg.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; //w
if (direction == 1) x += 10; //d
if (direction == 2) y += 10; //s
if (direction == 3) x -= 10; //a if (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.回顾(复习看)

头文件:<SoftwareSerial.h>、 <Ucglib.h> 、<stdio.h>

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.说明

如有同道中人,请删去注释

arduino uno+LCD12864(ST7735S)+蓝牙模块实现贪吃蛇的更多相关文章

  1. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

  2. Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...

  3. Arduino蓝牙模块实现通信

    蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机可通过该脚状态判断蓝牙是否已经连接 2.led指示蓝牙连接状态,闪烁表示没有 ...

  4. Arduino 各种模块篇 蓝牙模块 手机蓝牙控制Arduino LED灯

    解决方案. 条件: 1.手机android 商店下载 blueTerm 2.向arduino中载入如下代码: char val; ; void setup() { Serial.begin(); pi ...

  5. 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信

    [Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...

  6. Arduino使用HC05蓝牙模块与手机连接

    Arduino使用HC05蓝牙模块与手机连接 一切都是最好的选择 首先是线路连接,一定不要接错了 Arduino 代码 #include <SoftwareSerial.h> // Pin ...

  7. Arduino uno r3 使用 ESP8266 UART-WiFi 透传模块

    一.所需硬件材料 1.ESP8266:01s某宝上3.5块钱 2.杜邦线:某宝几块钱一组40P,这里只需要三根,用于连接 树莓派与继电器 3.烧录器 二.ESP8266 AT固件烧录 ESP8266主 ...

  8. HC-42蓝牙模块-nRF52832-数传蓝牙

    资料下载地址:链接:https://pan.baidu.com/s/1RRajrI5NvNY8tRVuYbOTug    提取码:31ho 我的蓝牙模块淘宝购买地址:https://detail.tm ...

  9. 基于Arduino开发的智能蓝牙小车

    基于Arduino的智能蓝牙小车 材料准备: Arduino开发板一块.四驱小车底板及相关配件一套.L298N驱动模块一个.HC-05/06蓝牙模块一块,九伏电源一块(用于主板供电).12V锂电池一块 ...

  10. 基于Proteus仿真的Arduino学习(1)——Arduino Uno最小系统及LED的简单使用

    一.前言:  A.Arduino简介 Arduino是由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Banzi.David Cuartielles.Tom Igoe.Gianluc ...

随机推荐

  1. KingbaseES 垃圾回收原理以及如何预防膨胀更新

    背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum,对于未开启au ...

  2. KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障

    KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障 案例说明: 通过脚本方式部署KingbaseES V8R6集群后,在'cluster'模式 ...

  3. 企业数据清洗项目实践day3

    封装昨天的生成json方法,生成标准字段方法以及生成最终文件的方法. 1 import pandas as pd 2 import xlwt 3 """ 4 rank的一 ...

  4. 为什么js项目中金额强烈推荐使用分而不是元

    相信我们都已经知道在js中浮点数据精度的问题了 看下面的例子 0.1 + 0.2 0.30000000000000004 如何解决呢? 在前后端交互过程中统一使用分为单位进行通讯,在最后的表示层处理为 ...

  5. 掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验

    原生智能是HarmonyOS NEXT的核心亮点之一,依托HarmonyOS SDK丰富全面的开放能力,开发者只需通过几行代码,即可快速实现AI功能.新浪新闻作为鸿蒙原生应用开发的先行者之一,从有声资 ...

  6. zbar:Qt调用zbar做条码识别

    编译: zbar Windows编译:https://gitee.com/vvvj/zbar-windows 下载下来后,直接使用vs来编译就可以了. zbar官网:https://zbar.sour ...

  7. 实时 3D 深度多摄像头跟踪 Real-time 3D Deep Multi-Camera Tracking

    实时 3D 深度多摄像头跟踪 Real-time 3D Deep Multi-Camera Tracking 论文url https://arxiv.org/abs/2003.11753 论文简述: ...

  8. 罗小黑的秘密qsnctfwp

    题目的附件 安装相关工具 在 Linux 中使用命令安装 gem :apt-get install gem 在 Linux 中使用命令安装 zsteg :gem install zsteg 这是一道图 ...

  9. leetcode第 181 场周赛

    5364. 按既定顺序创建目标数组 给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 in ...

  10. 有用的JavaScript技巧

    首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和 ...