play

 #include <LedControl.h>


// 定義LED矩陣的接腳

#define DIN 12

#define CS 10

#define CLK 11


// 定義搖桿的接腳

#define JOYSTICK_X A0

#define JOYSTICK_BUTTON 2


// 初始化LED矩陣

LedControl lc = LedControl(DIN, CLK, CS, 1);


// 遊戲變數

int paddlePos = 3;      // 板子的初始位置

int ballX = 3;          // 球的初始X位置

int ballY = 6;          // 球的初始Y位置

int ballDirX = 1;       // 球的X方向

int ballDirY = -1;      // 球的Y方向

int lives = 3;          // 剩餘生命值

int score = 0;          // 分數

bool gameOver = false;  // 遊戲是否結束


void setup() {

  // 初始化LED矩陣

  lc.shutdown(0, false);

  lc.setIntensity(0, 8);

  lc.clearDisplay(0);


  // 初始化搖桿按鈕

  pinMode(JOYSTICK_BUTTON, INPUT_PULLUP);


  // 初始化隨機種子

  randomSeed(analogRead(0));

}


void loop() {

  if (!gameOver) {

    // 讀取搖桿的X軸值

    int joystickX = analogRead(JOYSTICK_X);


    // 根據搖桿的值移動板子

    if (joystickX < 400 && paddlePos > 0) {

      paddlePos--;

    } else if (joystickX > 600 && paddlePos < 6) {

      paddlePos++;

    }


    // 更新球的位置

    ballX += ballDirX;

    ballY += ballDirY;


    // 檢查球是否碰到邊界

    if (ballX <= 0 || ballX >= 7) {

      ballDirX *= -1;

    }

    if (ballY <= 0) {

      ballDirY *= -1;

    }


    // 檢查球是否碰到板子

    if (ballY == 7 && ballX >= paddlePos && ballX <= paddlePos + 2) {

      ballDirY *= -1;

      score++;  // 接到球,分數加一

    }


    // 檢查球是否掉到底部

    if (ballY >= 7) {

      lives--;  // 生命值減一

      if (lives > 0) {

        // 重置球的位置

        ballX = 3;

        ballY = 6;

        ballDirX = random(2) ? 1 : -1;  // 隨機方向

        ballDirY = -1;

      } else {

        gameOver = true;  // 生命值耗盡,遊戲結束

      }

    }


    // 清除LED矩陣

    lc.clearDisplay(0);


    // 繪製板子

    lc.setLed(0, 7, paddlePos, true);

    lc.setLed(0, 7, paddlePos + 1, true);

    lc.setLed(0, 7, paddlePos + 2, true);


    // 繪製球

    lc.setLed(0, ballY, ballX, true);


    // 延遲一段時間

    delay(200);

  } else {

    // 遊戲結束,顯示分數

    displayScore(score);


    // 按下搖桿按鈕重新開始遊戲

    if (digitalRead(JOYSTICK_BUTTON) == LOW) {

      resetGame();

      delay(500);  // 防抖動

    }

  }

}


// 顯示分數

void displayScore(int score) {

  lc.clearDisplay(0);

  for (int i = 0; i < 8; i++) {

    lc.setRow(0, i, (score >> (7 - i)) & 0x01);  // 以二進制顯示分數

  }

}


// 重置遊戲

void resetGame() {

  gameOver = false;

  paddlePos = 3;

  ballX = 3;

  ballY = 6;

  ballDirX = 1;

  ballDirY = -1;

  lives = 3;

  score = 0;

}

留言