將製作ejcees(中國象棋打譜程式)

分享和讨论Javascript相关的话题
回复
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

這段代碼是否需要修改?尤其是getMoveNotation已經不存在了。

代码: 全选

            if (moveStr.length >= 4) {
              let dc = null;
              let moveEn = '';
              let isRed = currentFen.includes(' w');

              if (/^[a-i][0-9][a-i][0-9]$/.test(moveStr)) {
                let startX = moveStr.charCodeAt(0) - 97;
                let startY = 9 - parseInt(moveStr.charAt(1), 10);
                let endX = moveStr.charCodeAt(2) - 97;
                let endY = 9 - parseInt(moveStr.charAt(3), 10);
                dc = {
                  startX,
                  startY,
                  endX,
                  endY
                };

                let pId = vMap.get(`${startX},${startY}`);
                if (!pId) {
                  hasError = true;
                  continue;
                }
                moveEn = this.getMoveNotation(pId, startX, startY, endX, endY, null, vMap);
              } else {
                let isEnglish = /^[a-zA-Z]/.test(moveStr) || /^[+\-=1-9][a-zA-Z0-9]/.test(moveStr);
                moveEn = isEnglish ? moveStr : this.NotationConverter.toEnglish(moveStr, isRed);
                console.log('moveEn', moveEn);
                if (/^[RNBAKCPrnbakcp+\-=1-9]{2}[+\-=][1-9]/.test(moveEn)) {
                  dc = this.deriveCoordsFromPgnMove(currentFen, moveEn, isRed);
                } else {
                  dc = moveEn;
                }
              }

              if (moveEn === dc) {
                if (!currentCommentNode.c) {
                  currentCommentNode.c = '';
                }
                // Append the token, separating with a space if a comment already exists
                currentCommentNode.c += (currentCommentNode.c ? ' ' : '') + token;
                continue; // Skip node creation and continue parsing
              }

              if (!dc) {
                const cleanInitial = this.INITIAL_FEN.replace(/ - - 0 1$/, '');
                if (importedFen !== cleanInitial && importedFen !== this.INITIAL_FEN) {
                  this.importExportedText(text, this.INITIAL_FEN);
                  return;
                } else {
                  alert('Parsed partially due to an invalid move notation.');
                  this.renderRecordUI();
                  this.renderNoteUI();
                  this.updateToolHighlights();
                  return;
                }
              }

              // Rule 4: The variation is attached to the parent of the move
              lastMoveParent = currNode;
              lastMoveParentFen = currentFen;

              let nextFen = this.simulateMove(currentFen, dc);
              let childIdx = currNode.v.findIndex(c => c.move === moveEn && c.fen === nextFen);

              if (childIdx === -1) {
                let newNode = {
                  fen: nextFen,
                  move: this.coordsToEngine(dc.startX, dc.startY, dc.endX, dc.endY),
                  c: '',
                  v: []
                };
                currNode.v.push(newNode);
                childIdx = currNode.v.length - 1;
              }

              // If this.this creates a fork on the main path, update this.currentBranch
              if (currNode.v.length > 1 && currNode === attachNode) {
                this.currentBranch[forkCount] = childIdx;
                forkCount++;
                attachNode = currNode.v[childIdx]; // Follow the first parsed line as the main path
              }

              currNode = currNode.v[childIdx];
              currentFen = nextFen;
              currentCommentNode = currNode;

              let pId = vMap.get(`${dc.startX},${dc.startY}`);
              vMap.delete(`${dc.startX},${dc.startY}`);
              if (pId) vMap.set(`${dc.endX},${dc.endY}`, pId);
            }

這段代碼是否需要修改?尤其是getMoveNotation已經不存在了。

找到所有getMoveNotation,並替換成正確的代碼。

只需給出所要修改的地方,所有的代碼和注釋都要使用英文。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

gemini pro夠強:

代码: 全选

Yes, the code needs to be modified. Since `getMoveNotation` no longer exists, and the `move` property expects the engine format (e.g., `"h2e2"`), you should replace all instances of `this.getMoveNotation(...)` with `this.coordsToEngine(startX, startY, endX, endY)`.

Here are all the places in the code that need to be updated, with all comments in English:

### 1. In `parseUrlHash` method
**Modify this part:**
```javascript
      let pId = vMap.get(`${startX},${startY}`);
      if (!pId) return null;

      // Replace getMoveNotation with coordsToEngine
      let moveNotation = this.coordsToEngine(startX, startY, endX, endY);

      return {
        fen: nextFen,
        move: moveNotation,
        lastMove: dc,
        c: '',
        v: []
      };
```

