#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;
}
留言
張貼留言