打磚塊GameBoy按鈕版

1.先安裝函示庫

工具 >> 管理程式庫>>輸入 ledcontrol




2.程式碼


 #include <LedControl.h>

// 初始化LedControl物件

// Vcc 接 5V,GND 接 GND,DIN 接到 5 號腳位,CS 接到 6 號腳位,CLK 接到 7 號腳位

LedControl lc = LedControl(5, 7, 6, 1);


const int buttonPinLeft1 = 2;  // 玩家1向左按鈕接到 2 號腳位

const int buttonPinRight1 = 3; // 玩家1向右按鈕接到 3 號腳位


int paddleX1 = 3; // 玩家1的初始 x 座標

int paddleX2 = 3; // 玩家2的初始 x 座標(電腦控制)

int ballX = 3;    // 球的初始 x 座標

int ballY = 3;    // 球的初始 y 座標

int ballDX = 1;   // 球的 x 方向移動速度

int ballDY = 1;   // 球的 y 方向移動速度


void setup() {

  lc.shutdown(0, false);       // 啟動顯示

  lc.setIntensity(0, 8);       // 設定亮度(0到15)

  lc.clearDisplay(0);          // 清除顯示

  pinMode(buttonPinLeft1, INPUT_PULLUP); // 啟用內建上拉電阻

  pinMode(buttonPinRight1, INPUT_PULLUP); // 啟用內建上拉電阻

}


void loop() {

  lc.clearDisplay(0); // 清除顯示

  // 移動玩家1

  if (digitalRead(buttonPinLeft1) == LOW && paddleX1 > 0) {

    paddleX1--;

    delay(200); // 防止按鈕抖動

  } else if (digitalRead(buttonPinRight1) == LOW && paddleX1 < 5) {

    paddleX1++;

    delay(200); // 防止按鈕抖動

  }


  // 電腦控制玩家2

  if (ballDY < 0) { // 當球向上移動時

    if (ballX < paddleX2 + 1 && paddleX2 > 0) {

      paddleX2--; // 向左移動

    } else if (ballX > paddleX2 + 1 && paddleX2 < 5) {

      paddleX2++; // 向右移動

    }

  }

  // 繪製玩家1

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

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

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

  // 繪製玩家2

  lc.setLed(0, 0, paddleX2, true);

  lc.setLed(0, 0, paddleX2 + 1, true);

  lc.setLed(0, 0, paddleX2 + 2, true);

  // 移動球

  ballX += ballDX;

  ballY += ballDY;

  // 撞到邊緣時反彈

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

    ballDX = -ballDX;

  }

  // 撞到玩家1時反彈

  if (ballY == 6 && (ballX == paddleX1 || ballX == paddleX1 + 1 || ballX == paddleX1 + 2)) {

    ballDY = -ballDY;

  }

  // 撞到玩家2時反彈

  if (ballY == 1 && (ballX == paddleX2 || ballX == paddleX2 + 1 || ballX == paddleX2 + 2)) {

    ballDY = -ballDY;

  }

  // 繪製球

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


  // 如果球掉到最底部或最頂部,顯示 X 並重新開始

  if ((ballY > 7 && ballY != 6) || (ballY < 0 && ballY != 1)) {

    showX();

    delay(1000); // 顯示 X 一秒鐘

    resetGame();

  }

  delay(700); // 控制遊戲速度,將速度調慢一些

}


void showX() {

  byte xPattern[8] = {

    0b10000001,

    0b01000010,

    0b00100100,

    0b00011000,

    0b00011000,

    0b00100100,

    0b01000010,

    0b10000001

  };

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

    lc.setRow(0, i, xPattern[i]);

  }

}


void resetGame() {

  paddleX1 = 3; // 重置玩家1位置

  paddleX2 = 3; // 重置玩家2位置

  ballX = 3;    // 重置球的位置

  ballY = 3;

  ballDX = 1;

  ballDY = 1;

}


留言