「益智遊戲」和「抽象弈棋」
回复
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

改進與修復

以下是本程式「是否有在用增量運算」的分析結果:

沒有使用的關鍵增量運算

對於使用者所說的「只對本回合新增兩顆棋子做局部更新」,在最耗時的部分,程式沒有完成這種增量化。

1. 每個搜尋節點重新生成所有單子

每次 generateLegalTurns(state) 都重新呼叫:

generateLegalSinglePlacements(state, state.mover)

而它會:

掃過盤上所有對方棋子;
掃過尚可用的棋種;
正反面各一次;
目標邊 4 種;
自己貼合邊 4 種;
對每個候選呼叫 validatePlacementGeometry();
再用 isValidGhost() 對整個盤面逐一做幾何衝突檢查。

沒有「父節點候選集 + 新增兩子影響範圍」的更新機制,也沒有按照盤面狀態保存生成結果的 transposition cache。

2. 兩子組合是重新兩兩枚舉

generateLegalTurns() 對所有單子做:
js

for (let i = 0; i < singles.length; i++) {
for (let j = i + 1; j < singles.length; j++) {

這是平方級配對。每一對還可能進行:

twoGhostsCompatible(first, second);
formsTriGolden(first, second);
validateTurnOnState(state, move);
adjudicateSearchTurn(state, move)。

這不是局部增量。

3. 計分是全盤重新掃描

adjudicateSearchTurn(state, placedPieces) 裡有:
const allPieces = state.boardPieces.concat(placedPieces);

for (const dinger of allPieces) {
for (const victim of allPieces) {

即使本回合只新增一或兩顆棋,它仍對所有棋子對做接觸、頂點、邊與樹距離判斷,而不是只檢查「新棋與舊棋」及「新棋彼此」。

此外,每個可能的頂鑫關係還會呼叫:

getTreeDistance(dinger, victim, allPieces, idMap)

這也不是沿父狀態保存的可增量圖/距離結果。

死活/共活判斷同樣重算

hasArbitrationDefence(state) 會直接:

return generateArbitrationDefenceTurns(state).length > 0;

而 generateArbitrationDefenceTurns() 不是「找到第一組共活便停止」,而是收集全部共活回合後才回傳陣列。對 MCTS 而言,實際只需要知道是否存在至少一組,卻仍付出了生成所有組合、去重、完整驗證的成本。

結論

目前的情況是:

有 SAT 快取;
沒有候選走法的真正增量更新;
沒有計分/連接圖/樹距離的真正增量更新;
沒有局面轉置快取;
沒有把「是否有至少一組共活」做早停。

所以答案是:目前並非使用者設想的那種「只根據新增兩子局部更新活法」的增量運算。

分析結束。

根據以上分析,在MCTS和minimax搜尋中,把所有的「活法、共活、單連、雙接、計分」等都做成增量運算。

其中generateLegalTurns和generateArbitrationDefenceTurns在功能上是重覆的,應新建一個增量運算的函式,仍然通過增量的方式把所有的「共活」算完,不僅用於判定是否存在「共活」,還能把所有的「共活」用於接下來的MCTS或minimax增量運算。

回答要求:

不要使當前正確的遊戲流程發生改變。明確給出所要修改的地方和所要替換的代碼。

代码: 全选

改進與修復

以下是本程式「是否有在用增量運算」的分析結果:

沒有使用的關鍵增量運算

對於使用者所說的「只對本回合新增兩顆棋子做局部更新」,在最耗時的部分,程式沒有完成這種增量化。

1. 每個搜尋節點重新生成所有單子

每次 generateLegalTurns(state) 都重新呼叫:

generateLegalSinglePlacements(state, state.mover)

而它會:

    掃過盤上所有對方棋子;
    掃過尚可用的棋種;
    正反面各一次;
    目標邊 4 種;
    自己貼合邊 4 種;
    對每個候選呼叫 validatePlacementGeometry();
    再用 isValidGhost() 對整個盤面逐一做幾何衝突檢查。

沒有「父節點候選集 + 新增兩子影響範圍」的更新機制,也沒有按照盤面狀態保存生成結果的 transposition cache。

2. 兩子組合是重新兩兩枚舉

generateLegalTurns() 對所有單子做:
js

for (let i = 0; i < singles.length; i++) {
  for (let j = i + 1; j < singles.length; j++) {

這是平方級配對。每一對還可能進行:

    twoGhostsCompatible(first, second);
    formsTriGolden(first, second);
    validateTurnOnState(state, move);
    adjudicateSearchTurn(state, move)。

這不是局部增量。

3. 計分是全盤重新掃描

adjudicateSearchTurn(state, placedPieces) 裡有:
const allPieces = state.boardPieces.concat(placedPieces);

for (const dinger of allPieces) {
  for (const victim of allPieces) {

即使本回合只新增一或兩顆棋,它仍對所有棋子對做接觸、頂點、邊與樹距離判斷,而不是只檢查「新棋與舊棋」及「新棋彼此」。

此外,每個可能的頂鑫關係還會呼叫:

getTreeDistance(dinger, victim, allPieces, idMap)

這也不是沿父狀態保存的可增量圖/距離結果。

死活/共活判斷同樣重算

hasArbitrationDefence(state) 會直接:

return generateArbitrationDefenceTurns(state).length > 0;

而 generateArbitrationDefenceTurns() 不是「找到第一組共活便停止」,而是收集全部共活回合後才回傳陣列。對 MCTS 而言,實際只需要知道是否存在至少一組,卻仍付出了生成所有組合、去重、完整驗證的成本。

結論

目前的情況是:

    有 SAT 快取;
    沒有候選走法的真正增量更新;
    沒有計分/連接圖/樹距離的真正增量更新;
    沒有局面轉置快取;
    沒有把「是否有至少一組共活」做早停。

所以答案是:目前並非使用者設想的那種「只根據新增兩子局部更新活法」的增量運算。

分析結束。

根據以上分析,在MCTS和minimax搜尋中,把所有的「活法、共活、單連、雙接、計分」等都做成增量運算。

其中generateLegalTurns和generateArbitrationDefenceTurns在功能上是重覆的,應新建一個增量運算的函式,仍然通過增量的方式把所有的「共活」算完,不僅用於判定是否存在「共活」,還能把所有的「共活」用於接下來的MCTS或minimax增量運算。

回答要求:

不要使當前正確的遊戲流程發生改變。明確給出所要修改的地方和所要替換的代碼。
trigolden_game263.html

https://gpt.quanquan.space/share/ykjdPU ... yO3dszd6L0
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

修復和改進
當MCTS搜尋時,未能實時顯示時間和搜尋量。

為什麼在改成增量運算之後,運算量反而不如之前?

檢查代碼,看是否存在錯誤以及有哪些可以修復和改進的地方。

回答要求:

不要影響當前正確的流程,明確給出所要修改的地方和所要替換的代碼。

trigolden_game264.html

https://gpt.quanquan.space/share/3KpfXW ... _DUErSvumw
附件
trigolden_game264.html.7z
(47.92 KiB) 已下载 14 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

AI好像重回巔峰。

trigolden_game2641.html
附件
trigolden_game2641.html.7z
(48.76 KiB) 已下载 13 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

目前的程式對規則的支援是錯誤的,某些地方應能下的不給下,如第二張圖所示。第三張圖是以前程式,是對的。

規則上只不允許懸空的端點跟場上已有棋子的端點重合,而現在貼上去的邊的兩個端點都不是懸空的端點,那就是可以跟其它棋子的端點重合的。

查找原因並修復。

代码: 全选

測到bug,本應能放現在不能放了
1274 5411 3213 5121 4222 2242 2343 4174 6471 5191 1392 22103 21104 32133 14134 31141 44144 23162 62163 3434 1431 64211 43213 24231 63232 12172 23173 24264 64261 64281 12283 22222 51221 54321 23202 42352 54351 51251 32373 51301 32302 63403 53292 51431 22432 32442 32443 14471 34474 31491 32492 34394 62393 3454 546 3312 1213 3121 4424 3353 4151 1373 3474 5392 1491 51101 13102 22122 62123 61151 13153 53163 63162 61181 13182 64211 14214 61191 11194 1343 3444 12272 4134
图片

图片

代码: 全选

function ghostConflictsWithPiece(ghost, piece) {
  const collision = checkSATCollision(getSAT(ghost), getSAT(piece));

  if (collision === 'separated') return false;
  if (collision === 'overlap') return true;

  // 禁止任何邊貼合/部分邊重合。
  for (let edgeA = 0; edgeA < 4; edgeA++) {
    for (let edgeB = 0; edgeB < 4; edgeB++) {
      if (
        segmentsOverlapAsEdges(
          ghost.vertices[edgeA],
          ghost.vertices[(edgeA + 1) % 4],
          piece.vertices[edgeB],
          piece.vertices[(edgeB + 1) % 4]
        )
      ) {
        return true;
      }
    }
  }

  /*
   * 規則只禁止「懸空端點」和場上既有棋子的端點重合。
   *
   * ghost.myEdge 是此棋貼合到目標棋子的邊;
   * 該邊的兩端不是懸空端點,故即使與其他既有棋子的端點重合,
   * 也必須保留為合法活法。
   */
  const attachedVertices = new Set([
    ghost.myEdge,
    (ghost.myEdge + 1) % 4
  ]);

  for (let vertexIndex = 0; vertexIndex < 4; vertexIndex++) {
    // 貼合邊的端點不是懸空端點:允許重合。
    if (attachedVertices.has(vertexIndex)) continue;

    for (const pieceVertex of piece.vertices) {
      if (pointsEqual(ghost.vertices[vertexIndex], pieceVertex)) {
        return true;
      }
    }
  }

  return false;
}
附件
trigolden_game2642.html.7z
(48.93 KiB) 已下载 11 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

更新和改進
當AI在思考時,MCTS或minimax搜尋要用完設置中的時間,這個時間不要包含對當前局面的「活法、共活、單連、雙接」等統計。但當MCTS或minimax搜尋完畢後,消息框需要給出所用的全部時間。

回答要求:

不要影響當前正確的流程,明確給出所要修改的地方和所要替換的代碼。

https://gpt.quanquan.space/share/qJL75j ... nyXcY0X46A
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

trigolden_game2643.html

AI已經是戰無不戰了,那麼AI打AI會是什麼結局?

代码: 全选

我3比49輸給AI:
2102 5411 1312 4222 5223 3141 4444 2471 4372 2213 4114 6431 1434 13123 33132 42142 64141 63173 5283 21194 61191 53202 24204 54224 51221 21254 62213 52273 11274 32292 43253 12312 11184 12293 31294 44354 33353 32362 2154 42392 31394 34374 52172 33423 22422 61241 12242 21434 61431 52482 24484 42503 54504 64321

第二局AI專家打AI專家,23比20:
6352 5111 1312 1131 4134 1343 4144 1161 3164 1282 5283 2373 3474 13122 22132 54151 2362 12162 12163 51111 21114 32213 41214 14221 34224 54241 42203 34274 41184 33283 1213 33313 24314 31251 12252 32343 5424 42292 43293 11141 53142 54331 32332 63353 24354 61441 64444 61421 33422 62483 52372 63503 64504 52403
附件
trigolden_game2643.html.7z
(49.22 KiB) 已下载 13 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

整個文件因為含有太多注釋而使體積過大。去掉大部分沒用的注釋,如果有的注釋是必要的,則將其精簡至一兩行。不要影響到當前的實際程式碼,只動到注釋。

claude sonnet 5 (low) + thinking

代码: 全选

Good, syntax is valid. Now let's verify the actual code (non-comment) content is untouched by diffing with comments stripped from both versions.All changed lines are comment-only lines — no actual code was touched. Now let's also check remaining comments to see if there's still more bloat worth trimming, then finalize.File reduced from 6881 → 6429 lines (452 fewer) and 249,458 → 235,822 bytes, with every multi-line comment block condensed to 1–2 lines. I verified with `diff` that only comment lines were touched — no functional code changed — and confirmed the JavaScript still parses correctly with Node.精簡完成,重點如下:

- 檔案從 6881 行、249,458 bytes 縮減到 6429 行、235,822 bytes。
- 所有多行的 `/* ... */` 區塊注釋(約 89 個)與連續多行的 `//` 說明段落(約 48 段)都已濃縮成 1~2 行,保留其中真正必要的邏輯說明(例如仲裁規則、增量索引設計、MCTS/minimax 剪枝邏輯等),去掉了純粹的條列展開與重複敘述。
- 用 `diff` 比對確認:所有變動的行都只包含注釋內容,沒有任何實際程式碼(邏輯、變數、函式)被改動;另外用 Node.js 解析整段 `<script>` 內容,確認語法完全正常,可安全執行。
trigolden_game2644.html

更正一些文字描述
玩家一是控制粉色棋子的一方,玩家二是控制綠色棋子的一方。玩家一在第一局是先手方,在第二局是後手方,玩家二則相反。
當前程式的很多地方對此描述不正確,直接把「玩家一」稱作「先手方」,這是不對的。比如「AI設定窗口」中的「先手方(P1)」應改為「玩家一」。
找到並修改所有不正確的描述。

代码: 全选

Now let's make all the corrections.Now update the JS usage of the renamed keys:Let's double-check there are no remaining incorrect conflations, and validate the JS still parses.The remaining `先手方`/`後手方` occurrences (lines 832–836 rules text, and code comments at 2029/4178/5917/6057) genuinely refer to the turn-order concept itself (whoever moves first each game), not to a specific player number — those are correct as written.已修正以下錯誤描述(把「玩家一/二」誤等同「先手方/後手方」的地方):

- **AI 設定窗口**:「先手方 (P1)」→「玩家一 (P1)」,「後手方 (P2)」→「玩家二 (P2)」(HTML 與 i18n 字典各改一處)。
- **回合資訊訊息**(「現在是第 X 局第 Y 回合,輪到 ___ 行動」):原本用 `currentPlayer===1 ? 先手方 : 後手方`,但 `currentPlayer` 代表的是棋子顏色固定的玩家一/二,跟該局是否為先手無關(第二局先後手互換後這裡就會顯示錯)。已改為 `t('player-one')`/`t('player-two')`,並把對應的 i18n key 從 `player-first`/`player-second` 改名為 `player-one`/`player-two`,文字改成「玩家一」/「玩家二」。
- **第一局結束訊息**:「先手方(粉) {s1} - 後手方(綠) {s2}」→「玩家一(粉) {s1} - 玩家二(綠) {s2}」,與比賽結束訊息(原本就正確寫「玩家一(粉)/玩家二(綠)」)保持一致的描述方式。

保留不動的地方:規則說明文字(832、834、836 行)與幾處程式注釋(2029、4178、5917、6057 行)中的「先手方/後手方」,這些指的就是「本局誰先動」這個輪替概念本身,並非在指稱固定的玩家一/二,所以是正確的,不需修改。

已用 Node.js 重新驗證整段 JavaScript 語法仍然正常。
trigolden_game2645.html

更改窗口的顯示邏輯
在AI設置窗口中,當一方由人類控制時,這一方的「限時」和「搜尋深度」應使之清空且變得不可點擊和編輯,比如改為半透明(或者有更好更美觀的改法)。

當打開「導出與導入」窗口時,應立即將「導入」的輸入框清空。

代码: 全选

Now let's add CSS for disabled state and JS logic to sync the disabled state.Now hook this into the dialog sync, type selection, and dropdown handling:Good — since the AI Settings dialog is hidden by default and gets synced via `syncAIDialogFromConfirmed()` (which now calls `updateAIParamInputsState`) every time it's opened or cancelled, the initial state is correctly handled whenever the user actually opens the dialog. Let's verify `openAISettingsDialog` calls `syncAIDialogFromConfirmed` — confirmed earlier. Good, no extra init call needed.

Now let's handle the export/import dialog clearing the import textarea on open.Now let's verify everything and check for the `io-export-text` id existing (used already), and validate syntax.Both changes work correctly. Let's do a final sanity check by diffing against the previous version to confirm only intended edits were made.Diff confirms only the intended, additive changes were made — nothing else was touched.完成了兩項修改:

**1. AI 設定窗口 — 人類控制方的參數欄禁用**
- 新增 `updateAIParamInputsState(p)`:當該方選擇「人類」時,把「限時」和「搜尋深度」輸入框清空並設為 `disabled`;切回 AI 等級時自動恢復。
- 掛在三個時機:切換下拉選單選項(`handleAITypeSelect`)、開啟/取消對話框時還原成生效設定(`syncAIDialogFromConfirmed`)。
- CSS 加了 `input:disabled` 樣式:透明度降到 0.35、邊框變灰、`cursor: not-allowed`,配合原本 0.2s 過渡動畫,視覺上是半透明且不可互動,符合你要的效果。
- 因為 `updateAIConfig()` 在讀取空值時本來就有 `|| CUSTOM_AI_DEFAULT.time` 的保底,清空輸入框不會導致設定出錯。

**2. 導出/導入窗口 — 開啟時清空導入欄**
- 在 `openIO()` 裡加一行 `document.getElementById('io-import-text').value = ''`,確保每次打開窗口時「導入」輸入框都是空的(「導出」欄位維持原本自動填入當前棋譜的行為不變)。

已用 diff 比對確認這次只新增了上述邏輯,沒有動到其他任何程式碼;並用 Node.js 重新驗證整段 JavaScript 語法正常。
trigolden_game2646.html
附件
trigolden_game2646.html.7z
(45.92 KiB) 已下载 13 次
trigolden_game2645.html.7z
(45.76 KiB) 已下载 8 次
trigolden_game2644.html.7z
(45.76 KiB) 已下载 10 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

代码: 全选

<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7z M9 21h6 M10 12v-2l2-2 2 2v2" />
</svg>
SVG preview

AI設置窗口打開按鈕改成一個燈泡。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

當開局時(場上沒有棋子),或終局時(最後一子落完),「仲裁」按鈕應該不可點擊且變暗。注意連同undo和redo以及導入棋譜時也要一並更改。

claude sonnet 5 (low) + thinking

代码: 全选

Now let's verify the `.tool-btn.disabled` CSS actually blocks pointer events (not just visual dimming) so the button truly becomes unclickable:All changes are exactly as intended, plus the previous session's diffs still show correctly, and the JS parses cleanly.完成,改了兩處:

**`updateToolbar()`**(原本只在仲裁結束後才把「仲裁」按鈕變暗)
現在同時檢查三種情況:`arbEnded`(仲裁已結束)、`pieces.length === 0`(開局、場上沒有棋子)、`pieces.length === N_PIECES * 6`(終局、棋子已全部下完),任一成立就加上 `disabled` 樣式(變暗+游標變成 not-allowed)。

**`requestArbitration()`** 的點擊防呆
原本只擋 `pieces.length === 0 || arbEnded`,補上 `pieces.length === N_PIECES * 6` 這個終局情況,讓「即使按鈕還沒來得及變暗、被搶點了」也不會真的觸發仲裁流程。

因為 `updateToolbar()` 已經被以下所有流程呼叫(原本就是如此,不用額外改動):
- 每次正式落子後的 `saveState()`
- `undo()` / `redo()`
- 導入棋譜 `confirmImport()`(內部逐手呼叫 `actionCheck()` → `saveState()`)

所以這次只要修改 `updateToolbar()` 本身的判斷條件,這幾種情境就都會自動套用新邏輯,不需要在各處分別加程式碼。另外也在頁面初始化時補呼叫一次 `updateToolbar()`,確保一開局(棋盤還是空的)按鈕就正確顯示為變暗狀態。

已用 diff 確認這次只新增了這幾行邏輯、沒有動到其他程式碼,並用 Node.js 驗證整段 JavaScript 語法正常。
trigolden_game2647.html

當輪到一方時,如果他的「打勾」按鈕是暗的,這時點擊它就會切換默認AI等級。但是每次只有它恢復成「打勾」時才能再次切換。現在要改成可以連續切換,不用等其恢復成「打勾」。

代码: 全选

Found it — this confirms `previewNextDefaultAIIcon(p)` is the function used when it's the player's turn and the checkmark button is disabled (dim). Let's fix the guard so repeated clicks reset the timer instead of being ignored.Good — this confirms `updateUI` (which reassigns `checkBtn.onclick` and toggles the `disabled` class) is only re-run when a real state change happens, not during the preview window. So our fix cleanly enables continuous cycling without any other interference.Only the intended one-line change was made this turn (plus the diffs from previous turns still showing as expected). Syntax verified valid.改好了。問題出在 `previewNextDefaultAIIcon(p)` 這個函式:

```js
if (aiIconPreviewTimers[p]) return; // 預覽尚未結束前,忽略連續點擊
```

只要 1.2 秒的預覽計時器還在跑,這行就會直接擋掉後續點擊,所以必須等圖示恢復成打勾才能再切一次。

改成:

```js
if (aiIconPreviewTimers[p]) clearTimeout(aiIconPreviewTimers[p]); // 清除尚未結束的計時器,允許連續切換
```

現在每次點擊都會:
1. 立刻清掉還在跑的舊計時器(不會恢復成打勾)
2. 切到下一個預設 AI 等級並更新圖示
3. 重新啟動一個新的 1.2 秒計時器,之後才恢復成打勾

這樣就能連續快速點擊切換,不用等圖示先跳回打勾。已用 diff 確認只改了這一行,並重新驗證整段 JavaScript 語法正常。
trigolden_game2648.html
附件
trigolden_game2648.html.7z
(45.95 KiB) 已下载 11 次
trigolden_game2647.html.7z
(45.97 KiB) 已下载 5 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

trigolden_game2649.html

現在還剩「棋子形狀說明」、「操作說明」、「下載窗口」。
附件
trigolden_game2649.html.7z
(46.18 KiB) 已下载 4 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

修復與改進
當我兩方都用AI來對戰時,發現一方會直接下出使對方得分的「單連」,或者使對方下回合就能立即得分。檢查代碼,程式是否會弄錯這一手棋應給哪一方加分。

同時,我發現AI控制的一方,第一種棋子會用得最快,第二種棋子次之,第三種棋子總是最後剩下。說明AI在搜尋時,都是以第一到第二再到第三種棋子為順序進行搜尋和排序的。現在要把這個次序打亂,使每種棋子的使用機率相等。

MCTS 前的全單接/全雙接戰術搜索:easy,hard和expert都統一用 2 ply,並且不限定時間,一定要全部搜尋完成才開始MCTS。

把所有的AI等級的minimax都統一改為「最後三回合」,即後手方的最後兩回合或先手方的最後一回合。當到了minimax階段,將不再需要全單接/全雙接戰術搜索2ply,直接用minimax搜尋涵蓋。去掉AI設置中的「搜尋深度」。

回答要求:

不要影響當前正確的遊戲流程,明確給出所要修改的地方和所要替換的代碼。

trigolden_game2649.html

https://gpt.quanquan.space/share/4IKXUL ... stO1Eu9zB8
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀一枝独秀
帖子: 6559
注册时间: 2022年 11月 18日 17:36
联系:

Re: 一個新的遊戲創意

帖子 ejsoon »

去掉MCTS 前的全單接/全雙接戰術 2ply 搜索。

claude sonnet 5 (midium) + thinking

代码: 全选

Now let's view the exact text of `orderMovesForSearch`, `tacticalAlphaBeta`, and `runTacticalPresearch` to remove/simplify precisely.Now remove `tacticalAlphaBeta` and `runTacticalPresearch` functions.Now let's fix `runStateMCTS` to drop the `tacticalScores` parameter.isRoot is still used for `moves = isRoot ? rootMoves.slice() : ...`, so it stays fine. Just update the comment above `root.orderedMoves`.Now update the call site.Now let's verify there's no remaining reference to removed names, and check the `ai-thinking-candidates` translation string was used elsewhere so it's not now dead (fine either way).All references removed cleanly. Now let's sanity-check JS syntax with node.Syntax checks out. Let's also confirm `ai-thinking-candidates` isn't now completely orphaned in a broken way (check other usages remain, e.g. in minimax phase display).已移除 MCTS 前的「全單接/全雙接戰術 2ply 搜索」步驟,具體改動:

1. **刪除 `TACTICAL_PRESEARCH_PLY` 常數**
2. **刪除 `tacticalAlphaBeta` 函式**(2ply 戰術 alpha-beta 搜索本體)
3. **刪除 `runTacticalPresearch` 函式**(逐一根候選跑 2ply 戰術搜索並產出 `tacticalScores`)
4. **`runStateMCTS` 移除 `tacticalScores` 參數**,`ensureNodeMoves` 內排序改回單純呼叫 `orderMovesForSearch(node.state, moves)`
5. **`orderMovesForSearch` 移除 `tacticalScores` 參數**及其加權邏輯,現在只依 `moverGain` 與棋子優先序排序
6. **AI 主流程呼叫端**:MCTS 分支不再跑戰術預搜索、不再顯示「2 ply 全單接/全雙接戰術搜索」進度訊息,直接對根候選做一般排序後即進入 `runStateMCTS`

Minimax 分支(`useMinimax`,殘局用)完全未受影響,仍照原本邏輯運作。已用 `node --check` 驗證整份腳本語法正確。
附件
trigolden_game2652.html.7z
(44.34 KiB) 尚未被下载
trigolden_game2651.html.7z
(44.88 KiB) 尚未被下载
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复
  • 相似主题
    回复总数
    阅读次数
    最新帖子

在线用户

正浏览此版面之用户: Bing [Bot] 和 26 访客