A (simple) tribute to the mythical PONG of the 70s (Processing 3.3.7)

Here is my shy tribute to the mythical Pong of the 70s (It’s an experiment… I’m a 69 years old beginners so … be patient).
It works fine in Android Mode on my Oppo A74 5G: change the lines as suggested in the comments to use this code in Android Mode.
The “eps2” random value (//*** in the code) provides a slightly random bouncing on the topo of the screen; this is to prevent “ball loops” where the ball would follow the same pattern and the player could go on and on keeping the paddle in a fixed position.
You move the paddle shifting your finger beneath the paddle. You start the game or play a new game touching the screen beneath the paddle.
Speed increases (until it reaches a maximum) and you score one point each time the ball touches the paddle (extra ball at 50 and 70 points).
In the “Game Over” screen there is a warning text: “this game can cause pathological addiction. Play in moderation” :wink:

float x, y, p;
float dx, dy;
float bordo, ly, lx, llx, lly;
float n=3; // Use n=9 for Android Mode; n=3 for Java Mode
float epsilon;
int sc=0;
int nb=3; 
int screen=1; //1>Introduction, 2>Play, 3>Game Over
float raggio;
float eps2;
int bkg=105;

void setup() {
  orientation(PORTRAIT);

  // Use "fullScreen()" for Android Mode; 
  // Use "size(295,656)" for Java Mode

  //fullScreen();
  size(295, 656);

  ellipseMode(RADIUS);
  bordo=min(height, width)/10;
  ly=0.8*height-bordo/2; // limite massimo per y
  lly=bordo/2; // limite minimo per y
  lx=width-bordo/2; //limite massimo per x
  llx=bordo/2; // limite minimo per x
  inclinazione();
  p=width/8; //lunghezza paletta - paddle lenght
  raggio=0.25*p;
  epsilon=0.65*p;
  x=random(llx+epsilon, lx-epsilon);
  y=random(lly+epsilon, ly/2);  
  textSize(bordo/2);
}

void draw() {
  background(bkg); // grigio
  strokeWeight(bordo);
  stroke(0);// nero
  noFill();
  rect(0, 0, width, height);
  strokeWeight(3);
  line(0, ly, width, ly);
  fill(255);// bianco
  if (screen==1) {
    bkg=105;
    eps2=0;
    sc=0;
    n=3; // Use n=9 for Android Mode; n=3 for Java Mode
    textSize(bordo);
    text("    A-PONG", 1.5*bordo, 3*bordo);
    textSize(bordo/2);
    text("Un omaggio al mitico....", 2*bordo, 5*bordo);
    text("PONG degli anni settanta", 2*bordo, 6*bordo);
    text("Muovi spostando il dito", 2*bordo, 8*bordo);
    text("sotto la racchetta", 2*bordo, 9*bordo);
    text("** Extra ball a 50 punti **", 2*bordo, 11*bordo);
    text("** Extra ball a 70 punti **", 2*bordo, 12*bordo);
    text("Tocca lo schermo", 2*bordo, 14*bordo);
    text("sotto la racchetta", 2*bordo, 15*bordo);
    text("per giocare.", 2*bordo, 16*bordo);
    variazione();
  }

  if (screen==2) {
    text("Score: "+str(sc), 1.5*bordo, 2*bordo);
    text("Balls: "+str(nb), 1.5*bordo, 3*bordo);
    noStroke();
    rect(mouseX-p/2, 0.8*height-bordo/2, p, bordo/3);
    ellipse(x, y, raggio, raggio);
    eps2=0;
    if (y>=ly-raggio) {
      if (abs(mouseX-x)<epsilon) {
        y=ly-raggio;
        dy=-dy;
        if (n<20) {
          n=n+0.8;
        }
        sc++;
        if (sc==50) {
          nb++;
          bkg=75;
        }
        if (sc==70) {
          nb++;
          bkg=50;
        }
      } else
        fine();
    }
    if (y<lly+raggio) {
      y=lly+raggio;
      dy=-dy;
      eps2=random(-12, 12);
    } //***
    if (x>lx-raggio) {
      x=lx-raggio;
      dx=-dx;
    } 
    if (x<llx+raggio) {
      x=llx+raggio;
      dx=-dx;
    }
    x=x+n*(dx+eps2);
    y=y+n*dy;
  }

  if (screen==3) {
    bkg=105;
    n=3; // Use n=9 for Android Mode; n=3 for Java Mode
    eps2=0;
    text("Final Score: "+str(sc), 1.5*bordo, 2*bordo);
    textSize(bordo);
    text("  GAME OVER", 1.5*bordo, 4*bordo);
    textSize(bordo/2);
    text("Un esperimento di E. Rapella", 1.5*bordo, 6*bordo);
    text("con 'Processing for Android'", 1.5*bordo, 7*bordo);
    text("Tocca lo schermo", 1.5*bordo, 9*bordo);
    text("sotto la racchetta", 1.5*bordo, 10*bordo);
    text("per un'altra partita,", 1.5*bordo, 11*bordo);
    text("** ATTENZIONE **", 1.5*bordo, 13*bordo);
    text("Questo gioco puo' causare", 1.5*bordo, 14*bordo);
    text("dipendenza patologica.", 1.5*bordo, 15*bordo);
    text("Gioca con moderazione!", 1.5*bordo, 16*bordo);
    variazione();
  } // end if screen==3
} // end draw()

void inclinazione() {
  dx=1.3;
  dy=random(-2.7, -1.3);
}

void mousePressed() {
  if (mouseY>ly) {
    if (screen==1) {
      n=3; // Use n=9 for Android Mode; n=3 for Java Mode
      screen=2;
      inclinazione();
    } 
    if (screen==3) {
      n=3; // Use n=9 for Android Mode; n=3 for Java Mode
      sc=0;
      nb=3;
      screen=1;
      inclinazione();
    }
  }
} 

void fine() {
  if (nb>0) {
    nb=nb-1;
    x=random(llx, lx);
    y=random(lly, ly/2);
    inclinazione();
    n=3; // Use n=9 for Android Mode; n=3 for Java Mode
  } else
  {
    inclinazione();
    screen=3;
  }
} // end fine()

void variazione() {
  noStroke();
  rect(x-p/2, 0.8*height-bordo/2, p, bordo/3);
  ellipse(x, y, raggio, raggio);
  if (y>ly-raggio) {
    y=ly-raggio;
    dy=-dy;
  }
  if (y<lly+raggio) {
    y=lly+raggio;
    dy=-dy;
  }
  if (x>lx-raggio) {
    x=lx-raggio;
    dx=-dx;
  } 
  if (x<llx+raggio) {
    x=llx+raggio;
    dx=-dx;
  } 
  x=x+n*dx;
  y=y+n*dy;
}
3 Likes