#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define KEY A0
#define HOR A1
#define VER A2
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 d(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define BALL_W 5
#define BALL_H 4
const PROGMEM byte ball[] = {
  B01110000,
  B11111000,
  B11111000,
  B01110000,
};
float ballX=30, ballY, ballSpeedX=2, ballSpeedY=2;
#define PLT_W 24
#define PLT_H 4
const PROGMEM byte platform[] = {
  B01111111,B11111111,B11111110,
  B11111111,B11111111,B11111111,
  B11111111,B11111111,B11111111,
  B01111111,B11111111,B11111110,
};
float pltX=30, pltY, pltSpeedX=2, pltSpeedY=0;
int score = 0;
void checkBallCollision(){
  if ( ballX > pltX - BALL_W ){
    if (ballX < pltX + PLT_W ) {
      if ( ballY >= pltY - PLT_H ) {
        ballY = pltY - BALL_W;
        ballSpeedY = -ballSpeedY; 
        score++ ;
      }
    }
  }
}
boolean move_ball(){
  d.drawBitmap(ballX, ballY, ball, BALL_W, BALL_H, 0);
  ballX += ballSpeedX;
  ballY += ballSpeedY;
  if (ballX < 0) {
    ballX = 0;
    ballSpeedX = -ballSpeedX;
  }
  if (ballX > SCREEN_WIDTH - BALL_W ){
    ballX = SCREEN_WIDTH - BALL_W;
    ballSpeedX = -ballSpeedX;
  }
  if (ballY < 0) {
    ballY = 0;
    ballSpeedY = -ballSpeedY;
  }
  if ( ballY > SCREEN_HEIGHT - BALL_H ) {
    //ballY = SCREEN_HEIGHT - BALL_H;
    //ballSpeedY = -ballSpeedY;
    return ( 0 );
  }
  checkBallCollision();
  d.drawBitmap(ballX, ballY, ball, BALL_W, BALL_H, 1);
  return (1);
}
void move_platform(){
  d.drawBitmap(pltX, pltY, platform, PLT_W, PLT_H, 0);
  int a = analogRead( HOR );
  if ( a < 400 ) pltX += pltSpeedX;
  if ( a > 600 ) pltX -= pltSpeedX;
  if (pltX < 0) pltX = 0;
  if (pltX > SCREEN_WIDTH - PLT_W ) pltX = SCREEN_WIDTH - PLT_W;
  d.drawBitmap(pltX, pltY, platform, PLT_W, PLT_H, 1);
}
void setup() {
  pinMode( KEY, INPUT_PULLUP );
  pinMode( HOR, INPUT );
  pinMode( VER, INPUT );
  d.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
}
void loop() {
  d.clearDisplay();
  d.display();
  score = 0;
  pltX = (SCREEN_WIDTH + PLT_W)/2;
  pltY = SCREEN_HEIGHT - PLT_H;
  ballX = random(SCREEN_WIDTH - BALL_W);
  ballY = 0;
  ballSpeedX = random(3)+1;
  ballSpeedY = random(2)+1;
  d.setTextSize(1);
  d.setTextColor(1);
  while (true) {
    move_platform();
    if (! move_ball() ) break;
    d.fillRect(2,2,24,8,0);
    d.setCursor(2,2);
    d.print(score);
    d.display();
  }
  d.setCursor(20,25);
  d.setTextSize(2);
  d.print("Looser!");
  d.display();
  delay(500);
}