酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

写一个arduino代码做贪吃蛇小游戏,oled显示屏0.96寸,arduino开发板,摇杆模块,生成注解

# Arduino贪吃蛇游戏代码(OLED 0.96寸 + 摇杆模块) 以下是完整的贪吃蛇游戏实现代码,包含详细 ```cpp #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED显示宽度 #define SCREEN_HEIGHT 64 // OLED显示高度 #define OLED_RESET -1 // 重置引脚 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 摇杆引脚定义 #define JOYSTICK_X A0 #define JOYSTICK_Y A1 #define JOYSTICK_BUTTON 2 // 游戏参数 #define GRID_SIZE 8 // 每个网格的像素大小 #define GRID_WIDTH (SCREEN_WIDTH/GRID_SIZE) #define GRID_HEIGHT (SCREEN_HEIGHT/GRID_SIZE) // 蛇结构体 struct Snake { int x[100]; // 蛇身x坐标 int y[100]; // 蛇身y坐标 int length; // 蛇长度 int direction; // 移动方向: 0上,1右,2下,3左 }; struct Food { int x; // 食物x坐标 int y; // 食物y坐标 bool eaten; // 是否被吃 }; Snake snake; Food food; bool gameOver = false; unsigned long lastUpdateTime = 0; const int gameSpeed = 150; // 游戏速度(毫秒) void setup() { Serial.begin(9600); // 初始化OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306分配失败")); for(;;); } // 初始化摇杆按钮 pinMode(JOYSTICK_BUTTON, INPUT_PULLUP); // 初始化游戏 initGame(); display.display(); // 显示初始画面 delay(2000); } void loop() { if (!gameOver) { // 读取摇杆输入 readJoystick(); // 游戏逻辑更新 if (millis() - lastUpdateTime > gameSpeed) { updateGame(); lastUpdateTime = millis(); } // 绘制游戏 drawGame(); } else { // 游戏结束显示 display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(20, 20); display.print("Game Over"); display.setCursor(10, 40); display.print("Score: "); display.print(snake.length - 3); display.display(); // 按下按钮重新开始 if (digitalRead(JOYSTICK_BUTTON) == LOW) { delay(200); // 防抖 initGame(); gameOver = false; } } } // 初始化游戏 void initGame() { // 初始化蛇 snake.length = 3; snake.direction = 1; // 初始向右移动 // 蛇的初始位置(水平排列) for (int i = 0; i < snake.length; i++) { snake.x[i] = 3 - i; snake.y[i] = 3; } // 生成第一个食物 generateFood(); // 清屏 display.clearDisplay(); } // 读取摇杆输入 void readJoystick() { int xValue = analogRead(JOYSTICK_X); int yValue = analogRead(JOYSTICK_Y); // 确定摇杆方向(添加死区防止误触) if (xValue < 400 && abs(yValue - 512) < abs(xValue - 512)) { if (snake.direction != 3) snake.direction = 1; // 右 } else if (xValue > 600 && abs(yValue - 512) < abs(xValue - 512)) { if (snake.direction != 1) snake.direction = 3; // 左 } else if (yValue < 400 && abs(xValue - 512) < abs(yValue - 512)) { if (snake.direction != 2) snake.direction = 0; // 上 } else if (yValue > 600 && abs(xValue - 512) < abs(yValue - 512)) { if (snake.direction != 0) snake.direction = 2; // 下 } } // 更新游戏状态 void updateGame() { // 保存蛇尾位置(可能用于增长) int prevX = snake.x[snake.length-1]; int prevY = snake.y[snake.length-1]; // 移动蛇身(从尾部开始更新位置) for (int i = snake.length-1; i > 0; i--) { snake.x[i] = snake.x[i-1]; snake.y[i] = snake.y[i-1]; } // 根据方向移动蛇头 switch (snake.direction) { case 0: snake.y[0]--; break; // 上 case 1: snake.x[0]++; break; // 右 case 2: snake.y[0]++; break; // 下 case 3: snake.x[0]--; break; // 左 } // 边界检查(穿墙) if (snake.x[0] < 0) snake.x[0] = GRID_WIDTH - 1; if (snake.x[0] >= GRID_WIDTH) snake.x[0] = 0; if (snake.y[0] < 0) snake.y[0] = GRID_HEIGHT - 1; if (snake.y[0] >= GRID_HEIGHT) snake.y[0] = 0; // 检查是否吃到食物 if (snake.x[0] == food.x && snake.y[0] == food.y) { // 蛇增长 snake.length++; snake.x[snake.length-1] = prevX; snake.y[snake.length-1] = prevY; // 生成新食物 generateFood(); } // 检查是否撞到自己 for (int i = 1; i < snake.length; i++) { if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i]) { gameOver = true; } } } // 生成食物 void generateFood() { bool onSnake; do { onSnake = false; food.x = random(GRID_WIDTH); food.y = random(GRID_HEIGHT); // 确保食物不会生成在蛇身上 for (int i = 0; i < snake.length; i++) { if (food.x == snake.x[i] && food.y == snake.y[i]) { onSnake = true; break; } } } while (onSnake); } // 绘制游戏 void drawGame() { display.clearDisplay(); // 绘制蛇 for (int i = 0; i < snake.length; i++) { display.fillRect(snake.x[i]*GRID_SIZE, snake.y[i]*GRID_SIZE, GRID_SIZE, GRID_SIZE, WHITE); } // 绘制食物 display.fillRect(food.x*GRID_SIZE, food.y*GRID_SIZE, GRID_SIZE, GRID_SIZE, WHITE); // 显示分数 display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Score: "); display.print(snake.length - 3); display.display(); } ``` ## 代码说明 1. 硬件连接: - OLED显示屏使用I2C接口连接(通常SCL接A5,SDA接A4) - 摇杆模块:X轴接A0,Y轴接A1,按钮接D2 2. 游戏逻辑: - 使用网格系统简化碰撞检测(GRID_SIZE=8表示每个网格8x8像素) - 蛇身使用数组存储坐标,移动时从尾部开始更新位置 - 摇杆输入有死区处理,防止误触 - 吃到食物后蛇长度增加,并生成新食物 3. 显示功能: - 实时显示游戏画面和当前分数 - 游戏结束显示最终分数和重新开始提示 4. 游戏规则: - 撞到自己身体游戏结束 - 可以穿墙(从一边出来从另一边进入) - 每吃一个食物得1分 ## 额外注意事项 1. 摇杆模块可能需要校准,如果发现方向不准确,可以调整代码中的阈值(400和600) 2. 游戏速度通过gameSpeed变量控制(毫秒),数值越小游戏速度越快 3. 食物生成算法确保不会出现在蛇身上,但随着蛇身变长,可能需要更长时间找到合适位置 [2025-04-11 14:58:39 | AI写代码神器 | 2069点数解答]

相关提问