Ejcees對象化

前段時間,我製作了中國象棋打譜程式ejcees,它是個單頁面,html+css+js全部寫在一個文件裡。

一開始我確實想要把它對象化,但是因為過於複雜,難度很大,我不是很有把握。看著已經做好的單頁面,我可能考慮就做到這裡了。

後來在瀏覽了一些象棋網站之後(他們的網頁版程式都挺爛),我還是決定要把ejcees對象化,這樣就可以把它實例化並嵌入網頁中,同一頁面可加入多個實例。。

過程雖然有點複雜,好在gemini給出了具體的工作流程,加上我的充分思考以及測試排錯,經過幾日奮戰,終於實現ejcees的對象化。

下載地址

ejcees-obj

使用說明

ejcees-obj分成三種模式:main,single,mini。

single單個插入模式

當你只想講解和分析一盤棋局時,可以使用single模式。調用方法為:

    <div style="width: 840px;" class="ejcees" mode="single"></div>
    <script src="ejceesobj.js"></script>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const containers = document.querySelectorAll('.ejcees');
        containers.forEach(container => {
          const mode = container.getAttribute('mode');
          new Ejcees(container, mode);
        });
      });
    </script>

其中,div.ejcees的寬度可任意改變,其內容可以是各種格式的棋譜,如<div class="ejcees" mode="single">炮二平五 馬8進7</div>。當div.ejcees的內容為空時,它將用localStorage記錄上一次關掉頁面時的數據。

mini多窗口模式

一個頁面上可以存在多個mini模式,其調用方法是把上方代碼中的mode值改成"mini"。div.ejcees的寬度宜調成480px至640px。

使用mini模式進行實例化時,div.ejcees內應有棋譜內容,因為它的棋子不能點擊,無法在頁面上增加數據。

