修正搖桿靈敏度joystickXValue < 310

 #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 < 310 && 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;     // 重置未接到球的次數


 


}

留言