#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; // 重置未接到球的次數
}
留言
張貼留言