#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)); } [2024-11-12 21:42:49 | AI写代码神器 | 1884点数解答]