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. layui select onchange事件处理

    1.html代码如下,不要忘记 lay-filter属性 <div class="layui-input-block">         <select id=& ...

  2. KingbaseES V8R6 等待事件之LWLock Buffer_IO

    等待事件含义 当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件.其目的是将同一页读取到共享缓冲区中. 每个共享缓冲区都有一个与L ...

  3. 什么是OOP(Object Oriented Programming)面向对象编程

    1.认识面向对象首先要认识面向过程 面向过程编程,举个例子 比如有一天你要吃回锅肉,你会先去准备食材,然后一步一步把这道菜做出来,这就是面向过程. 还有一种方式你依然可以得到这道菜,你可以去饭店直接点 ...

  4. #背包#洛谷 4026 [SHOI2008]循环的债务

    题目 分析 设\(dp[t][n][m]\)表示前\(t\)种钞票\(\text{Alice,Bob}\)分别拥有\(n,m\)元所需最小交换钞票数, 枚举\(\text{Alice,Bob}\)最后 ...

  5. 【开源三方库】crypto-js加密算法库的使用方法

     OpenAtom OpenHarmony(简称"OpenHarmony")三方库,是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHa ...

  6. Seaborn调色盘设置

    调色盘设置 设置调色 color_palette()设置调色盘,返回一个调色盘的颜色列表,默认6种颜色:deep, muted, bright, pastel, dark, colorblind. s ...

  7. Agent内存马分析

    什么是Java Agent 我们知道Java是一种强类型语言,在运行之前必须将其编译成.class字节码,然后再交给JVM处理运行.Java Agent就是一种能在不影响正常编译的前提下,修改Java ...

  8. Djangorestframework 记录一个报错 -- rest_framework.authentication.ToKenAuthentication

    今天在使用 Djangorestframework 这个框架时,发生报错: ImportError: Could not import 'rest_framework.authentication.T ...

  9. CDH5.15.1集群安装部署

    CDH集群安装部署 大数据平台软件清单 本文部署的大数据基础平台为CDH,操作系统的版本为CentOS6.8,JDK的版本为1.8,Cloudera Manager与CDH的版本为5.15.1,数据库 ...

  10. 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这

    写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...