#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); Set the LCD address to 0x27 for a 16×2 display —————————————PINS————————————————
const int Player_1_moveButton = A0; Joystick Pin for Player 1 const int Player_2_moveButton = A2; Joystick Pin for Player 2 const int ScoreBuzzerPin = 9;
—————————————CLASSES———————————————— class Paddle { public: int Paddle_X; int Paddle_Y; int Paddle_Length; Paddle(int x, int y, int length) { Paddle_X = x; Paddle_Y = y; Paddle_Length = length; } void PrintPaddle() { for (int i = 0; i < Paddle_Length; i++) { lcd.setCursor(Paddle_X, Paddle_Y + i); lcd.write(byte(0)); } } void ClearPaddle() { for (int i = 0; i < Paddle_Length; i++) { lcd.setCursor(Paddle_X, Paddle_Y + i); lcd.print(” ”); } } void MovePaddleUp() { if (Paddle_Y > 0) { ClearPaddle(); Paddle_Y–; PrintPaddle(); } } void MovePaddleDown() { if (Paddle_Y < 1) { ClearPaddle(); Paddle_Y++; PrintPaddle(); } } }; class Ball { public: int Ball_X; int Ball_Y; int Ball_Velocity_X; int Ball_Velocity_Y; Ball(int x, int y, int velocityX, int velocityY) { Ball_X = x; Ball_Y = y; Ball_Velocity_X = velocityX; Ball_Velocity_Y = velocityY; } void PrintBall() { lcd.setCursor(Ball_X, Ball_Y); lcd.write(byte(1)); } void ClearBall() { lcd.setCursor(Ball_X, Ball_Y); lcd.print(” ”); } void moveDiagonal() { ClearBall(); Ball_X += Ball_Velocity_X; Ball_Y += Ball_Velocity_Y; PrintBall(); if (Ball_Y == 0 || Ball_Y == 1) { Ball_Velocity_Y *= -1; } } }; —————————————OBJECTS————————————————
Paddle player1(0, 0, 2); Creating Object for Player 1 Paddle Paddle player2(0, 1, 2); Creating Object for Player 2 Paddle Ball ball(7, 1, 1, 1); Creating Object for Ball —————————————SETUP————————————————
void setup() {
lcd.init(); // Initialize the LCD lcd.backlight(); // Turn on the backlight
pinMode(Player_1_moveButton, INPUT); pinMode(Player_2_moveButton, INPUT); pinMode(ScoreBuzzerPin, OUTPUT);
player1.PrintPaddle(); player2.PrintPaddle(); ball.PrintBall();
ShowStartingScreen();
}
—————————————SCOREBOARD———————————————— void PrintScoreboard(int player1Score, int player2Score) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(“P1: ”); lcd.print(player1Score); lcd.setCursor(6, 0); lcd.print(“P2: ”); lcd.print(player2Score); delay(500); Display the scoreboard for 0.5 seconds
lcd.clear();
}
—————————————SCREENS———————————————— void ShowStartingScreen() { lcd.clear(); lcd.setCursor(3, 0); lcd.print(“Pong Game”); delay(2000); lcd.clear(); } void ShowGameOverScreen() { lcd.clear(); lcd.setCursor(4, 0); lcd.print(“Game Over”); delay(2000); lcd.clear(); } void PlayScoreSound() { tone(ScoreBuzzerPin, 1000, 200); Play a sound for 200ms at a frequency of 1000Hz
delay(200); // Wait for 200ms to avoid overlapping sounds
}
—————————————LOOP———————————————— void loop() { Player 1 controls
if (analogRead(Player_1_moveButton) < 500) { player1.MovePaddleUp(); } else if (analogRead(Player_1_moveButton) > 1500) { player1.MovePaddleDown(); }
// Player 2 controls if (analogRead(Player_2_moveButton) < 500) { player2.MovePaddleUp(); } else if (analogRead(Player_2_moveButton) > 1500) { player2.MovePaddleDown(); }
// Ball movement ball.moveDiagonal();
// Check if a point is scored static int player1Score = 0; static int player2Score = 0;
if (ball.Ball_X == 15) // Replace with actual condition for player 1 scoring { player1Score++; PrintScoreboard(player1Score, player2Score);
if (player1Score >= 8 || player2Score >= 8) { ShowGameOverScreen(); player1Score = 0; player2Score = 0; ball.ClearBall(); ball = Ball(7, 1, 1, 1); // Reset the ball position ball.PrintBall(); ShowStartingScreen(); } else { PlayScoreSound(); ball.ClearBall(); ball = Ball(7, 1, 1, 1); // Reset the ball position ball.PrintBall(); } } else if (ball.Ball_X == 0) // Replace with actual condition for player 2 scoring { player2Score++; PrintScoreboard(player1Score, player2Score);
if (player1Score >= 8 || player2Score >= 8) { PlayScoreSound(); ShowGameOverScreen(); player1Score = 0; player2Score = 0; ball.ClearBall(); ball = Ball(7, 1, 1, 1); // Reset the ball position ball.PrintBall(); ShowStartingScreen(); } else { ball.ClearBall(); ball = Ball(7, 1, 1, 1); // Reset the ball position ball.PrintBall(); } }
// Delay for smoother gameplay delay(150);
}
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.