// Pocket Slot Machine
//
// Uses three strips of LEDs to represent the values
// Separate LEDs of red, blue, and green

#define Click 2
#define Green1 3
#define Red1 4
#define Blue1 5
#define Green2 6
#define Red2 7
#define Blue2 8
#define Green3 9
#define Red3 10
#define Blue3 11
#define Start_Sw 12

#define Num_Clicks 4

const byte LED_Array[27][3] = {
  {1, 1, 1},
  {1, 1, 2},
  {1, 1, 3},
  {1, 2, 1},
  {1, 2, 2},
  {1, 3, 3},
  {1, 3, 1},
  {1, 3, 2},
  {1, 3, 3},

  {2, 1, 1},
  {2, 1, 2},
  {2, 1, 3},
  {2, 2, 1},
  {2, 2, 2},
  {2, 2, 3},
  {2, 3, 1},
  {2, 3, 2},
  {2, 3, 3},

  {3, 1, 1},
  {3, 1, 2},
  {3, 1, 3},
  {3, 2, 1},
  {3, 2, 2},
  {3, 2, 3},
  {3, 3, 1},
  {3, 3, 2},
  {3, 3, 3}
};

byte Random;

void setup() {
  pinMode(Click, OUTPUT);
  pinMode(Red1, OUTPUT);
  pinMode(Red2, OUTPUT);
  pinMode(Red3, OUTPUT);
  pinMode(Green1, OUTPUT);
  pinMode(Green2, OUTPUT);
  pinMode(Green3, OUTPUT);
  pinMode(Blue1, OUTPUT);
  pinMode(Blue2, OUTPUT);
  pinMode(Blue3, OUTPUT);
  pinMode(Start_Sw, INPUT_PULLUP);
  digitalWrite(Click, LOW);
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, LOW);
  digitalWrite(Red3, LOW);
  digitalWrite(Green1, LOW);
  digitalWrite(Green2, HIGH);
  digitalWrite(Green3, LOW);
  digitalWrite(Blue1, LOW);
  digitalWrite(Blue2, LOW);
  digitalWrite(Blue3, HIGH);
  delay(1000);
}

void loop() {
  Random++;

  if (digitalRead(Start_Sw) == LOW)
    Spin();
}

void Spin() {
  byte i = 0;
  byte j = Random % 27;
  byte color1;
  byte color2;
  byte color3;

  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
  digitalWrite(Red3, LOW);
  digitalWrite(Green1, LOW);
  digitalWrite(Green2, LOW);
  digitalWrite(Green3, LOW);
  digitalWrite(Blue1, LOW);
  digitalWrite(Blue2, LOW);
  digitalWrite(Blue3, LOW);

  while (i < 15)
  {
    color1 = LED_Array[j][0];
    color2 = LED_Array[j][1];
    color3 = LED_Array[j][2];

    if (color1 == 1)
      digitalWrite(Red1, HIGH);
    else if (color1 == 2)
      digitalWrite(Green1, HIGH);
    else
      digitalWrite(Blue1, HIGH);

    //Clickit();

    if (color2 == 1)
      digitalWrite(Red2, HIGH);
    else if (color2 == 2)
      digitalWrite(Green2, HIGH);
    else
      digitalWrite(Blue2, HIGH);

    //Clickit();

    if (color3 == 1)
      digitalWrite(Red3, HIGH);
    else if (color3 == 2)
      digitalWrite(Green3, HIGH);
    else
      digitalWrite(Blue3, HIGH);

    Clickit();

    i++;
    j = j + 5;
    j = j % 27;
    
    digitalWrite(Red1, LOW);
    digitalWrite(Red2, LOW);
    digitalWrite(Red3, LOW);
    digitalWrite(Green1, LOW);
    digitalWrite(Green2, LOW);
    digitalWrite(Green3, LOW);
    digitalWrite(Blue1, LOW);
    digitalWrite(Blue2, LOW);
    digitalWrite(Blue3, LOW);
  }

  color1 = LED_Array[j][0];
  color2 = LED_Array[j][1];
  color3 = LED_Array[j][2];

  if (color1 == 1)
    digitalWrite(Red1, HIGH);
  else if (color1 == 2)
    digitalWrite(Green1, HIGH);
  else
    digitalWrite(Blue1, HIGH);

  Clickit();

  if (color2 == 1)
    digitalWrite(Red2, HIGH);
  else if (color2 == 2)
    digitalWrite(Green2, HIGH);
  else
    digitalWrite(Blue2, HIGH);

  Clickit();

  if (color3 == 1)
    digitalWrite(Red3, HIGH);
  else if (color3 == 2)
    digitalWrite(Green3, HIGH);
  else
    digitalWrite(Blue3, HIGH);

  delay(1000);

  if ((color1 == color2) && (color2 == color3))
    Winner(color1);
}

void Clickit() {
  byte i;

  for (i = 0; i <= Num_Clicks; i++) {
    digitalWrite(Click, HIGH);
    delay(2);
    digitalWrite(Click, LOW);
    delay(100);
  }
}

void Winner(byte color) {
  byte j = 0;

  while (j < 5) {
    digitalWrite(Red1, HIGH);
    digitalWrite(Green1, HIGH);
    digitalWrite(Blue1, HIGH);
    digitalWrite(Click, HIGH);
    delay(100);
    digitalWrite(Red1, LOW);
    digitalWrite(Green1, LOW);
    digitalWrite(Blue1, LOW);
    digitalWrite(Click, LOW);
    delay(100);

    digitalWrite(Red2, HIGH);
    digitalWrite(Green2, HIGH);
    digitalWrite(Blue2, HIGH);
    digitalWrite(Click, HIGH);
    delay(100);
    digitalWrite(Red2, LOW);
    digitalWrite(Green2, LOW);
    digitalWrite(Blue2, LOW);
    digitalWrite(Click, LOW);
    delay(100);

    digitalWrite(Red3, HIGH);
    digitalWrite(Green3, HIGH);
    digitalWrite(Blue3, HIGH);
    digitalWrite(Click, HIGH);
    delay(100);
    digitalWrite(Red3, LOW);
    digitalWrite(Green3, LOW);
    digitalWrite(Blue3, LOW);
    digitalWrite(Click, LOW);
    delay(100);

    j++;
  }

  if (color == 1)
  {
    digitalWrite(Red1, HIGH);
    digitalWrite(Red2, HIGH);
    digitalWrite(Red3, HIGH);
  }
  else if (color == 2)
  {
    digitalWrite(Green1, HIGH);
    digitalWrite(Green2, HIGH);
    digitalWrite(Green3, HIGH);
  }
  else
  {
    digitalWrite(Blue1, HIGH);
    digitalWrite(Blue2, HIGH);
    digitalWrite(Blue3, HIGH);
  }

}
