巧用 Arduino 开发板、摇杆模块与 0.96 寸 OLED 屏,实现超有趣贪吃蛇小游戏!
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define OLED_WIDTH 128 #define OLED_HEIGHT 64 #define SNAKE_SIZE 10 int snakeX[SNAKE_SIZE], snakeY[SNAKE_SIZE]; int appleX, appleY; int snakeDirection; int snakeSpeed = 250; int gameScore = 0; bool gameOver = false; const int joyXPin = A0; const int joyYPin = A1; const int joySwitchPin = 2; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); pinMode(joySwitchPin, INPUT_PULLUP); randomSeed(analogRead(0)); snakeX[0] = OLED_WIDTH / 2; snakeY[0] = OLED_HEIGHT / 2; snakeDirection = random(4); generateApple(); } void loop() { if (!gameOver) { display.clearDisplay(); updateSnake(); checkCollision(); drawSnake(); drawApple(); displayScore(); display.display(); delay(snakeSpeed); } } void updateSnake() { int newHeadX = snakeX[0]; int newHeadY = snakeY[0]; int joyX = analogRead(joyXPin); int joyY = analogRead(joyYPin); if (joyX < 100) { snakeDirection = 3; // Left } else if (joyX > 900) { snakeDirection = 1; // Right } else if (joyY < 100) { snakeDirection = 0; // Up } else if (joyY > 900) { snakeDirection = 2; // Down } switch (snakeDirection) { case 0: // Up newHeadY--; break; case 1: // Right newHeadX++; break; case 2: // Down newHeadY++; break; case 3: // Left newHeadX--; break; } for (int i = SNAKE_SIZE - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } snakeX[0] = newHeadX; snakeY[0] = newHeadY; } void checkCollision() { if (snakeX[0] <= 0 || snakeX[0] >= OLED_WIDTH || snakeY[0] <= 0 || snakeY[0] >= OLED_HEIGHT) { gameOver = true; } for (int i = 1; i < SNAKE_SIZE; i++) { if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]) { gameOver = true; } } if (snakeX[0] == appleX && snakeY[0] == appleY) { eatApple(); generateApple(); } } void drawSnake() { for (int i = 0; i < SNAKE_SIZE; i++) { display.fillRect(snakeX[i], snakeY[i], 4, 4, WHITE); } } void drawApple() { display.fillRect(appleX, appleY, 4, 4, WHITE); } void eatApple() { gameScore++; snakeSpeed -= 10; snakeSpeed = max(snakeSpeed, 50); if (gameScore % 5 == 0 && SNAKE_SIZE < 100) { SNAKE_SIZE++; } for (int i = SNAKE_SIZE - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } } void generateApple() { appleX = random(1, 127) / 4 * 4; appleY = random(1, 63) / 4 * 4; } void displayScore() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.println("Score: " + String(gameScore)); } ######[AI写代码神器 | 1884点数解答 | 2024-11-12 21:42:49]
- 龙年年会盛宴:热场、表演、游戏嗨翻全场! (字节豆包 | 270点数解答 | 2025-01-16 14:21:53)279
- 超燃年会盛宴:游戏、表演与祝福共迎 2024 新征程!(字节豆包 | 392点数解答 | 2025-01-16 14:34:56)189
- STM32F10x代码解析:多模块引用与变量定义及功能探讨(字节豆包 | 25点数解答 | 2025-05-06 01:13:43)204
- Keil编译报错:找不到core_cm3.h文件的原因及解决办法(字节豆包 | 666点数解答 | 2025-11-12 18:26:21)275
- Keil MDK编译报错“无法打开 core_cm3.h”,解决办法及注意事项全揭秘!(字节豆包 | 560点数解答 | 2025-11-12 18:31:47)108
- 数列筛选:统计并求和大于 x 小于 y 的整数,这些开发要点要留意!(字节豆包 | 281点数解答 | 2025-11-29 20:20:58)153
- 用C++实现黄金城演讲比赛评分计算及有效分数输出程序(字节豆包 | 250点数解答 | 2026-02-28 20:18:01)26
- 黄金城演讲比赛评分程序的 C++ 实现(字节豆包 | 548点数解答 | 2026-02-28 20:20:14)27
- 黄金城演讲比赛评分程序的 C++ 实现(字节豆包 | 638点数解答 | 2026-02-28 20:25:32)28
- 黄金城演讲比赛评分程序的 C++ 实现(字节豆包 | 631点数解答 | 2026-02-28 20:28:21)29
- 黄金城演讲比赛评分程序的 C++ 实现及开发要点(字节豆包 | 703点数解答 | 2026-02-28 22:22:05)34
- 黄金城演讲比赛评分程序的 C++ 实现(字节豆包 | 374点数解答 | 2026-04-10 19:34:49)15