Files
arduino_pong/arduino_pong.ino

108 lines
2.8 KiB
Arduino
Raw Normal View History

#include "Arduino_LED_Matrix.h"
2026-03-15 21:14:04 +01:00
#include "src/config.h"
#include "src/pong_render.h"
#include "src/pong_player.h"
#include "src/pong_ball.h"
// create LED matrix object
ArduinoLEDMatrix matrix;
2026-03-15 20:29:56 +01:00
// initial pong frame matrix
2026-03-15 17:07:03 +01:00
byte frame[MATRIX_HEIGHT][MATRIX_WIDTH] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
2026-03-15 20:29:56 +01:00
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
2026-03-14 21:35:19 +01:00
// players coordinates
int players_coords[2]= {1, 4};
int players_scores[2]= {0, 0};
2026-03-14 21:35:19 +01:00
// initials balls coordinates
int ball_x= BALL_RESET_X;
int ball_y= BALL_RESET_Y;
int need_refresh= 1;
2026-03-15 20:23:52 +01:00
int ball_delay= INITIAL_BALL_DELAY;
bool game_over= false;
bool go= true;
long exec_t2= millis();
2026-03-15 20:29:56 +01:00
void setup() {
Serial.begin(9600);
2026-03-15 20:29:56 +01:00
// start LED matrix
matrix.begin();
pinMode(P1_BTN_UP, INPUT_PULLUP);
pinMode(P1_BTN_BOTTOM, INPUT_PULLUP);
pinMode(P2_BTN_UP, INPUT_PULLUP);
pinMode(P2_BTN_BOTTOM, INPUT_PULLUP);
2026-03-15 20:29:56 +01:00
randomSeed(millis());
}
void loop() {
for (int i = START_TIMER; i >= 0; i--) {
render_timer(frame, i);
delay(1000);
2026-03-15 20:23:52 +01:00
matrix.renderBitmap(frame, MATRIX_HEIGHT, MATRIX_WIDTH);
}
game_over= false;
go= true;
// delay the first ball movement
exec_t2= millis() + FIRST_START_BALL_DELAY;
while (go) {
long exec_t1= millis();
pong_move_p1(players_coords[0], need_refresh);
pong_move_p2(players_coords[1], need_refresh);
if (exec_t1 - exec_t2 > ball_delay) {
bool scored= move_ball(ball_x, ball_y, ball_delay, players_coords, players_scores, need_refresh);
if (scored) {
render_score(frame, players_scores);
matrix.renderBitmap(frame, MATRIX_HEIGHT, MATRIX_WIDTH);
delay(1000);
if (players_scores[0] >= MAX_POINTS || players_scores[1] >= MAX_POINTS) {
render_winner(frame, matrix, players_scores);
need_refresh= 0;
game_over= true;
}
// delay the ball movement after score
exec_t2= millis() + FIRST_START_BALL_DELAY;
} else exec_t2= exec_t1;
}
// rerender matrix only if something is changed
if (need_refresh) {
render_matrix(frame, players_coords, ball_x, ball_y);
matrix.renderBitmap(frame, MATRIX_HEIGHT, MATRIX_WIDTH);
need_refresh= 0;
}
if (!game_over) delay(50);
// keep showing the winner waiting for a restart
while (game_over) {
// restart game once one button is pressed
if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW || digitalRead(P2_BTN_UP) == LOW || digitalRead(P2_BTN_BOTTOM) == LOW) {
go= false;
game_over= false;
players_scores[0]= 0;
players_scores[1]= 0;
}
delay(100);
}
}
2026-03-14 21:35:19 +01:00
}