簡體   English   中英

井字游戲正則表達式

[英]Tic-tac-Toe regex

我正在研究井字游戲算法,並且正在使用正則表達式來解決獲勝條件。 9 個方塊被賦予 0-8 值:

[0][1][2]

[3][4][5]

[6][7][8]

每次玩家 1 或 2 點擊一個方塊時,該值被推送到一個數組中,在收集到 3 個值后,正則表達式開始測試玩家是否贏了。

問題.. 例如正則表達式測試,看看是否存在012 102的任何訂單,但它不能匹配03142

即使被其他數字分隔,我如何修復我的正則表達式以查找 3 個數字?

Let regexWin =  /(?:^|\W)[012][012][012](?:$|\W)/gm,

假設占用的方格被推入 object moves ,其中包含每個玩家的數組p1p2 ,每次推后只需對 arrays 進行排序。 這樣,可以保證索引按升序進行比較。

let moves = {p1: [], p2: []};
function move(player, spaceIndex) {
    moves[player].push(spaceIndex);
    moves[player].sort();
    if (/012|345|678|036|147|258|048|246/.test(moves[player].join('')) {
        //win!
    }
}

從您的問題中給出的詳細信息來看,您似乎並沒有意識到您需要兩個 arrays,而不是一個,否則獲勝算法將不知道哪個玩家占據了哪個空間,並且只會在三個空格內報告獲勝一行被占用,即使它們在不同玩家之間共享。

您可以跟蹤棋盤 state,因此您不需要依賴moves列表:將board定義為長度為 9 的數組,初始化為全 0(表示每個單元格都是空的)。 然后,當一個動作被播放時,將相應的插槽設置為“1”或“2”,具體取決於哪個玩家播放該動作。

var board = Array(9).fill(0); // initial board
var moves = []; // initial move list
var turn = 1; // first player to move (other player is identified as 2)

// ...

function play(move) { // move is an index in board (0..8)
    board[move] = turn; // turn is 1 or 2
    moves.push(move); // this is the list you already have
    // Use regular expression to detect any 3-in-a-row
    let isWin = /^(?:...)*([12])\1\1|^.?.?([12])..\2..\2|^([12])...\3...\3|^..([12]).\4.\4/.test(board.join(""));
    console.log("is winning move?", isWin); 
    turn = 3 - turn; // toggle the player that is to move
}

這樣你也可以使用board來更新顯示。

有關用於生成“最佳”移動的完整實現、渲染和極小極大算法,請參閱此答案

我沒有找到有效的正則表達式,所以我換了一個不同的想法。 根據 Alvaro Saburido 的文章,我學習了如何將winArray1&2 playerArray用於交叉路口並測試獲勝。 這篇文章很棒,我會繼續尋找一個正則表達式解決方案,只是為了編碼的樂趣。

https://medium.com/@alvaro.saburido/set-theory-for-arrays-in-es6-eb2f20a61848

    let win = ["012", "345", "678", "036", "147", "258", "048", "246"];
    function endGameEvaluation() {
    if (joueur1Turn) {
        resultMessage.innerHTML = `<div id="resultMessage">Player 1 Wins!! End of the game</div>`;
        gameWon = true;
        playerTurnMsg.innerHTML = "";
    } else if (joueur2Turn) {
        resultMessage.innerHTML = `<div id="resultMessage">Player 2 Wins!! End of the game</div>`;
        gameWon = true;
        playerTurnMsg.innerHTML = "";
    }
}

function winner(player) {
    for (var i = 0; i < 8; i++) {
        let won = win[i]
        let inCommon = player.filter(x => won.includes(x));
        if (inCommon.length == 3) {
            endGameEvaluation();
        }
    }
}

tdClickArea.forEach(item => {
    item.addEventListener('click', e => {
        let btnArea = e.target;
        let player;

        if (btnArea.innerHTML == "X" || btnArea.innerHTML == "O") {
            alert("tricheur! Choisi une autre case")
        } else {
            if (joueur1Turn) {
                btnArea.innerHTML = "X";
                joueur1Sq.push(btnArea.getAttribute("value"));
                player = joueur1Sq;

            } else if (joueur2Turn) {
                btnArea.innerHTML = "O";
                joueur2Sq.push(btnArea.getAttribute("value"));
                player = joueur2Sq;
            }
        }
        if (joueur1Sq.length >= 3 || joueur2Sq.length >= 3) {
            winner(player);
        }
        counter++;
        changeTurn();
        // Here we end the game if nobody won until the last posibble move
        if (counter == 9 && gameWon == false) {
            resultMessage.innerHTML = `<div id="resultMessage">End of the game</div>`;
        }
    })
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM