#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal_I2C.h>
#define PIN_NEO_PIXEL 2
#define NUM_PIXELS 64
#define LEFT_BUTTON 4
#define RIGHT_BUTTON 3
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
Adafruit_NeoPixel NeoPixel(NUM_PIXELS, PIN_NEO_PIXEL, NEO_GRB + NEO_KHZ800);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
int posPaddleX = 3;
int posPaddleY = 7;
int posBallX = 3;
int posBallY = 6;
int dirBallX = 1;
int dirBallY = -1;
void setup() {
NeoPixel.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("-- PING PONG --");
pinMode(LEFT_BUTTON, INPUT_PULLUP);
pinMode(RIGHT_BUTTON, INPUT_PULLUP);
}
void loop() {
//Read button
char tecla = 0;
displayGame();
if (updateBall()) {
lcd.setCursor(0, 1);
lcd.print("PERDIO!");
while(1) {}
}
if (digitalRead(LEFT_BUTTON)==LOW) {
posPaddleX--;
if(posPaddleX<0) {
posPaddleX=0;
}
}
if (digitalRead(RIGHT_BUTTON)==LOW) {
posPaddleX++;
if(posPaddleX>6) {
posPaddleX=6;
}
}
delay(100);
}
void displayGame() {
NeoPixel.clear();
//Display paddle
NeoPixel.setPixelColor(posPaddleY*8+posPaddleX, NeoPixel.Color(0, 0, 255));
NeoPixel.setPixelColor(posPaddleY*8+posPaddleX+1, NeoPixel.Color(0, 0, 255));
//Display ball
NeoPixel.setPixelColor(posBallY*8+posBallX, NeoPixel.Color(0, 2550, 0));
NeoPixel.show();
}
int updateBall() {
posBallX += dirBallX;
posBallY += dirBallY;
//Collision with left & right walls
if (posBallX<0) {
posBallX = 0;
dirBallX = 1;
}
if (posBallX>7) {
posBallX = 7;
dirBallX = -1;
}
//Collision with top wall
if (posBallY<0) {
posBallY = 0;
dirBallY = 1;
}
//Check if collision with paddle
if (posBallY==7) {
if((posBallX>=posPaddleX) && (posBallX<posPaddleX+1)) {
posBallY = 6;
dirBallY = -1;
} else {
return 1;
}
}
return 0;
}