// Arduino Dice Roller on Wokwi Arduino Simulator
//Resistors are omitted. wires are hidden for simplicity 
#include <LiquidCrystal.h>
#define BUTTON_PIN A0
#define Buzzer_Count A1




const byte die1Pins[] = { 2, 3, 4, 5, 6, 7, 8};
const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 13, d7 = 1;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);



void setup() {

  lcd.begin(16,2);

  lcd.setCursor(3,0);
   lcd.print("Welcome to");
   lcd.setCursor(2,1);
   lcd.print("The Dice Game!");
   delay(2000);
   lcd.clear();

   lcd.setCursor(0,0);
   lcd.print("Hold the button");
   lcd.setCursor(0,1);
   lcd.print("to roll the dice!");
   delay(2000);
   lcd.clear();


  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, OUTPUT);
  for (byte i = 0; i < 7; i++) {
    pinMode(die1Pins[i], OUTPUT);
  }

  
}

void displayNumber(const byte pins[], byte number) {
  digitalWrite(pins[0], number > 1 ? HIGH : LOW); // top-left
  digitalWrite(pins[1], number > 3 ? HIGH : LOW); // top-right
  digitalWrite(pins[2], number == 6 ? HIGH : LOW); // middle-left
  digitalWrite(pins[3], number % 2 == 1 ? HIGH : LOW); // center
  digitalWrite(pins[4], number == 6 ? HIGH : LOW); // middle-right
  digitalWrite(pins[5], number > 3 ? HIGH : LOW); // bottom-left
  digitalWrite(pins[6], number > 1 ? HIGH : LOW); // bottom-right
}

bool randomReady = false;


void loop(){

  bool buttonPressed = digitalRead(BUTTON_PIN) == LOW;                
  bool buttonNotPressed = digitalRead(BUTTON_PIN) == HIGH;
 

  
  if(!randomReady && buttonPressed) { 

    // to initialize the random number generator
    randomSeed(micros());
    randomReady = true;
  }
  

  if(buttonPressed) {
    for (byte i = 0; i < 10; i++) {
      int num1 = random(1, 7);
      displayNumber(die1Pins, num1);
      delay(50 + i * 20);
      lcd.setCursor(4,0);
      lcd.print("Rolling!");
      lcd.setCursor(7,1);
      lcd.print(num1);

      }
  }

  if(buttonNotPressed && randomReady) { 
      lcd.setCursor(4,0);
      lcd.print("!Winner!");
      delay(750);
      lcd.setCursor(4,0);
      lcd.print("            ");
      lcd.setCursor(4,0);
      lcd.print("!Winner!");
      delay(750);
      lcd.setCursor(4,0);
      lcd.print("            ");

      lcd.setCursor(2,0);
      lcd.print("!Roll Again!");
      delay(1000);
      lcd.setCursor(0,0);
      lcd.print("                      ");

    for (byte i = 0; i <Buzzer_Count; i++) {

      digitalWrite(A1,HIGH);
      delay(200);
      digitalWrite(A1,LOW);
      delay(200);
    }
    
  }
}