Preview:
import processing.serial.*;

Serial myPort; // Create a variable for the serial port
int circleFillColor = color(255); // Default fill color for the circle
char[] colorKeys = {'R', 'G', 'B'}; // Keys corresponding to colors
int points = 0; // Player's points
int missedColors = 0; // Counter for missed colors
boolean gameStarted = false; // Flag to start the game

void setup() {
  size(800, 600); // Set the size of the Processing window
  myPort = new Serial(this, "COM3", 9600); // Replace "COM3" with your Arduino's port
}

void draw() {
  background(220); // Set background color
  
  if (gameStarted) {
    // Display the circle based on the selected color
    fill(circleFillColor);
    ellipse(width / 2, height / 2, 100, 100); // Display a circle at the center of the window
  }
  
  // Display score and missed colors
  textAlign(CENTER);
  displayInfo1();
  displayInfo2();
  displayInstructions(); // Display game instructions
  
  // Check for game over condition
  if (missedColors >= 3) {
    gameOver();
  }
  
  // Read data from the serial port
  while (myPort.available() > 0) {
    String wasteType = myPort.readStringUntil('\n'); // Read data from serial port
    if (wasteType != null) {
      wasteType = wasteType.trim(); // Remove whitespace
      
      // Set circle color based on received distance signal
      if (wasteType.equals("RECYCLABLE")) {
        circleFillColor = color(0, 255, 0); // Green for recyclable
      } else if (wasteType.equals("NON_RECYCLABLE")) {
        circleFillColor = color(255, 0, 0); // Red for non-recyclable
      } else if (wasteType.equals("COMPOSTABLE")) {
        circleFillColor = color(0, 0, 255); // Blue for compostable
      }
      
      gameStarted = true; // Start the game when signal received
    }
  }
}

void keyPressed() {
  if (gameStarted) {
    char keyPressed = Character.toUpperCase(key);
    for (int i = 0; i < colorKeys.length; i++) {
      if (keyPressed == colorKeys[i]) {
        if (keyPressed == getColorChar(circleFillColor)) {
          // If player presses the correct key corresponding to the displayed color
          points++;
          missedColors = 0; // Reset missed colors
          gameStarted = false; // Set to false to refresh the color
          pickRandomColor(); // Choose a new random color
        } else {
          missedColors++;
          if (missedColors >= 3) {
            gameOver();
          }
        }
        break; // Exit loop after handling input
      }
    }
  } else {
    // Start the game when the ENTER key is pressed
    if (keyCode == ENTER) {
      gameStarted = true;
      pickRandomColor(); // Choose a random color to start
    }
  }
}

void displayInfo1() {
  // Display score and missed colors
  fill(0);
  textSize(35);
  text("Points: " + points, width / 2, 40);
}

void displayInfo2() {
  // Display score and missed colors
  fill(0);
  textSize(20);
  text("Missed: " + missedColors, width / 2, 60);
}

void displayInstructions() {
  // Display game instructions at the bottom
  textAlign(CENTER);
  fill(50);
  textSize(16);
  text("Play, Learn, Act: Games for Sustainable Impact – Aligning Fun with Global Goals! \n GREEN for RECYCLABLE RED for NON RECYCLABLE and BLUE for COMPOSTABLE \n Press 'R', 'G', or 'B' when corresponding color appears.\n If you miss 3 in row you'll lose.", width / 2, height - 80);
}

void pickRandomColor() {
  // Pick a random color and display the corresponding color
  int randomIndex = int(random(colorKeys.length));
  char selectedColor = colorKeys[randomIndex];
  
  if (selectedColor == 'R') {
    circleFillColor = color(255, 0, 0); // Red
  } else if (selectedColor == 'G') {
    circleFillColor = color(0, 255, 0); // Green
  } else if (selectedColor == 'B') {
    circleFillColor = color(0, 0, 255); // Blue
  }
}

char getColorChar(int fillColor) {
  // Get the character corresponding to the color
  if (fillColor == color(0, 255, 0)) {
    return 'G';
  } else if (fillColor == color(255, 0, 0)) {
    return 'R';
  } else if (fillColor == color(0, 0, 255)) {
    return 'B';
  }
  return ' ';
}

void gameOver() {
  // Display game over message
  fill(0, 0, 2);
  textSize(80);
  textAlign(CENTER);
  text("Game Over!", width / 2, height / 2);
  
  // Show information about waste recycling in a new window
  showRecyclingInfo();
}

void showRecyclingInfo() {
  // Open a new window to display waste recycling information
  PGraphics recyclingWindow = createGraphics(780, 580);
  recyclingWindow.beginDraw();
  recyclingWindow.background(240);
  recyclingWindow.fill(0);
  recyclingWindow.textAlign(CENTER);
  recyclingWindow.textSize(25);
  recyclingWindow.text("Let's make this world awesome together!", recyclingWindow.width / 2, 100);
  // Add your recycling information text or graphics here
  recyclingWindow.text("Hey, Want to make a splash in saving our planet? \n Here's the deal: \n Sort your waste like a pro – \n recycle plastics, papers, and cans. \n Compost those food scraps for a happy garden. \n  Reduce, reuse, recycle – it's your superhero trio against waste! \n Let's team up and make our world cleaner, cooler, and super awesome!", recyclingWindow.width / 2, 150);
  recyclingWindow.text("Join the movement for a sustainable future!", recyclingWindow.width / 2, 450);
  recyclingWindow.endDraw();
  image(recyclingWindow, width / 2 - recyclingWindow.width / 2, height / 2 - recyclingWindow.height / 2);
}
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter