From fae479ce909db93a6e0bdd3c5cb0b9d07d6065af Mon Sep 17 00:00:00 2001 From: andrea Date: Sat, 21 Mar 2026 13:52:54 +0100 Subject: [PATCH] clean code adding a menu class --- arduino_pong.ino | 135 ++++++++++++++++++++++++----------------------- src/config.h | 4 +- src/menu.cpp | 42 +++++++++++++++ src/menu.h | 26 +++++++++ src/paddle.cpp | 4 +- 5 files changed, 140 insertions(+), 71 deletions(-) create mode 100644 src/menu.cpp create mode 100644 src/menu.h diff --git a/arduino_pong.ino b/arduino_pong.ino index d5b826c..9b46ed2 100644 --- a/arduino_pong.ino +++ b/arduino_pong.ino @@ -1,6 +1,7 @@ #include "Arduino_LED_Matrix.h" #include "src/config.h" +#include "src/menu.h" #include "src/renderer.h" #include "src/engine.h" #include "src/paddle.h" @@ -36,9 +37,6 @@ enum game_statuses : uint8_t { }; game_statuses game_status= MENU; -enum game_modes : uint8_t {PVP, PVC, CVC}; -game_modes game_mode = PVP; - Ball ball(4, 6); @@ -48,12 +46,13 @@ HumanPaddle human_pad1(1, P1_BTN_UP, P1_BTN_BOTTOM); HumanPaddle human_pad2(4, P2_BTN_UP, P2_BTN_BOTTOM); BotPaddle bot_pad1(1, 0); BotPaddle bot_pad2(4, MATRIX_WIDTH-1); +Menu menu; -uint8_t current_gmode_idx= 0; -bool update_menu= true; -bool mode_selected= false; -uint8_t current_bot_menu_idx= 0; -bool update_menu_bot_skills= true; +// uint8_t current_gmode_idx= 0; +// bool update_menu= true; +// bool mode_selected= false; +// uint8_t current_bot_menu_idx= 0; +// bool update_menu_bot_skills= true; Engine engine(ball, INITIAL_BALL_DELAY); Renderer renderer(ball, frame, matrix); @@ -77,80 +76,81 @@ void loop() { switch (game_status) { case MENU: { - if (digitalRead(P2_BTN_BOTTOM) == LOW && current_gmode_idx < sizeof(frame_gmodes)/sizeof(frame_gmodes[0]) -1) { - current_gmode_idx += 1; - update_menu= true; + // switch modes + if (digitalRead(P2_BTN_BOTTOM) == LOW) { + menu.next_mode(); + const byte (*current_gmode)[12]= frame_gmodes[menu.get_mode()]; + matrix.loadPixels((uint8_t*)current_gmode, MATRIX_HEIGHT * MATRIX_WIDTH); + delay(300); } - else if (digitalRead(P2_BTN_UP) == LOW && current_gmode_idx > 0) { - update_menu= true; - current_gmode_idx -= 1; - game_mode= PVP; + else if (digitalRead(P2_BTN_UP) == LOW) { + menu.prev_mode(); + const byte (*current_gmode)[12]= frame_gmodes[menu.get_mode()]; + matrix.loadPixels((uint8_t*)current_gmode, MATRIX_HEIGHT * MATRIX_WIDTH); + delay(300); } // 1. P vs P - else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && game_modes(current_gmode_idx) == PVP) { + else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && menu.number_of_bots() == 0) { p1= &human_pad1; p2= &human_pad2; - mode_selected= true; - } - // 2. P vs CPU - else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && game_modes(current_gmode_idx) == PVC) { - p1= &human_pad1; - p2= &bot_pad2; - mode_selected= true; - update_menu= false; - game_mode= PVC; - } - // 3. CPU vs CPU - else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && game_modes(current_gmode_idx) == CVC) { - p1= &bot_pad1; - p2= &bot_pad2; - mode_selected= true; - update_menu= false; - game_mode= CVC; - } - - if (update_menu) { - // show menu on the matrix - const byte (*current_gmode)[12]= frame_gmodes[current_gmode_idx]; - matrix.loadPixels((uint8_t*)current_gmode, MATRIX_HEIGHT * MATRIX_WIDTH); - update_menu= false; - delay(300); - } - else if (mode_selected) { engine.set_players(p1, p2); renderer.set_players(p1, p2); - if (game_mode == PVC || game_mode == CVC) { - game_status= MENU_BOT_SKILLS; - delay(300); // avoid accidental double click for next menu - } - else game_status= TIMER; + game_status= TIMER; } + // 2. P vs CPU + else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && menu.number_of_bots() == 1) { + p1= &human_pad1; + p2= &bot_pad2; + engine.set_players(p1, p2); + renderer.set_players(p1, p2); + game_status= MENU_BOT_SKILLS; + delay(300); // avoid accidental double click for next menu + } + // 3. CPU vs CPU + else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW && menu.number_of_bots() == 2) { + p1= &bot_pad1; + p2= &bot_pad2; + engine.set_players(p1, p2); + renderer.set_players(p1, p2); + game_status= MENU_BOT_SKILLS; + delay(300); // avoid accidental double click for next menu + } + + else { + const byte (*current_gmode)[12]= frame_gmodes[menu.get_mode()]; + matrix.loadPixels((uint8_t*)current_gmode, MATRIX_HEIGHT * MATRIX_WIDTH); + } + break; } case MENU_BOT_SKILLS: { - if (digitalRead(P2_BTN_BOTTOM) == LOW && current_bot_menu_idx < sizeof(frame_bot_skills)/sizeof(frame_bot_skills[0]) -1) { - current_bot_menu_idx += 1; - update_menu_bot_skills= true; - } - else if (digitalRead(P2_BTN_UP) == LOW && current_bot_menu_idx > 0) { - current_bot_menu_idx -= 1; - update_menu_bot_skills= true; - } - else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW) { - if (!p1 -> is_human()) p1 -> set_skills(current_bot_menu_idx + 1); - if (!p2 -> is_human()) p2 -> set_skills(current_bot_menu_idx + 1); - game_status= TIMER; - update_menu_bot_skills= false; - } else update_menu_bot_skills= false; - - if (update_menu_bot_skills) { - const byte (*current_skill_frame)[12]= frame_bot_skills[current_bot_menu_idx]; + // switch difficulty level + if (digitalRead(P2_BTN_BOTTOM) == LOW) { + menu.increase_skills(); + const byte (*current_skill_frame)[12]= frame_bot_skills[menu.get_skill()]; matrix.loadPixels((uint8_t*)current_skill_frame, MATRIX_HEIGHT * MATRIX_WIDTH); - update_menu= false; delay(300); } + else if (digitalRead(P2_BTN_UP) == LOW) { + menu.decrease_skills(); + const byte (*current_skill_frame)[12]= frame_bot_skills[menu.get_skill()]; + matrix.loadPixels((uint8_t*)current_skill_frame, MATRIX_HEIGHT * MATRIX_WIDTH); + delay(300); + } + + // choose difficulty level + else if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW) { + if (!p1 -> is_human()) p1 -> set_skills(menu.get_skill() + 1); + if (!p2 -> is_human()) p2 -> set_skills(menu.get_skill() + 1); + game_status= TIMER; + } + + else { + const byte (*current_skill_frame)[12]= frame_bot_skills[menu.get_skill()]; + matrix.loadPixels((uint8_t*)current_skill_frame, MATRIX_HEIGHT * MATRIX_WIDTH); + } break; } @@ -206,8 +206,9 @@ void loop() { // 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) { - game_status= MENU; engine.reset(); + game_status= MENU; + delay(300); } break; } diff --git a/src/config.h b/src/config.h index 333d4cc..ca1f3da 100644 --- a/src/config.h +++ b/src/config.h @@ -10,6 +10,6 @@ #define PADDLE_LENGTH 3 #define INITIAL_BALL_DELAY 200 -#define MAX_POINTS 9 -#define START_TIMER 3 +#define MAX_POINTS 2 +#define START_TIMER 2 #define FIRST_START_BALL_DELAY 500 diff --git a/src/menu.cpp b/src/menu.cpp new file mode 100644 index 0000000..fc767a8 --- /dev/null +++ b/src/menu.cpp @@ -0,0 +1,42 @@ +#include "menu.h" + +void Menu::next_mode() { + if (_game_mode < _game_modes(COUNT_MODES) - 1) + _game_mode= _game_modes(_game_mode+1); +} + +void Menu::prev_mode() { + if (_game_mode > 0) { + _game_mode= _game_modes(_game_mode-1); + } +} + +uint8_t Menu::get_mode() { + return _game_mode; +} + +uint8_t Menu::number_of_bots() { + if (_game_mode == PVC) return 1; + else if (_game_mode == CVC) return 2; + return 0; +} + +void Menu::increase_skills() { + if (_bot_skill < _bot_skill_levels(COUNT_SKILLS) - 1) + _bot_skill= _bot_skill_levels(_bot_skill+1); +} + +void Menu::decrease_skills() { + if (_bot_skill > 0) { + _bot_skill= _bot_skill_levels(_bot_skill-1); + } +} + +uint8_t Menu::get_skill() { + return _bot_skill; +} + +void Menu::reset_menu() { + _game_mode= PVP; + _bot_skill= EASY; +} diff --git a/src/menu.h b/src/menu.h new file mode 100644 index 0000000..b008a16 --- /dev/null +++ b/src/menu.h @@ -0,0 +1,26 @@ +#ifndef MENU_H +#define MENU_H + +#include +#include "font.h" + +class Menu { + + private: + enum _game_modes : uint8_t {PVP, PVC, CVC, COUNT_MODES}; + _game_modes _game_mode = PVP; + enum _bot_skill_levels : uint8_t {EASY, HARD, COUNT_SKILLS}; + _bot_skill_levels _bot_skill = EASY; + + public: + void next_mode(); + void prev_mode(); + uint8_t get_mode(); + uint8_t number_of_bots(); + void increase_skills(); + void decrease_skills(); + uint8_t get_skill(); + void reset_menu(); +}; + +#endif diff --git a/src/paddle.cpp b/src/paddle.cpp index 0cbcbff..65f6032 100644 --- a/src/paddle.cpp +++ b/src/paddle.cpp @@ -121,7 +121,7 @@ uint8_t BotPaddle::get_skills() { } void BotPaddle::set_skills(uint8_t skills) { - if (skills < 0) _skills= 0; - else if (skills > 1) _skills= 1; + if (skills < 1) _skills= 1; + else if (skills > 2) _skills= 2; else _skills= skills; }