#define POT A0
#define HOD 7
#define ZMENA 8


byte typAnime = 3;
byte kostka[]={2,3,4,5,6,9,10,11,12,13}; // piny pro led kostku

byte dots[12][10]{
  {0,1,0,1,0,0,1,0,1,0}, //1

  {0,0,1,0,0,0,0,1,0,0}, //2

  {1,1,0,0,0,0,0,0,1,1}, //3

  {1,0,0,0,1,1,0,0,0,1}, //4

  {1,1,0,1,1,1,1,0,1,1}, //5

  {1,0,1,0,1,1,0,1,0,1}, //6

  {0,1,0,1,0,0,1,0,1,0}, //1

  {0,0,1,0,0,0,0,1,0,0}, //2

  {1,1,0,0,0,0,0,0,1,1}, //3

  {1,0,0,0,1,1,0,0,0,1}, //4

  {1,1,0,1,1,1,1,0,1,1}, //5

  {1,0,1,0,1,1,0,1,0,1} //6

};



/*

Zapojeni kostky

2            9

     3 10  
4            11         
     5 12    

6            13


*/
int rychlostAnimace =0;

void animace1() {
  int delkaHodu = rand() % 5 + 3;

 
  for (int i = 0; i < delkaHodu; i++) {

    digitalWrite(kostka[0], 1);
    digitalWrite(kostka[5], 1);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[0], 0);
    digitalWrite(kostka[5], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[2], 1);
    digitalWrite(kostka[7], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[2], 0);
    digitalWrite(kostka[7], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 1);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[9], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 0);
    digitalWrite(kostka[9], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[1], 1);
    digitalWrite(kostka[6], 1);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[1], 0);
    digitalWrite(kostka[6], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 1);
    digitalWrite(kostka[8], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 0);
    digitalWrite(kostka[8], 0);
      displayNumber(0);
      zhasnuto();
  }
}

void animace2() {
  int delkaHodu = rand() % 5 + 3;

 
  for (int i = 0; i < delkaHodu; i++) {

    digitalWrite(kostka[5], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[5], 0);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[6], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[6], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[2], 1);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[2], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[0], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[0], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[1], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[1], 0);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[8], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[8], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[9], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[9], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[7], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[7], 0);
      displayNumber(0);
      zhasnuto();
      
  }
}

void animace3() {
  int delkaHodu = rand() % 5 + 3;

 
  for (int i = 0; i < delkaHodu; i++) {

    digitalWrite(kostka[0], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[0], 0);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[2], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[2], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[4], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[3], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[1], 1);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[1], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[6], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[6], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[8], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[8], 0);
      delay(rychlostAnimace);
        rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
    digitalWrite(kostka[9], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[9], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[7], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[7], 0);
      delay(rychlostAnimace);
    digitalWrite(kostka[5], 1);
      delay(rychlostAnimace);
    digitalWrite(kostka[5], 0);
      displayNumber(0);
      zhasnuto();
      
  }
}

void zhasnuto(){
  digitalWrite(kostka[1], 0);
    digitalWrite(kostka[3], 0);
      digitalWrite(kostka[6], 0);
        digitalWrite(kostka[8], 0);
}

void displayNumber(byte number){

  if(number<1 && number>6) return;

  for(byte i=0; i<10; i++){ //pro 0. až 6. diodu

    digitalWrite(kostka[i],dots[number][i]);

  }

}
void animace(byte jaka) {
  displayNumber(0);
  delay(50);
  switch (jaka) {
    case 1:
      zhasnuto();
      animace1();
      break;
    case 2:
      zhasnuto();
      animace2();
      break;
    case 3:
      zhasnuto();
      animace3();
      break;
          
  }
}

void setup() {
     pinMode(POT, INPUT);
     pinMode(HOD, INPUT_PULLUP);
     Serial.begin(9600);
     pinMode(ZMENA, INPUT_PULLUP);
  }


void loop() {
  if (digitalRead(ZMENA) == 0) {
    if (typAnime < 1) {
      typAnime = 0;
    }
    typAnime++;
    if (typAnime >3) { typAnime = 0; }
    displayNumber(typAnime-1);
    delay(300);
  }

 
  rychlostAnimace = map(analogRead(POT), 0, 1023, 30, 200);
  if (digitalRead(HOD) == 0) {
    byte hozenaHodnota = rand() % 6 + 1;
    animace(typAnime);
    displayNumber(hozenaHodnota);
  }
}