#include <Servo.h> //舵机
#include <MD_MAX72xx.h> //led显示屏
#define CLK_PIN 13 //led引脚
#define DATA_PIN 11 //led引脚
#define CS_PIN 10 //led引脚
#define MAX_DEVICES 4 //尚不清楚 定义了一个名为 MAX_DEVICES 的宏,其值为 2
#define VERT_PIN A0 //操纵机引脚
#define HORZ_PIN A1 //操纵机引脚
#define SEL_PIN 2 //操纵机引脚
const int maxX = MAX_DEVICES * 8 - 1; //等价于const int maxX = 4 * 8 - 1 = 31;
const int maxY = 31; //最大y坐标是31(从0开始)
int snakeX[3] = {0,1,2};
int snakeY[3] = {0,0,0};
//snakeX[0] 是蛇的头部,snakeX[1]是第二个部位,snakeX[2]是第三个部位
MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS_PIN, MAX_DEVICES);
//使用MD_MAX72XX库(或类似的库)来初始化一个LED矩阵控制器,
//MD_MAX72XX:这是一个类,用于封装与MAX7219/MAX7221等芯片通信的底层逻辑。
//创建一个名为mx的MD_MAX72XX对象,并使用PAROLA_HW硬件接口配置、CS_PIN作为芯片选择引脚,以及MAX_DEVICES个设备来进行初始化。
//简而言之,初始化
Servo myservo;
//表示创建了一个Servo对象,名为myservo。这个Servo对象是用来控制伺服电机(servo motor)的。
//舵机函数
int pos =0;
//定义一个变量为pos,规定是整数
void setup()
{
myservo.attach(9);
//将myservo这个Servo对象与连接到Arduino板上数字引脚9的舵机(servo)连接起来。
mx.begin();
//这个调用是初始化MD_MAX72XX对象所必需的
for (int i = 0; i < 3; i++) {
mx.setPoint(snakeY[i], snakeX[i], true);
}// 初始化设置三个点
mx.update(); // 更新显示,mx.update();这行代码的作用是向连接到mx对象的MAX7219/MAX7221 LED矩阵显示屏发送更新命令,使其根据先前设置的LED状态来显示内容。
pinMode(VERT_PIN, INPUT);//操纵杆引脚设置输入
pinMode(HORZ_PIN, INPUT);//操纵杆引脚设置输入
pinMode(SEL_PIN, INPUT_PULLUP);//操纵杆引脚设置输入和上拉电阻
}
void loop() {
if (pos >= 180) {
pos = 0;
} else {
pos += 1;
}
myservo.write(pos);//确保 pos 的值始终在 0 到 179 的范围内(包括0但不包括180)。当 pos 达到或超过 180 时,它会被重置为 0;否则,它会增加 1。然后,这个新的 pos 值会被发送到 myservo 以控制其位置。
// 读取操纵杆的值
int vert = analogRead(VERT_PIN);
int horz = analogRead(HORZ_PIN);
bool selPressed = digitalRead(SEL_PIN) == LOW;
// 更新贪吃蛇的头部位置
int x = snakeX[0];
int y = snakeY[0];
if (vert == 0 ) {
y = min(y + 1, maxY);
}
//如果 vert 的值小于 300,那么将贪吃蛇在垂直方向上向上移动一个单位,但不超过游戏区域的上边界。
if (vert == 1023) {
y = max(y - 1, 0);
}
//如果 vert 的值大于 700,那么将贪吃蛇在垂直方向上向下移动一个单位,但不超过游戏区域的下边界。
if (horz == 0) {
x = min(x + 1, maxX);
}
if (horz == 1023) {
x = max(x - 1, 0);
}
//向左或向右移动
// 清除贪吃蛇上一次的位置
for (int i = 0; i < 3; i++) {
mx.setPoint(snakeY[i], snakeX[i], false); // 清除上一次位置
}
// 更新贪吃蛇的位置
snakeX[0] = x;
snakeY[0] = y;
// 重新绘制整个贪吃蛇
for (int i = 0; i < 3; i++) {
mx.setPoint(snakeY[i], snakeX[i], true);
}
mx.update(); // 更新显示
delay(100);
}