This video demonstrates the basic circuitry for Whac-A-Mole. The lever switch will later be replaced by a series of buttons held underneath the solenoids. When an extended solenoid piston is hit, it will depress the button and a new random piston will extend. The stepper motor will be used to drive the score-keeping mechanism.

Code:

//====================================================================================
//Digital Port Definitions
#define HIT_TRIGGER 9
#define MOTOR_DIR 10
#define MOTOR_STEP 11
enum mole_t {MOLE_0, MOLE_1, MOLE_2, MOLE_3, MOLE_4, MOLE_5, MOLE_6, MOLE_7, MOLE_8};

//====================================================================================
//State Definitions
enum state_t {GAME_IDLE, NEW_MOLE, WAIT_HIT, WAS_HIT, NOT_HIT, GAME_OVER} game_state;
int mole;
int score;
int timer;

//====================================================================================
void setup() {
  //set up the moles
  pinMode(MOLE_0, OUTPUT); digitalWrite(MOLE_0, LOW);
  pinMode(MOLE_1, OUTPUT); digitalWrite(MOLE_1, LOW);
  pinMode(MOLE_2, OUTPUT); digitalWrite(MOLE_2, LOW);
  pinMode(MOLE_3, OUTPUT); digitalWrite(MOLE_3, LOW);
  pinMode(MOLE_4, OUTPUT); digitalWrite(MOLE_4, LOW);
  pinMode(MOLE_5, OUTPUT); digitalWrite(MOLE_5, LOW);
  pinMode(MOLE_6, OUTPUT); digitalWrite(MOLE_6, LOW);
  pinMode(MOLE_7, OUTPUT); digitalWrite(MOLE_7, LOW);
  pinMode(MOLE_8, OUTPUT); digitalWrite(MOLE_8, LOW);
  
  //set up hit feedback
  pinMode(HIT_TRIGGER, INPUT);

  //set up score-keeping motor
  pinMode(MOTOR_DIR, OUTPUT); 
  pinMode(MOTOR_STEP, OUTPUT);

  //initialize gamestate
  game_state = GAME_IDLE;
  score = 0;
}

void loop() {
  timer++;
  switch(game_state) {
    case GAME_IDLE:
      game_state = NEW_MOLE;
      break;
      
    case NEW_MOLE:
      new_mole();
      timer = 0;
      game_state = WAIT_HIT;
      break;
      
    case WAIT_HIT:
      if (!digitalRead(HIT_TRIGGER)) {
        digitalWrite(mole, LOW); 
        game_state = WAS_HIT;
      }
      else if (timer >= random(1000,3000)) {
        digitalWrite(mole, LOW);
        timer = 0; 
        game_state = NOT_HIT;
      }
      break;
      
    case WAS_HIT:
      score++;
      game_state = NEW_MOLE;
      digitalWrite(MOTOR_DIR, HIGH);
      for(int i = 0; i < 80; i++) {
        digitalWrite(MOTOR_STEP, HIGH); delay(1);
        digitalWrite(MOTOR_STEP, LOW);  delay(1);
      }
      break;

    case NOT_HIT:
      game_state = NEW_MOLE;
      break;
      
    case GAME_OVER:
      break;
      
  }
  delay(1);
}

void new_mole(){
  delay(random(1000));
  mole = random(9);
  digitalWrite(mole, HIGH); 
  delay(10);
}