【JavaScript】来場所の番付予想のため、勝ちから負け、休場を引くプログラムを作りました

勝ちから負け、休場を引くプログラム

2023年の三月場所は最高に面白かったですね!幕内最小兵の翠富士の10連勝で

芋の里

まさかの最軽量優勝か!?
とワクワクしましたが、さすがに疲れたのか5連敗。

そしてなんと7日目ですでに3敗し、さすがに優勝はないかと思っていた霧馬山が千秋楽に大栄翔に2連勝して優勝!
霧馬山 – 大栄翔(春場所千秋楽 優勝決定戦)

芋の里

物言いでスロー再生した時に霧馬山の足が大栄翔の手を踏んでいるのを見た時は、興奮しましたよ!

来場所は照ノ富士も戻ってくるようだし、更に土俵がにぎやかになりそうです。

来場所の番付を予想するのも相撲ファンの楽しみですが、

芋の里

勝敗を数値化すれば、ある程度の番付が予想できるのでは!?
と考えました。

そんなことをダラダラ考えていたら、早速2023年5月1日に番付が発表されてしまいましたが、基本、2週間前に番付が発表という事を今回知ることが出来たということで、番付予想は来場所以降の楽しみとしたいと思います。

今回のプログラムはHTML,CSS,JavaScriptで書いています。

  • 勝敗を数値化するために、JavaScriptでtdタグを追加
  • 追加したtdタグに勝-敗-休の結果を表示
  • -がついた場合、赤い背景と赤い文字に変更

という形です。

勝敗表から勝-敗-休のtdを自動生成したプログラム

番付 西
照ノ富士 0勝0敗15休 横綱
大関 貴景勝 3勝4敗8休
若隆景 7勝7敗1休 関脇 豊昇龍 10勝5敗
霧馬山 12勝3敗 関脇
若元春 11勝4敗 小結 琴ノ若 9勝6敗
大栄翔 12勝3敗 小結 翔猿 6勝9敗
玉鷲 3勝12敗 前頭筆頭 正代 10勝5敗
阿炎 9勝6敗 前頭2枚目 竜電 2勝13敗
御嶽海 4勝11敗 前頭3枚目 錦木 6勝9敗
阿武咲 4勝5敗6休 前頭4枚目 明生 5勝10敗
琴勝峰 6勝9敗 前頭5枚目 翠富士 10勝5敗
遠藤 9勝6敗 前頭6枚目 佐田の海 6勝9敗
北勝富士 7勝8敗 前頭7枚目 高安 10勝5敗
一山本 4勝11敗 前頭8枚目 宇良 9勝6敗
碧山 6勝9敗 前頭9枚目 平戸海 7勝8敗
妙義龍 5勝10敗 前頭10枚目 錦富士 10勝5敗
東龍 4勝11敗 前頭11枚目 隆の勝 8勝7敗
5勝10敗 前頭12枚目 宝富士 8勝7敗
大翔鵬 8勝7敗 前頭13枚目 琴恵光 8勝7敗
金峰山 11勝4敗 前頭14枚目 武将山 5勝10敗
北青鵬 9勝6敗 前頭15枚目 王鵬 7勝8敗
千代翔馬 9勝6敗 前頭16枚目 剣翔 8勝7敗
水戸龍 8勝7敗 前頭17枚目

プログラムの簡単な解説

HTML(必要箇所のみ抜粋)

<table id="sumo">
  <thead>
    <tr>
      <th colspan="3"> 東 </th>
      <th> 番付 </th>
      <th colspan="3"> 西 </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td> 照ノ富士</td><td class="result"> 0勝0敗15休 </td>
      <th> 横綱 </th>
      <td> - </td><td class="result"> </td>
    </tr>
  </tbody>
</table>
番付 西
照ノ富士 0勝0敗15休 横綱

JSを使用しない場合、上記のようにthがずれます。

JSでtdを2つ追加し、thがずれないようにします。

上のプログラムで横綱の東西は出来ているので、後は大関、関脇などと
tr部分からコピペして増やしていく形です。

CSS

.makekoshi{
 color:red;
 background:#f7e1e1;
}
table{
text-align:center;
}

makekoshiというクラスがついたものは文字色を赤にし、背景を薄い赤になるようにしました。
文字を左右中央にしています。

JavaScript

// tbody内の各行についてループ処理
const rows = document.querySelectorAll('#sumo tbody tr');
rows.forEach(row => {
  // 勝敗のtd要素を取得
  const resultTds = row.querySelectorAll('td.result');
  resultTds.forEach(resultTd => {
    const resultText = resultTd.textContent;
    // 勝敗がない場合
    if (resultText === '' || resultText === ' ') {
      resultTd.insertAdjacentHTML('afterend', '<td></td>');
    } else {
      // 勝敗がある場合の処理
      const win = Number(resultText.match(/\d+勝/)[0].replace('勝', ''));
      const lose = Number(resultText.match(/\d+敗/)[0].replace('敗', ''));
      const absentMatch = resultText.match(/\d+休/);
      const absent = absentMatch ? Number(absentMatch[0].replace('休', '')) : 0;
      const diff = win - lose - absent;
      const diffTd = document.createElement('td');
      diffTd.textContent = diff;
      if (diff < 0) {  // 差分が負の場合、makekoshiというclassを追加
        diffTd.classList.add('makekoshi');
      }
      resultTd.after(diffTd);
    }
  });  
});

sumoというIDを持つテーブルのtrを探し、その中のresultクラスを持つtdにfor文で勝数から敗休数の引き算をしています。

勝敗がないものは、空のtdのみ作成するという形にしています。

数字が0より小さくなったtdに関して、makekoshiというクラスがつくようにしています。

勝敗のみであればもっと短く書けますが、休や空欄などがある分コードが長くなりました。

ただ、この通りに今後番付表が出来れば、毎回同じプログラムで対応できるので、非常に楽です。

これから

芋の里

今までの番付変遷を調べ、番付予想も自動でできるようにしてみたい

ただ、全くやる予定はたっていません・・・。