[英]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
,其中包含每個玩家的數組p1
和p2
,每次推后只需對 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 的文章,我學習了如何將winArray和1&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.