改下哥尼斯堡網頁程式

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

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

改進:
如果當前處於「自動走棋」的搜尋進程時,場上的class=man以及btn_history將不能被點擊,如果點g12155並彈出modal窗口,則「自動走棋」的搜尋進程中止。

當modal窗口打開時,點擊「開始搜尋」,按鈕將變為「停止搜尋」,按下「停止搜尋」或關閉窗口,都會使其停止。

只需給出所要修改的地方。
上次由 ejsoon 在 2026年 4月 12日 20:57,总共编辑 1 次。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

gemini thinking:

代码: 全选

為了實現您的需求,我們需要針對 `konigsberg20260412param7794.html` 進行以下幾處修改:

### 1. 定義狀態控制變數與 UI 鎖定函式
在 `<script>` 標籤內的全局變數區域(例如在 `let currState;` 附近)新增一個 flag,並定義一個控制點擊狀態的函式。

```javascript
// 新增:追蹤自動走棋狀態
let isAiRunning = false;

// 新增:切換 UI 互動狀態的函式
function setUIInteraction(disabled) {
    const pointerValue = disabled ? 'none' : 'auto';
    // 鎖定/解鎖所有 class 為 man 的元素
    document.querySelectorAll('.man').forEach(el => {
        el.style.pointerEvents = pointerValue;
    });
    // 鎖定/解鎖 btn_history
    const btnHistory = document.getElementById('btn_history');
    if (btnHistory) btnHistory.style.pointerEvents = pointerValue;
}
```

### 2. 修改「自動走棋」的啟動與結束邏輯
找到負責執行「自動走棋」的函式(通常是處理「自動走棋」按鈕點擊後的邏輯,或名為 `autoPlay`、`aiMove` 的函式)。

```javascript
// 假設自動走棋的進入點函式如下,請在其開始與結束處加入控制
async function startAutoPlay() { // 函式名稱依原代碼而定
    isAiRunning = true;
    setUIInteraction(true); // 禁用點擊

    while (isAiRunning && !gameFinished) {
        // ... 原有的 AI 搜尋與走棋邏輯 ...
        
        // 在循環內部檢查,如果 isAiRunning 被設為 false,則中斷
        if (!isAiRunning) break;
        
        await new Promise(resolve => setTimeout(resolve, 500)); // 假設的延遲
    }

    isAiRunning = false;
    setUIInteraction(false); // 恢復點擊
}
```

### 3. 修改 `g12155` 的點擊事件
找到 `#g12155` 的事件監聽器(這是開啟 Modal 的按鈕),在開啟窗口的同時強制中止搜尋。

```javascript
// 找到 g12155 的 click 監聽處進行修改
document.getElementById('g12155').addEventListener('click', function() {
    if (isAiRunning) {
        isAiRunning = false; // 中止搜尋進程
        setUIInteraction(false); // 立即恢復 UI 互動
        console.log("自動走棋已因開啟窗口而中止");
    }
    
    // ... 原有的彈出 modal 窗口代碼 ...
});
```

### 修改要點說明:
1.  **CSS `pointer-events`**: 這是最簡單且有效的方法。當設為 `none` 時,該元素及其子元素將無法觸發任何鼠標事件(click, hover 等)。
2.  **標誌位 (Flag) 控制**: 透過 `isAiRunning` 變數。當點擊 `g12155` 時將其設為 `false`,則自動走棋的循環(Loop)或遞迴邏輯在下一次檢查時會自動停止。
3.  **範圍限制**: 此修改精確鎖定了 `.man` 和 `#btn_history`,符合您的特定需求。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

btn_history以及各種按鈕應該不可選取。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

gemini pro:

代码: 全选

這裡為您提供所需的程式碼修改。您可以直接找到對應的區塊並將其替換或加入新增的程式碼:

### 1. 新增中止搜尋用的全域變數
在 `autoPlayTimer` 和 `isMctsRunning` 宣告的下方,新增一個 `abortMcts` 變數。
```javascript
    let autoPlayTimer = null; // 用於自動下棋的計時器
    let isMctsRunning = false; // 用來追蹤 MCTS 是否正在執行
    let abortMcts = false; // 新增:用來強制中止 MCTS 搜尋
```

### 2. 禁止在搜尋期間點擊棋子 (man)
在 `manOnClick` 函數的開頭加入防護。
```javascript
    // man onclick
    function manOnClick() {
        if (isMctsRunning) return; // 新增:如果正在搜尋中,禁止點擊
        if (game_status == 1 || game_status == 3) {
            let clickmandot = parseInt(this.getAttribute("i"));
```

### 3. 禁止在搜尋期間點擊歷史記錄相關按鈕
在 `historyOnclick` 與設定鈕的事件中加入防護。
```javascript
    // show and set history
    setting_close.onclick = btn_history_set.onclick = function() {
        if (isMctsRunning && this === btn_history_set) return; // 新增:搜尋中禁止點擊設定鈕
        let game_history_parse = [];
```
```javascript
    // history prev
    btn_history_next.onclick = btn_history_prev.onclick = historyOnclick;

    function historyOnclick() {
        if (isMctsRunning) return; // 新增:搜尋中禁止點擊歷史上下頁
        if ("g11048" == this.id) {
```

