arduino ws2812b贪吃蛇程序,100灯
时间: 2024-02-18 11:58:54 浏览: 97
以下是一个使用Arduino和WS2812B LED灯条实现贪吃蛇游戏的程序,适用于100颗LED灯。
```
#include <Adafruit_NeoPixel.h>
//定义引脚和灯条数量
#define LED_PIN 6
#define LED_COUNT 100
//定义开始游戏按键
#define START_BUTTON 2
//定义方向按键
#define UP_BUTTON 3
#define DOWN_BUTTON 4
#define LEFT_BUTTON 5
#define RIGHT_BUTTON 7
//定义蛇身和食物颜色
#define SNAKE_COLOR 0xFF0000
#define FOOD_COLOR 0x00FF00
//定义蛇身和食物位置
int snake[LED_COUNT];
int food;
//定义游戏状态
bool gameStarted = false;
int direction = 1;
bool gameOver = false;
//定义 NeoPixel 对象
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
//初始化 NeoPixel 灯条
strip.begin();
//设置开始游戏按键为输入模式
pinMode(START_BUTTON, INPUT_PULLUP);
//设置方向按键为输入模式
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(DOWN_BUTTON, INPUT_PULLUP);
pinMode(LEFT_BUTTON, INPUT_PULLUP);
pinMode(RIGHT_BUTTON, INPUT_PULLUP);
//初始化蛇身和食物位置
for(int i=0; i<LED_COUNT; i++) {
snake[i] = -1; //蛇身初始位置为-1
}
food = random(LED_COUNT); //食物初始位置为随机位置
}
void loop() {
//等待开始游戏按键被按下
while(!digitalRead(START_BUTTON)) {
//等待开始游戏
}
//开始游戏
startGame();
//游戏主循环
while(!gameOver) {
//移动蛇身
moveSnake();
//检查是否吃到食物
checkFood();
//检查是否碰到边界或自身
checkCollision();
//显示蛇身和食物
showSnakeAndFood();
//控制蛇身移动速度
delay(100);
//检测方向按键
checkDirection();
}
//游戏结束
endGame();
}
//开始游戏
void startGame() {
//初始化蛇身
snake[0] = 0; //蛇头初始位置为0
for(int i=1; i<5; i++) {
snake[i] = i - 1;
}
//初始化游戏状态
gameStarted = true;
direction = 1;
gameOver = false;
}
//结束游戏
void endGame() {
//显示 GAME OVER
for(int i=0; i<LED_COUNT; i++) {
strip.setPixelColor(i, 0xFF0000);
}
strip.show();
//等待 3 秒
delay(3000);
//重置游戏状态
gameStarted = false;
direction = 1;
gameOver = false;
for(int i=0; i<LED_COUNT; i++) {
snake[i] = -1;
}
food = random(LED_COUNT);
}
//移动蛇身
void moveSnake() {
//将蛇身的位置向前移动一位
for(int i=LED_COUNT-1; i>=1; i--) {
snake[i] = snake[i-1];
}
//根据方向移动蛇头
if(direction == 1) { //向上移动
snake[0] -= 10;
} else if(direction == 2) { //向下移动
snake[0] += 10;
} else if(direction == 3) { //向左移动
snake[0] -= 1;
} else if(direction == 4) { //向右移动
snake[0] += 1;
}
}
//检查是否吃到食物
void checkFood() {
if(snake[0] == food) {
//将食物位置设为蛇身的一部分
for(int i=LED_COUNT-1; i>=1; i--) {
snake[i] = snake[i-1];
}
snake[0] = food;
//生成新的食物位置
food = random(LED_COUNT);
}
}
//检查是否碰到边界或自身
void checkCollision() {
//检查是否碰到边界
if(snake[0] < 0 || snake[0] >= LED_COUNT) {
gameOver = true;
return;
}
//检查是否碰到自身
for(int i=1; i<LED_COUNT; i++) {
if(snake[0] == snake[i]) {
gameOver = true;
return;
}
}
}
//显示蛇身和食物
void showSnakeAndFood() {
//设置蛇身颜色
for(int i=0; i<LED_COUNT; i++) {
strip.setPixelColor(i, 0x000000);
}
for(int i=0; i<LED_COUNT; i++) {
if(snake[i] != -1) {
strip.setPixelColor(snake[i], SNAKE_COLOR);
}
}
//设置食物颜色
strip.setPixelColor(food, FOOD_COLOR);
//显示灯条
strip.show();
}
//检测方向按键
void checkDirection() {
if(!digitalRead(UP_BUTTON)) {
direction = 1;
} else if(!digitalRead(DOWN_BUTTON)) {
direction = 2;
} else if(!digitalRead(LEFT_BUTTON)) {
direction = 3;
} else if(!digitalRead(RIGHT_BUTTON)) {
direction = 4;
}
}
```
这个程序使用了Adafruit_NeoPixel库来驱动WS2812B LED灯条,并通过按键来控制贪吃蛇的移动方向。在游戏开始前,程序会等待开始游戏按键被按下;一旦开始游戏,程序会进入游戏主循环,不断移动蛇身、检查是否吃到食物、检查是否碰到边界或自身、显示蛇身和食物,并控制蛇身移动速度。如果游戏结束,程序会显示 GAME OVER 并等待3秒,然后重置游戏状态并等待开始游戏。你可以根据需要修改程序中的一些参数,如LED灯条数量、蛇身和食物颜色、按键引脚等,以实现不同的效果。
阅读全文