### 2. In `importExportedText` method (PGN Format Parsing)
**Modify this part:**
```javascript
          if (/^[a-i][0-9][a-i][0-9]$/i.test(word) || /^[A-I][0-9][A-I][0-9]$/i.test(word)) {
            word = word.toLowerCase();
            let startX = word.charCodeAt(0) - 97;
            let startY = 9 - parseInt(word.charAt(1), 10);
            let endX = word.charCodeAt(2) - 97;
            let endY = 9 - parseInt(word.charAt(3), 10);
            dc = { startX, startY, endX, endY };
            let vMap = this.buildVirtualMap(currentNode.fen);
            let pId = vMap.get(`${startX},${startY}`);
            if (pId) {
              // Replace getMoveNotation with coordsToEngine
              moveEn = this.coordsToEngine(startX, startY, endX, endY);
            } else {
              moveEn = word;
            }
          } else {
```

### 3. In `importExportedText` method (Complex Format Parsing - The snippet you provided)
**Modify this part:**
```javascript
              if (/^[a-i][0-9][a-i][0-9]$/.test(moveStr)) {
                let startX = moveStr.charCodeAt(0) - 97;
                let startY = 9 - parseInt(moveStr.charAt(1), 10);
                let endX = moveStr.charCodeAt(2) - 97;
                let endY = 9 - parseInt(moveStr.charAt(3), 10);
                dc = {
                  startX,
                  startY,
                  endX,
                  endY
                };

                let pId = vMap.get(`${startX},${startY}`);
                if (!pId) {
                  hasError = true;
                  continue;
                }
                // Replace getMoveNotation with coordsToEngine
                moveEn = this.coordsToEngine(startX, startY, endX, endY);
              } else {
```

### 4. In `importExportedSVG` method
**Modify this part:**
```javascript
      const startX = startPt.x;
      const startY = startPt.y;
      const endX = endPt.x;
      const endY = endPt.y;

      const capturedId = this.tileMap.get(`${endX},${endY}`) || null;
      
      // Replace getMoveNotation with coordsToEngine
      const moveNotation = this.coordsToEngine(startX, startY, endX, endY);
      
      const dc = {
        startX,
        startY,
        endX,
        endY
      };
```
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

問題:當導入PGN時,中文又轉換失敗,且rotate=true沒有生效。

代码: 全选

[Game "Chinese Chess"]
[Rotate "true"]
[Format "Chinese"]

{吳可欣贏網友一盤棋}
1. 炮八平五 馬2進3
2. 兵七進一 車1平2
3. 馬八進七 卒7進1
4. 車九平八 馬8進7
5. 馬二進一 車9進1
6. 炮二平四{估計是這步棋使局勢急轉直下,因為它導致紅方右車完全出不來}
馬7進8
7. 炮四進三 卒7進1
8. 兵三進一 馬8進6
9. 馬七進六 車9平4
{吳姐說希望他踩中兵}
10. 馬六進五 馬3進5
11. 炮五進四 車4進3
12. 兵三進一 車4平5
{吳姐說差點走馬6進8}
13. 車一平二 砲8進4
14. 炮五平四 車5進2
15. 仕四進五 馬6進4
16. 車八進六 馬4進3
17. 帥五平四 砲8平6
18. 前炮平六 砲6退1
19. 炮六退五 車5平6
20. 帥四平五 車6平4
21. 帥五平四 車4進2
22. 車二進四 車4退2
23. 車二平四 砲2平6
24. 車八進三 砲6進3
{紅方認負}
*
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

上面問題已解決,現在的小問題是,PGN導出會產生兩個[Rotate "true"]。

TODO:URI導出如何放進rotate。

還有mini的剛走完的棋子的綠邊和白點又沒有了…
附件
ejceesobj202604302037.js
(299.29 KiB) 已下载 3 次
上次由 ejsoon 在 2026年 4月 30日 22:15,总共编辑 1 次。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

解決綠邊和白點小問題
engineToCoords(engineMove) {
coordsToEngine(startX, startY, endX, endY) {
機器碼和坐標相互轉。
附件
ejceesobj202604302047.js
(299.33 KiB) 已下载 2 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5399
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 176 次
被圈友点赞: 204 次
联系:

Re: 將製作ejcees(中國象棋打譜程式)

帖子 ejsoon »

東萍導入分支時仍然存在問題:

代码: 全选

寡人對戰網友
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. 車八進四
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 5 访客