#include <Servo.h>
#include <MD_MAX72xx.h>
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define MAX_DEVICES 4
#define VERT_PIN A0
#define HORZ_PIN A1
#define SEL_PIN 2
const int maxX = MAX_DEVICES * 8 - 1;
const int maxY = 31;
int snakeX[3] = {0, 1, 2};
int snakeY[3] = {0, 0, 0};
int snakeLength = 3;
int beanX, beanY;
MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS_PIN, MAX_DEVICES);
Servo myservo;
int pos = 0;
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);//操纵杆引脚设置输入和上拉电阻
randomSeed(analogRead(0)); // Seed random number generator
generateBean();
}
void loop() {
if(snakeLength >=10)
{
if (pos >= 180) {
pos = 0;
} else {
pos += 1;
}
myservo.write(pos);//确保 pos 的值始终在 0 到 179 的范围内(包括0但不包括180)。当 pos 达到或超过 180 时,它会被重置为 0;否则,它会增加 1。然后,这个新的 pos 值会被发送到 myservo 以控制其位置。
}
else{
pos==0;
}
// 读取操纵杆的值
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 (horz==512 && vert==1023)
y = max(y - 1, 0);
else if(horz==512 && vert==0)
y = min(y + 1, maxY);
else if(horz==1023&& vert==512)
x = max(x - 1, 0);
else if(horz==0 && vert==512)
x = min(x + 1, maxX);
// 清除贪吃蛇上一次的位置
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);
if (x == beanX && y == beanY) {
snakeLength++;
if (snakeLength == 10) {
int angle = 90; // Example angle for servo motion
myservo.write(angle);
}
generateBean();
}
// Check collision with boundaries
if (x == 0 || x == maxX || y == 0 || y == maxY) {
return 0;
}
// Update snake position
for (int i = snakeLength - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
snakeX[0] = x;
snakeY[0] = y;
// Clear previous snake position
mx.setPoint(snakeY[snakeLength], snakeX[snakeLength], false);
// Draw snake
mx.setPoint(snakeY[0], snakeX[0], true);
mx.update();
delay(100);
}
void generateBean() {
beanX = random(1, maxX);
beanY = random(1, maxY);
mx.setPoint(beanY, beanX, true);
mx.update();
}