如何在获胜状态后禁用点击

How can I disable clicks after winning status

提问人:Ujjawal 提问时间:7/15/2023 最后编辑:halferUjjawal 更新时间:7/17/2023 访问量:54

问:

我尝试了很多概念,但最终无法得出答案。我做了一个井字游戏,它功能齐全,但我有一个问题,当我的获胜状态显示在 windisplay 列上时,之后我也能够接受用户的输入。

我想在找到获胜者时禁用我的框点击。

const GameBoard = (() => {
    const PlayerFactory = (name, mark, turn) => {
        return { name, mark, turn }
    };

    var p1arr = [];
    var p2arr = [];
    const player1 = PlayerFactory("Player 1", "X", true);
    const player2 = PlayerFactory("Player 2", "O", false);

    const windisplay = document.querySelector('.win-display');

    var boxes = document.getElementsByClassName("box");

    let gameover = false;

    if (gameover) {
        return;
    }
    
    for (var i = 0; i < boxes.length; i++) {
        boxes[i].addEventListener("click", function () {
            boxClicked(this);
        });

    }

    function boxClicked(box) {
        if (box.innerHTML === "") {
            if (player1.turn === true) {
                box.textContent = player1.mark;
                // alert("Kaam 1 ho gya");
                p1arr[box.id] = player1.mark;
                console.log(p1arr);
                player1.turn = false;
                player2.turn = true;
                checkwinner();
            }
            else if (player2.turn === true) {
                box.textContent = player2.mark;
                // alert("Kaam 2 ho gya");
                p2arr[box.id] = player2.mark;
                console.log(p2arr);
                player1.turn = true;
                player2.turn = false;
                checkwinner();
            }
        } else {
            console.log("This box is already occupied!");
        }
    }

    const winCombos = [
        [0, 1, 2],
        [0, 3, 6],
        [3, 4, 5],
        [6, 7, 8],
        [1, 4, 7],
        [2, 4, 6],
        [2, 5, 8],
        [0, 4, 8]
    ];

    function checkwinner() {
        // Check if any winCombos match the numbers in array1
        var isWinner1 = checkWinCombos(p1arr);
        if (isWinner1) {
            console.log("Winner is X! ");
            windisplay.textContent = "Winner is X! ";
            gameover = true;
        }

        // Check if any winCombos match the numbers in array2
        var isWinner2 = checkWinCombos(p2arr);
        if (isWinner2) {
            console.log("Winner is O!");
            windisplay.textContent = "Winner is O! ";
            gameover = true;
        }


        // Function to check if any winCombos match the given array
        function checkWinCombos(array) {
            for (var i = 0; i < winCombos.length; i++) {
                var combo = winCombos[i];
                var isMatch = true;
                for (var j = 0; j < combo.length; j++) {
                    if (!array[combo[j]]) {
                        isMatch = false;
                        break;
                    }
                }
                if (isMatch) {
                    return true;
                }
            }
            return false;
        }

        // Function to count occurrences of 'X' and 'O' in an array
        function countOccurrences(array, symbol) {
            let count = 0;
            for (let i = 0; i < array.length; i++) {
                if (array[i] === symbol) {
                    count++;
                }
            }
            return count;
        }

        // Count the occurrences of 'X' and 'O' in both arrays
        const oCount = countOccurrences(p1arr, 'O') + countOccurrences(p2arr, 'O');
        const xCount = countOccurrences(p1arr, 'X') + countOccurrences(p2arr, 'X');

        // Check if all 9 boxes are occupied
        if (xCount + oCount === 9) {
            console.log('Tie!');
            windisplay.textContent = "Tie!";
        }

    }

    let resetbutton = document.querySelector('.reset')
    resetbutton.addEventListener('click', function () {
        // alert("Kaam ho gya!");
        resetgame();
    });

    function resetgame() {
        p1arr = [];
        p2arr = [];
        for (var i = 0; i < boxes.length; i++) {
            boxes[i].innerHTML = "";
        }
        windisplay.textContent = "";
    }

})();
javascript html css 循环 井字游戏

评论


答:

2赞 Y Nawodya 7/15/2023 #1

这是检查游戏是否结束的错误位置,因为显然您刚刚将其设置为:false

let gameover = false;

if (gameover) {
    return;
}

在下面的代码中,框单击的事件侦听器包装在 if 条件中,以检查游戏是否已经结束。喜欢这个:if (!gameover)

let gameover = false;

for (var i = 0; i < boxes.length; i++) {
  boxes[i].addEventListener("click", function () {
    if (!gameover) {
      boxClicked(this);
    }
  });
}

评论

1赞 Ujjawal 7/15/2023
答案是正确的,只需在复位函数中添加一个代码:。这段代码中的另一个问题是,当在最后一步(即第 9 个框)决定获胜者时,它显示了两个答案:1.获胜者是 __ !和 2.绑!,我想删除此领带消息。如果您可以使用此代码实现,请尝试一下。gameover = false
1赞 Y Nawodya 7/15/2023
尝试添加原因,让您了解在没有找到获胜者时给 Tie messegeif (xCount + oCount === 9) { if (!isWinner1 && !isWinner2) { //...other codes ; gameover = true;}}if (!isWinner1 && !isWinner2)
1赞 Y Nawodya 7/15/2023
gameover=true不是首字母。.但是当比赛打成平局时,这意味着比赛结束了。因此,它将帮助您防止不必要的更改