畢業製作專題範例_打磚塊GameBoy搖桿版(8x8 LED + 搖桿)

 










#include <LedControl.h>


// 初始化LedControl物件

 

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


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


 const int joystickXPin = A0;  // 搖桿的X軸接到A0腳位

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 方向移動速度




int paddleLength1 = 3; // 玩家1的板子長度

int paddleLength2 = 3; // 玩家2的板子長度

int score = 0;         // 玩家接到球的次數

 int missCount = 0;     // 玩家未接到球的次數


 


// 定義數字矩陣


byte numbers[10][8] = {


   {0b00111100, 0b01100110, 0b01101110, 0b01110110, 0b01100110, 0b01100110, 0b00111100, 0b00000000}, // 0


  {0b00011000, 0b00111000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b01111110, 0b00000000}, // 1


  {0b00111100, 0b01100110, 0b00000110, 0b00001100, 0b00110000, 0b01100000, 0b01111110, 0b00000000}, // 2


   {0b00111100, 0b01100110, 0b00000110, 0b00011100, 0b00000110, 0b01100110, 0b00111100, 0b00000000}, // 3


  {0b00001100, 0b00011100, 0b00101100, 0b01001100, 0b01111110, 0b00001100, 0b00001100, 0b00000000}, // 4


   {0b01111110, 0b01100000, 0b01111100, 0b00000110, 0b00000110, 0b01100110, 0b00111100, 0b00000000}, // 5


  {0b00111100, 0b01100110, 0b01100000, 0b01111100, 0b01100110, 0b01100110, 0b00111100, 0b00000000}, // 6


   {0b01111110, 0b01100110, 0b00001100, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00000000}, // 7

 

  {0b00111100, 0b01100110, 0b01100110, 0b00111100, 0b01100110, 0b01100110, 0b00111100, 0b00000000}, // 8

 

  {0b00111100, 0b01100110, 0b01100110, 0b00111110, 0b00000110, 0b01100110, 0b00111100, 0b00000000}  // 9


 };


 


 


 


void setup() {


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


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


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


   pinMode(joystickXPin, INPUT); // 設定搖桿X軸為輸入


 

}


 


 


 


void loop() {


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


   // 讀取搖桿的X軸值


  int joystickXValue = analogRead(joystickXPin);


   // 根據搖桿的X軸值移動玩家1


   if (joystickXValue < 400 && paddleX1 > 0) {


     paddleX1--;


     delay(200); // 防止搖桿抖動


   } else if (joystickXValue > 600 && 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

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

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

 

  }


 


 


 


  // 繪製玩家2


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

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

 

  }


 


  // 移動球


  ballX += ballDX;


  ballY += ballDY;


 

  // 撞到邊緣時反彈


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


     ballDX = -ballDX;


  }


 


 


  // 撞到玩家1時反彈


  if (ballY == 6 && (ballX >= paddleX1 && ballX < paddleX1 + paddleLength1)) {


    ballDY = -ballDY;

 

    score++; // 增加分數


   }


 


 


 


  // 撞到玩家2時反彈


  if (ballY == 1 && (ballX >= paddleX2 && ballX < paddleX2 + paddleLength2)) {


    ballDY = -ballDY;


  }


 


 


 


  // 繪製球


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


 


  // 如果球掉到最底部或最頂部,增加未接到球的次數


  if ((ballY > 7 && ballY != 6)) {

    missCount++; // 增加未接到球的次數


    // 如果未接到球的次數達到3次,顯示分數並重新開始遊戲


    if (missCount >= 3) {

      showScore();


       delay(1000); // 顯示分數一秒鐘


       resetGame();


     }


   }


  

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


 

}

 


void showScore() {

  lc.clearDisplay(0);


  int tens = score / 10;

   int units = score % 10;


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

    lc.setRow(0, i, numbers[tens][i]);

    lc.setRow(0, i, numbers[units][i]);


 

  }


 

}


 


 


 


void resetGame() {

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

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

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

  ballY = 3;

  ballDX = 1;

  ballDY = 1;

 

  paddleLength1 = 3; // 重置玩家1的板子長度

 

  paddleLength2 = 3; // 重置玩家2的板子長度


   score = 0;         // 重置分數


   missCount = 0;     // 重置未接到球的次數


 }


 

留言