#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define buttonLeft 4
#define buttonRight 5
int paddle_x = 54;
int paddle_y = 56;
int paddle_width = 20;
int paddle_height = 4;
int paddle_speed = 4; // 加快擋板的移動速度
int ball_x = 64;
int ball_y = 32;
int ball_dx = 1;
int ball_dy = 1;
int ball_size = 3;
bool bricks[5][11]; // 增加到 11 列磚塊
int brick_width = 10; // 調整磚塊寬度
int brick_height = 4; // 調整磚塊高度
int brick_spacing = 2; // 磚塊之間的間隙
bool game_over = false;
int score = 0;
void setup() {
pinMode(buttonLeft, INPUT_PULLUP);
pinMode(buttonRight, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.display();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 11; j++) {
bricks[i][j] = true;
}
}
}
void loop() {
if (!game_over) {
keyScan();
updateGame();
drawGame();
delay(30);
} else {
drawGameOver();
delay(5000);
resetGame();
}
}
void keyScan() {
if (digitalRead(buttonLeft) == LOW && paddle_x > 0) {
paddle_x -= paddle_speed;
}
if (digitalRead(buttonRight) == LOW && paddle_x < SCREEN_WIDTH - paddle_width) {
paddle_x += paddle_speed;
}
}
void updateGame() {
ball_x += ball_dx;
ball_y += ball_dy;
if (ball_x <= 0 || ball_x >= SCREEN_WIDTH - ball_size) {
ball_dx = -ball_dx;
}
if (ball_y <= 0) {
ball_dy = -ball_dy;
}
if (ball_y >= SCREEN_HEIGHT - ball_size) {
game_over = true;
}
if (ball_y + ball_size >= paddle_y && ball_x + ball_size >= paddle_x && ball_x <= paddle_x + paddle_width) {
ball_dy = -ball_dy;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 11; j++) {
if (bricks[i][j]) {
int brick_x = j * (brick_width + brick_spacing);
int brick_y = i * (brick_height + brick_spacing);
if (ball_x + ball_size >= brick_x && ball_x <= brick_x + brick_width &&
ball_y + ball_size >= brick_y && ball_y <= brick_y + brick_height) {
bricks[i][j] = false;
ball_dy = -ball_dy;
score++;
}
}
}
}
}
void drawGame() {
display.clearDisplay();
display.fillRect(paddle_x, paddle_y, paddle_width, paddle_height, SSD1306_WHITE);
display.fillRect(ball_x, ball_y, ball_size, ball_size, SSD1306_WHITE);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 11; j++) {
if (bricks[i][j]) {
int brick_x = j * (brick_width + brick_spacing);
int brick_y = i * (brick_height + brick_spacing);
display.fillRect(brick_x, brick_y, brick_width, brick_height, SSD1306_WHITE);
}
}
}
/* display.setCursor(0, 0);
display.print("Score: ");
display.print(score);*/
display.display();
}
void drawGameOver() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 20);
display.println("GAME OVER");
display.display();
}
void resetGame() {
paddle_x = 54;
paddle_y = 56;
ball_x = 64;
ball_y = 32;
ball_dx = 1;
ball_dy = 1;
game_over = false;
score = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 11; j++) {
bricks[i][j] = true;
}
}
}
Loading
ssd1306
ssd1306