// 使用する端子(PD○○)の情報を記述(変数を定数として宣言).
const int LED_A = 2;
const int LED_B = 3;
const int LED_C = 4;
const int LED_D = 5;
const int LED_E = 6;
const int LED_F = 7;
const int LED_G = 8;
const int LED_DP = 9;

// ダイナミック点灯のプログラムで必要になる変数を宣言.
const int DIG4 = 13;  // 7セグメントLEDのピン配置は6
const int DIG3 = 12;  // 7セグメントLEDのピン配置は8

// LED設定
const int LED_RED = 10;
const int LED_YELLOW = 11;

void setup() {
  // 使用する端子(PD○○)の入出力の設定を記述.
  pinMode(DIG4, OUTPUT);
  pinMode(DIG3, OUTPUT);
  pinMode(LED_A, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(LED_C, OUTPUT);
  pinMode(LED_D, OUTPUT);
  pinMode(LED_E, OUTPUT);
  pinMode(LED_F, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_DP, OUTPUT);

  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);

  randomSeed(analogRead(0));  // アナログピンの値をシードに設定
  Serial.begin(9600); // シリアル通信開始(確認用)
}


void loop() {
  int sum;
  int answer;
  int randomNumber;

  randomNumber = random(2);  // 0 or 1の乱数を生成
  digitalWrite(DIG3, HIGH);

  if(randomNumber == 0){  // 乱数が0なら赤のLEDを点滅, 足し算を行う
    sum = 0;
    for(int i=0; i<3; i++){
      analogWrite(LED_RED, 255);
      delay(200);
      analogWrite(LED_RED, 0);
      delay(200);
    }

    // 7セグメントLEDでランダムに数字を表示させる(1s)
    for (int i=0; i<3; i++) {
      randomNumber = random(10);  // 0から9までの乱数を生成
      number(randomNumber);  // 7セグメントLEDで表示させるために関数呼び出し
      // 7セグメントLEDで表示(500ms)
      digitalWrite(DIG4, LOW);  // LOWで点灯
      delay(500);
      digitalWrite(DIG4, HIGH);
      delay(500);

      sum += randomNumber;
    }
  }

  
  else if(randomNumber == 1){// 乱数が1なら黄のLEDを点滅, 掛け算を行う
    sum = 1;
    for(int i=0; i<5; i++){
      analogWrite(LED_YELLOW, 255);
      delay(200);
      analogWrite(LED_YELLOW, 0);
      delay(200);
    }

    // 7セグメントLEDでランダムに数字を表示させる(1s)
    for (int i=0; i<3; i++) {
      randomNumber = random(10);  // 0から9までの乱数を生成
      number(randomNumber);  // 7セグメントLEDで表示させるために関数呼び出し
      // 7セグメントLEDで表示(500ms)
      digitalWrite(DIG4, LOW);
      delay(500);
      digitalWrite(DIG4, HIGH);
      delay(500);

      sum = sum * randomNumber;
    }
    digitalWrite(DIG4, HIGH);  // 消灯
  }


  // 一定時間ユーザーに入力を待つ
  unsigned long startTime = millis();
  while (millis() - startTime < 10000) { // 10000ミリ秒(10秒)入力を待つ
    if (Serial.available() > 0) {
      answer = Serial.parseInt(); // シリアルポートから数値を読み取る
      // 入力後, シリアルポートのバッファをクリアする
      while (Serial.available() > 0) {
        Serial.read();
      }

      if (answer == sum) {
        Serial.print("正解!答えは");
        Serial.println(sum);
        delay(3000);
      } else {
        Serial.print("残念!答えは");
        Serial.println(sum);
        delay(3000);
      }
      
      for(int i=0; i<100; i++){
        number(sum / 10);
        digitalWrite(DIG4, HIGH);
        digitalWrite(DIG3, LOW);
        delay(5);
        number(sum % 10);  // 一の位
        digitalWrite(DIG3, HIGH);
        digitalWrite(DIG4, LOW);
        delay(5);
      }
      break;
    }
  }

}

// void loop()の中に書くとややこしいので、関数として
void number(int num){
  switch (num) {
    case 0:
      num0();
      break;
    case 1:
      num1();
      break;
    case 2:
      num2();
      break;
    case 3:
      num3();
      break;
    case 4:
      num4();
      break;
    case 5:
      num5();
      break;
    case 6:
      num6();
      break;
    case 7:
      num7();
      break;
    case 8:
      num8();
      break;
    case 9:
      num9();
      break;
    default:
      break;
  }
}

void num0(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, LOW);
}

void num1(){
  digitalWrite(LED_A, LOW);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, LOW);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, LOW);
  digitalWrite(LED_G, LOW);
}

void num2(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, LOW);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, HIGH);
  digitalWrite(LED_F, LOW);
  digitalWrite(LED_G, HIGH);
}

void num3(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, LOW);
  digitalWrite(LED_G, HIGH);
}

void num4(){
  digitalWrite(LED_A, LOW);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, LOW);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void num5(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, LOW);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void num6(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, LOW);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void num7(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, LOW);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, LOW);
  digitalWrite(LED_G, LOW);
}

void num8(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}

void num9(){
  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, LOW);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
}
$abcdeabcde151015202530354045505560fghijfghij