冰楓論壇

標題: Arduino 小蜜蜂(Space Shooter)完整版程式 [打印本頁]

作者: 洪嵐峰    時間: 2025-11-30 14:40
標題: Arduino 小蜜蜂(Space Shooter)完整版程式

📌 使用的 Library

請先安裝:

Adafruit SSD1306

Adafruit GFX

🎮 程式碼(可直接使用)
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// 按鈕
#define BTN_LEFT 2
#define BTN_RIGHT 3
#define BTN_FIRE 4

// 玩家
int playerX = 60;

// 子彈
bool bulletActive = false;
int bulletX = 0;
int bulletY = 0;

// 敵人 (小蜜蜂)
int enemyX = 20;
int enemyY = 10;
bool enemyAlive = true;
int enemyDir = 1;   // 左右移動方向

void setup() {
  pinMode(BTN_LEFT, INPUT_PULLUP);
  pinMode(BTN_RIGHT, INPUT_PULLUP);
  pinMode(BTN_FIRE, INPUT_PULLUP);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();

  randomSeed(analogRead(0));
}

void loop() {
  display.clearDisplay();

  // 玩家左右移動
  if (!digitalRead(BTN_LEFT) && playerX > 0) playerX -= 3;
  if (!digitalRead(BTN_RIGHT) && playerX < 120) playerX += 3;

  // 發射子彈
  if (!digitalRead(BTN_FIRE) && !bulletActive) {
    bulletActive = true;
    bulletX = playerX + 3;
    bulletY = 50;
  }

  // 更新子彈
  if (bulletActive) {
    bulletY -= 5;
    if (bulletY < 0) {
      bulletActive = false;
    }
  }

  // 敵人左右移動
  enemyX += enemyDir;
  if (enemyX <= 0 || enemyX >= 120) {
    enemyDir = -enemyDir;
    enemyY += 5; // 每次碰到邊界往下移動
  }

  // 判斷是否擊中敵人
  if (bulletActive && enemyAlive &&
      bulletX > enemyX && bulletX < enemyX + 10 &&
      bulletY > enemyY && bulletY < enemyY + 8) {
    enemyAlive = false;
    bulletActive = false;
  }

  // 玩家繪製(飛船)
  display.fillRect(playerX, 56, 10, 6, SSD1306_WHITE);

  // 子彈繪製
  if (bulletActive) {
    display.fillRect(bulletX, bulletY, 2, 4, SSD1306_WHITE);
  }

  // 敵人繪製
  if (enemyAlive) {
    display.drawRect(enemyX, enemyY, 10, 8, SSD1306_WHITE);
    display.drawPixel(enemyX + 3, enemyY + 2, SSD1306_WHITE);
    display.drawPixel(enemyX + 6, enemyY + 2, SSD1306_WHITE);
  } else {
    display.setCursor(40, 30);
    display.setTextSize(2);
    display.print("WIN!");
    display.display();
    delay(1500);
    resetGame();
    return;
  }

  display.display();
  delay(30);
}

void resetGame() {
  enemyX = random(0, 100);
  enemyY = 10;
  enemyDir = 1;
  enemyAlive = true;
  bulletActive = false;
}




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