javascript五子棋编程练习

229 阅读1分钟

需求:实现一个五子棋功能,并且对即将获得胜利进行预判

产品:

实现:

<!DOCTYPE html>
<html>
<style>
    .cell {
        width: 100px;
        height: 100px;
        background-color: green;
        display: inline-block;
        border: solid 1px white;
        vertical-align: middle;
        line-height: 100px;
        font-size: 50px;
        text-align: center;
        color: red;
    }
</style>

<head>
    <meta charset="utf-8">
    <title>五子棋编程练习</title>

</head>

<body>
    <div id="board"></div>
    <script>
        let pattern = [[2, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]];
        let color = 1;



        function show() {
            let board = document.getElementById("board");
            board.innerHTML = '';

            for (let i = 0; i < 5; i++) {
                for (let j = 0; j < 5; j++) {

                    let cell = document.createElement("div");
                    cell.classList.add('cell');
                    cell.innerText = pattern[i][j] == 2 ? "X" : pattern[i][j] == 1 ? 'O' : '';
                    cell.addEventListener("click", () => move(j, i));
                    board.appendChild(cell);
                }
                board.appendChild(document.createElement('br'))
            }
        }
        function move(x, y) {
            pattern[y][x] = color;
            if (check(pattern, color)) {
                alert(color == 2 ? "X is winner!" : "O is winner!");
            }
            color = 3 - color;
            show();
            if (willWin(pattern, color)) {
                alert(color == 2 ? "X will winner!" : "O will winner!");

            }


        }
        show(pattern);

        function clone(pattern) {
            return JSON.parse(JSON.stringify(pattern));
        }

        function willWin(pattern, color) {
            for (let i = 0; i < 5; i++) {
                for (let j = 0; j < 5; j++) {
                    if (pattern[i][j]) {
                        continue;
                    }
                    let tmp = clone(pattern);

                    tmp[i][j] = color;
                    if (check(tmp, color)) {
                        return true;
                    }
                }
            }
            return false;

        }

        function check(pattern, color) {

            // 三行检查
            for (let i = 0; i < 5; i++) {
                let win = true;
                for (let j = 0; j < 5; j++) {
                    if (pattern[i][j] !== color) {
                        win = false;
                    }

                }
                if (win) {
                    return true;
                }
            }

            // 三列检查
            for (let i = 0; i < 5; i++) {
                let win = true;
                for (let j = 0; j < 5; j++) {
                    if (pattern[j][i] !== color) {
                        win = false;
                    }

                }
                if (win) {
                    return true;
                }
            }
            // 反向对角线
            {
                let win = true;
                for (let j = 0; j < 5; j++) {
                    if (pattern[j][4 - j] !== color) {
                        win = false;
                    }

                }
                if (win) {
                    return true;
                }
            }

            // 正向对角线
            {
                let win = true;
                for (let j = 0; j < 5; j++) {
                    if (pattern[j][j] !== color) {
                        win = false;
                    }
                }
                if (win) {
                    return true;
                }
            }
            return false;


        }
    </script>
</body>

</html>