寡人對戰網友 1. 炮二平五 馬8進7 2. 馬二進三 卒7進1 3. 車一進一 馬2進1 ① 邊馬會使中路薄弱 4. 車一平六 開局横車略虧 4. ………… 士6進5 ② 5. 馬八進七 砲2平4 6. 車九平八 車1平2 7. 炮八進四 ③ 象7進5 8. 兵七進一 車9平6 9. 兵五進一 ④ 馬7進6 ⑤ 10. 車六進二 ⑥ 砲8平7 ⑦ 11. 炮五進四 馬6進7 12. 兵五進一 車6進7 13. 馬七進五 卒1進1 ⑧ 14. 仕四進五 ⑨ 車6退1 15. 車六進一 車2進2 16. 車八進二 卒9進1 17. 車六平二 將5平6 ⑩ 18. 車二進五 砲7退2 19. 炮五平一 將6平5 20. 兵七進一 砲4進1 ⑪ 21. 兵七進一 砲4平2 22. 兵七平八 車2平3 23. 兵八進一 車3進7 24. 兵八平九 象3進1 25. 炮一進三 士5退6 26. 炮一平三 象5退7 27. 車二平三 車3退7 28. 車三退四 卒9進1 29. 馬五進六 車3平6 30. 車八進二 卒9進1 31. 馬三進一 馬7進9 32. 馬一進二 前車平8 33. 相三進一 黑方認負 ① 3. ………… 馬2進3 4. 兵七進一 象3進5 5. 馬八進七 馬7進8 ⑫ 6. 馬七進六 車9進1 7. 馬六進五 馬3進5 8. 炮五進四 士4進5 9. 炮八平九 車9平7 10. 相三進五 馬8進7 11. 炮五平九 車1平4 12. 車九平八 卒7進1 13. 前炮進三 車4進6 14. 兵九進一 ② 4. ………… 象7進5 34層23分 5. 馬八進七 士6進5 6. 兵七進一 砲2平3 7. 馬七進八 車9平6 8. 車六進三 馬7進6 9. 車六進一 馬1退3 10. 車九進一 砲3平4 11. 車九平四 砲8進2 12. 車六退四 馬3進4 13. 車六平七 砲4平3 14. 兵七進一 卒3進1 15. 車七進四 砲3平2 16. 炮八進五 馬4退2 17. 車七退一 馬2進3 18. 仕六進五 馬6進7 19. 車四進八 士5退6 ③ 7. 炮八進五 18層-24 7. ………… 象7進5 8. 車六平二 馬7進6 9. 兵七進一 車9平7 10. 車二進三 馬6進7 11. 炮五進四 車7進3 12. 馬七進六 卒7進1 13. 車二進一 卒7平6 14. 車二退二 卒1進1 ④ 9. 車六平二 20層-24 9. ………… 砲8進2 10. 馬七進六 車6進7 11. 馬六進五 馬7進5 12. 炮五進四 砲8退2 13. 馬三退一 車6退4 14. 車八進一 馬1退3 15. 相三進五 砲8平6 16. 仕四進五 砲6退2 17. 兵五進一 馬3進2 18. 車八進五 車2進3 19. 炮五平八 卒3進1 ⑤ 9. ………… 車6進7 19層52 10. 車六平二 砲8進2 11. 馬七進五 車2進2 12. 仕四進五 車6退1 13. 車二進三 卒1進1 14. 車八進二 車6平7 15. 兵一進一 砲4進1 16. 炮八退三 砲4進3 17. 炮八進三 車7平6 18. 相七進九 砲4退3 19. 炮八退三 車6退6 20. 炮五平四 砲4進2 ⑥ 10. 炮五進四 75 10. ………… 馬6退7 11. 兵五進一 車6進7 12. 馬七進五 馬7進5 13. 兵五進一 砲8進4 14. 仕四進五 車6退1 15. 相三進五 卒7進1 16. 兵三進一 砲8平5 17. 車六進二 車6進1 18. 車六平五 車6平7 19. 兵五平六 馬1退3 20. 炮八進一 砲4進7 21. 仕五退六 馬3進4 22. 車五進三 馬4進3 23. 相五進七 車7進2 24. 帥五進一 ⑦ 10. ………… 馬1退3 107分。妙著,下一步連環馬炮打車 11. 炮八進一 馬3進4 12. 車六平四 砲4進7 13. 車八進五 車2進2 14. 車八平四 車6進4 15. 車四進二 卒5進1 16. 車四退四 卒5進1 17. 馬七退六 車2進4 18. 車四平二 砲8平7 19. 炮五平七 馬4進3 20. 仕四進五 馬3進2 21. 車二進八 士5退6 22. 車二退五 車2平7 ⑧ 13. ………… 馬1退3 紅175 14. 仕四進五 車6退1 15. 炮八進一 將5平6 16. 車六進一 砲4進7 17. 車六退四 車2進2 18. 車八進七 砲7平2 19. 車六進八 馬3進1 20. 炮五平六 砲2平4 21. 炮六退三 車6退1 22. 兵五進一 車6平5 23. 兵五進一 馬7退6 24. 兵五平六 馬6進5 25. 馬三進五 車5進1 26. 兵六平七 車5退4 27. 車六退三 車5平3 28. 車六平三 車3平4 29. 車三進四 將6進1 ⑨ 14. 車六進一 262 14. ………… 車2進2 15. 仕四進五 車6退5 16. 車六平二 砲7退2 17. 車二進五 砲7平6 18. 車八進三 車6平8 19. 車二平一 砲4進1 20. 炮八退二 車2進2 21. 馬五進六 馬7退8 ⑩ 17. ………… 砲7退2 18. 馬五進六 砲4退1 19. 車二進五 砲7平6 20. 車八進二 車2平4 21. 馬三進五 砲4平2 22. 炮八平九 砲2平3 23. 炮五平一 車6退4 24. 炮一進三 馬7退5 25. 車八退一 車6平7 26. 車二退五 車7退2 ⑪ 20. ………… 砲4平3 -389分 21. 馬五進六 砲3退1 22. 相七進五 砲3進3 23. 兵五進一 車6進2 24. 相五退七 砲7平6 25. 馬三進五 車6退6 26. 炮一進三 馬7退5 27. 車八進二 馬5進3 28. 相三進五 馬3退4 29. 馬五進六 車6平7 30. 馬六進四 砲3平2 31. 兵五進一 象3進5 32. 車二退一 象5退7 33. 馬四進三 車7退1 34. 車二平三 砲6平9 35. 車三進一 士5退6 ⑫ 5. ………… 車9進1 6. 車一平二 砲8進2 7. 車二進三 砲2退1 8. 炮五平六 砲2平8 9. 車二平四 車1平2 10. 車九平八 卒3進1 11. 兵七進一 前砲平3 12. 馬七進八 砲3平2 13. 炮八進三 車2進4 14. 車四平七 馬3進4 15. 車七平六 馬4進2 16. 車八進四

main單頁面模式

如果整個HTML頁面只包含本程式,則可使用main模式。使用方法為:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Ejcees Object</title>
  </head>
  <body>
    <div class="ejcees" mode="main"></div>
    <script src="ejceesobj.js"></script>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const containers = document.querySelectorAll('.ejcees');
        containers.forEach(container => {
          const mode = container.getAttribute('mode');
          new Ejcees(container, mode);
        });
      });
    </script>
  </body>
</html>

下面是我的實作筆記,有興趣可翻至第二頁。

歡迎下載

文檔名
大小

Leave a Comment