打磚塊搖桿計分版

 

#include <LedControl.h>

 

 

 

// 初始化LedControl物件

 

// Vcc 5VGND GNDDIN 接到 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);       // 設定亮度(015

 

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

 

}

 

留言