const gDebugging = true;  // デバッグが終わったらfalseに
// const gDebugging = false;  // デバッグが終わったらfalseに

let 問題情報 = {
  問題数: 10*2,
  答えの最大値: 19, // 20未満の数の計算をする
  これまでに作った問題: [],
  問題カウンタ: 0
  };

計算練習を表示();
document.keisanMondai.elements[0].focus(); // 最初の問題に移動

//計算練習のページを表示
function 計算練習を表示() {
  for (let i=0; i<問題情報.問題数; i++) {    // 問題の生成
    問題情報.これまでに作った問題[i] = 問題をひとつ生成(問題情報.答えの最大値);
  }

  // HTMLコードの生成
  let code =  // タイトル部分のコード
      '<h2 align="center">けいさんれんしゅう</h2>\n';
  code +=  // 問題部分のコード
  `<form name="keisanMondai" action="">
    <table style="width: 600px;" align="center">
      <tr>
        <td>
          <table width="100%">
    `;
  
  for (let i=0; i<問題情報.問題数; i++) { // 問題ごとのループ
    code += `
      <tr>
        <td align="right"> ${問題情報.これまでに作った問題[i]} </td>
        <td>＝ <input type="text" size="8"></td>
      </tr>
    `;
    if (i==問題情報.問題数/2-1) { //半分終わったら右の表に移るコードを追加
      code += '  </table>\n';  // 左の列の表の終わり
      code += '</td>\n';  // 外側の表の１つ目の要素の終わり
      code += '<td>\n';   // 外側の表の２つ目の要素の始まり
      code += '  <table width="100%">\n';
    }
  }
  code += '  </table>\n</td>\n</tr>\n</table>\n';
  //区切り線
  code += '<hr width="600" align="center">\n';
  // 採点部分
  code += '<table align="center" width="600">\n' +
    '<tr><td>' + 
    '<input type="button" name="saiten" value="さいてん" onclick="採点する()">' +
    '</td>\n' +
    '    <td>せいかい' +
    '<input type="text" name="seikai" size="3" readonly="true">' +
    '</td>\n' +
    '    <td>まちがい' +
    '<input type="text" name="machigai" size="3" readonly="true">' +
    '</td>\n' +
    '    <td align="right">' +
    '<input type="button" name="again" value="つぎへ"' +
    ' onclick="location.reload();">\n' +
    '</td></tr>\n' +
    '</form>\n</table>\n';
  document.getElementById("problems").innerHTML = code; // コードを出力
  
  if (gDebugging) { // デバッグ用
    let debugMojiretsu = "<form>" + 
          "<textarea name='debug' rows='20' cols='80'>" + code +
          "</textarea>\n</form>";
    document.getElementById("debugArea").innerHTML = debugMojiretsu;
  }
  
  // 解答などをクリア
  for (let i=0; i<問題情報.問題数; i++) { 
    document.keisanMondai.elements[i].value = "";
  }
    document.keisanMondai.seikai.value = "";
    document.keisanMondai.machigai.value = "";
}

//採点をする
function 採点する() {
  let seikai = 0;
  let machigai = 0;
  let f = document.keisanMondai; // form
  for (let i=0; i<問題情報.問題数; i++) {
    if (f.elements[i].value != "" && 
        f.elements[i].value == eval(問題情報.これまでに作った問題[i]) ) { // 正しい解
        f.elements[i].value += "　○";
      seikai++;
    }
    else {    // まちがい
      f.elements[i].value += "　×";
      machigai++;
    }
  }
  f.seikai.value = seikai;
  f.machigai.value = machigai;
  f.again.focus();
}

// 足し算か引き算をひとつ生成
// 引数  -- 問題情報.答えの最大値 （正数）
// 戻り値　-- 生成した問題。例 "1+1"
function 問題をひとつ生成(答えの最大値) {
    let no1;
    let no2;
    let mondai;
    let seikai; 
    let kotae;
    let enzan;  // "+" か "-" 

    do {
        no1 = randomInt(答えの最大値-1);
        if (randomInt(2) == 1) { //足し算の場合
            enzan = " + ";
            no2 = randomInt(答えの最大値-no1);
            seikai = no1 + no2;
        }
        else {  // 引き算の場合
            enzan = " - ";
            if (no1 > 10) {
                no2 = randomInt(no1-10);
            }
            else {
                no2 = randomInt(no1);
            }
            seikai = no1 - no2;
        }
        mondai = no1 + enzan + no2;
    }
    while (問題重複チェック(mondai));
    return(mondai);
}


//これまでに生成した問題と重複があるかをチェックする
//引数   mondai -- チェック対象の問題。たとえば"1+1="
//戻り値 true  -- すでに生成した問題と重複していた
//       false -- 重複はなかった
function 問題重複チェック(問題) {
  for (let i=0; i<問題情報.問題カウンタ; i++) {
    if (問題情報.これまでに作った問題[i] == 問題) {
      return(true);
    }
  }
  問題情報.これまでに作った問題[問題情報.問題カウンタ] = 問題;
  問題情報.問題カウンタ++;
  return(false);
}

// 1以上i以下の整数を返す
function randomInt(i) {
    return( Math.floor(Math.random()*i) + 1 );
 }