### 4. 開啟視窗時強制中止搜尋
在 `openMctsModal` 開頭加入 `abortMcts = true`。
```javascript
    // 新增視窗開啟控制
    function openMctsModal() {
        abortMcts = true; // 新增:開啟視窗時立即中止背景正在運行的自動搜尋
        document.getElementById('mcts_results').innerHTML = '';
        currentMctsResults = [];
```

### 5. 關閉視窗時中止搜尋並處理重啟
修改 `closeMctsModal`,中止搜尋、復原按鈕文字,並拔除原本針對 `!isMctsRunning` 的限制,確保自動下棋能順利重啟。
```javascript
    // 新增視窗關閉與觸發控制
    function closeMctsModal() {
        abortMcts = true; // 新增:關閉視窗時中止目前的搜尋
        document.getElementById('mcts_start_btn').innerText = "開始搜尋"; // 新增:復原按鈕文字
        document.getElementById('mcts_modal').style.display = 'none';
        
        if (game_status == 1 || game_status == 3) {
            let autoBlue = document.getElementById('mcts_auto_blue') && document.getElementById('mcts_auto_blue').checked;
            let autoGreen = document.getElementById('mcts_auto_green') && document.getElementById('mcts_auto_green').checked;
            // 修改:移除原本的 && !isMctsRunning 條件,以確保被中止後能再次啟動
            if ((current_man === 0 && autoBlue) || (current_man === 1 && autoGreen)) {
                clearTimeout(autoPlayTimer);
                autoPlayTimer = setTimeout(() => {
                    isMctsRunning = false; // 確保被中止的鎖定狀態強制解除
                    updateMctsParams();
                    runMCTS(true);
                }, 500);
            }
        }
    }
```

### 6. 更新「開始搜尋」按鈕的事件綁定
修改 `mcts_start_btn` 的點擊事件,加入切換「停止搜尋」的邏輯。
```javascript
    document.getElementById("mcts_start_btn").addEventListener('click', function() {
        // 新增:如果正在搜尋,則改為中止行為
        if (isMctsRunning) {
            abortMcts = true;
            this.innerText = "開始搜尋";
            return;
        }

        if (![1, 2, 3, 4].includes(game_status)) {
            document.getElementById('mcts_results').innerHTML = "請在輪到玩家移動時搜尋。";
            return;
        }
        
        this.innerText = "停止搜尋"; // 新增:將按鈕變成停止
        updateMctsParams();
        document.getElementById('mcts_results').innerHTML = "搜尋中,請稍候...";
        setTimeout(() => runMCTS(false), 50);
    });
```

### 7. 在核心 `runMCTS` 中加入中斷判斷與按鈕復原
在 `runMCTS` 內部進行幾處修改,確保每次進入時重置旗標,並在運算中檢查中斷:

**A. 函數開頭重置旗標:**
```javascript
    function runMCTS(isAuto = false) {
        if (isMctsRunning) return; 
        isMctsRunning = true;
        abortMcts = false; // 新增:開始搜尋時重置中止旗標
```

**B. 在提早獲勝或無路可走時復原按鈕文字:**
```javascript
        // (約莫在 if (canShootNow) 的區塊內)
        if (canShootNow) {
            // ... (保留原本邏輯)
            isMctsRunning = false;
            document.getElementById('mcts_start_btn').innerText = "開始搜尋"; // 新增
            return; // 終止後續的 MCTS 展開
        }

        let isFirstGameTurn = game_hp <= 1; 
        let rootMoves = getLegalMoves(rootState, isFirstGameTurn);
        if (rootMoves.length === 0) {
            // ... (保留原本邏輯)
            isMctsRunning = false;
            document.getElementById('mcts_start_btn').innerText = "開始搜尋"; // 新增
            return;
        }
```

**C. 修改 `processNextChunk` 迴圈來接收中止訊號:**
```javascript
        // 非同步分塊執行函數
        function processNextChunk() {
            // 新增:每次迴圈檢查是否收到中止訊號
            if (abortMcts) {
                isMctsRunning = false;
                document.getElementById('mcts_start_btn').innerText = "開始搜尋";
                document.getElementById('thinking_ui').style.display = 'none';
                if (!isAuto) document.getElementById('mcts_results').innerHTML = "搜尋已中止。";
                return;
            }

            if (moveIndex < totalMoves) {
                // ... (保留中間的所有推演邏輯)
                
                moveIndex++;
                // 使用 setTimeout 讓出執行緒,允許瀏覽器重新渲染畫面
                setTimeout(processNextChunk, 0);
            } else {
                // 搜尋全部結束,處理結果
                isMctsRunning = false;
                document.getElementById('mcts_start_btn').innerText = "開始搜尋"; // 新增:搜尋結束自動復原按鈕
                // ... (保留原本剩餘的結算與 UI 更新邏輯)
```
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

konigsberg20260412shutdown7795

增加停止搜尋功能,禁止svg選中。把「必殺搜尋」分成四段。
附件
konigsberg20260412shutdown7795.7z
(13.94 KiB) 已下载 4 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

介紹下在本程式中,mcts_first_path是如何應用的?它在processNextChunk中是否一直保持這個值?如果是,應改為只影響到首回合的推演。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

附件
konigsberg20260412stopthink7797.7z
(13.94 KiB) 已下载 4 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5105
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 174 次
被圈友点赞: 204 次
联系:

Re: 改下哥尼斯堡網頁程式

帖子 ejsoon »

當在搜尋時,包括自動走棋時的搜尋和打開modal窗口時的搜尋,都要加上計時功能,實時展示用了多少秒。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复

在线用户

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