HTML,CSS,JavaScript实现——井字棋游戏

和大家分享一个经典的游戏项目——井字棋游戏。这个项目不仅能带你回味童年的乐趣,还能帮助你练习 HTML、CSS 和 JavaScript 编程。

项目介绍

井字棋游戏是一个两人对战游戏,玩家轮流在一个3x3的网格上标记 X 或 O。先将三个标记连成一条直线(水平、垂直或对角线)的玩家获胜。如果所有的格子都被填满且没有玩家获胜,则游戏结束,结果为平局。

代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>井字棋游戏</title>
    <style>
        /* 设置整个页面的样式 */
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f9f9f9;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            margin: 0;
        }

        /* 设置标题样式 */
        h1 {
            font-size: 2.5em;
            color: #333;
            margin-bottom: 20px;
        }

        /* 设置游戏板的样式 */
        #game-board {
            display: grid;
            grid-template-columns: repeat(3, 120px);
            grid-template-rows: repeat(3, 120px);
            gap: 10px;
            background-color: #333;
            padding: 10px;
            border-radius: 10px;
        }

        /* 设置每个单元格的样式 */
        .cell {
            width: 120px;
            height: 120px;
            background-color: #fff;
            border: 2px solid #ddd;
            border-radius: 10px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 3em;
            color: #333;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.3s;
        }

        /* 设置单元格的悬停效果 */
        .cell:hover {
            background-color: #f0f0f0;
            transform: scale(1.05);
        }

        /* 设置 X 的样式 */
        .cell.x {
            color: #ff6347; /* 番茄色 */
        }

        /* 设置 O 的样式 */
        .cell.o {
            color: #4682b4; /* 钢蓝色 */
        }

        /* 设置按钮的样式 */
        button {
            margin-top: 20px;
            padding: 10px 20px;
            font-size: 1.2em;
            color: #fff;
            background-color: #007bff;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            transition: background-color 0.3s;
        }

        /* 设置按钮的悬停效果 */
        button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>
    <h1>井字棋游戏</h1>
    <!-- 游戏板 -->
    <div id="game-board">
        <div class="cell" data-index="0"></div>
        <div class="cell" data-index="1"></div>
        <div class="cell" data-index="2"></div>
        <div class="cell" data-index="3"></div>
        <div class="cell" data-index="4"></div>
        <div class="cell" data-index="5"></div>
        <div class="cell" data-index="6"></div>
        <div class="cell" data-index="7"></div>
        <div class="cell" data-index="8"></div>
    </div>
    <!-- 重新开始按钮 -->
    <button id="reset-button">重新开始</button>
    <script>
        // 获取所有单元格元素
        const cells = document.querySelectorAll('.cell');
        // 获取重新开始按钮
        const resetButton = document.getElementById('reset-button');
        // 设置当前玩家,默认为 'X'
        let currentPlayer = 'X';
        // 创建一个长度为 9 的数组,用于存储游戏状态,初始值为 null
        let board = Array(9).fill(null);
        // 标记游戏是否在进行中
        let gameActive = true;

        // 定义胜利组合
        const winningCombinations = [
            [0, 1, 2],
            [3, 4, 5],
            [6, 7, 8],
            [0, 3, 6],
            [1, 4, 7],
            [2, 5, 8],
            [0, 4, 8],
            [2, 4, 6],
        ];

        // 检查是否有获胜者
        const checkWinner = () => {
            for (const [a, b, c] of winningCombinations) {
                if (board[a] && board[a] === board[b] && board[a] === board[c]) {
                    return board[a];
                }
            }
            return board.includes(null) ? null : 'Tie';
        };

        // 处理单元格点击事件
        const handleClick = (e) => {
            const index = e.target.dataset.index;
            // 如果单元格已被点击或游戏已结束,则返回
            if (board[index] || !gameActive) return;

            // 更新单元格内容和样式
            board[index] = currentPlayer;
            e.target.textContent = currentPlayer;
            e.target.classList.add(currentPlayer.toLowerCase());

            // 检查是否有获胜者
            const winner = checkWinner();
            if (winner) {
                gameActive = false;
                if (winner === 'Tie') {
                    alert("平局!");
                } else {
                    alert(`${winner} 胜!`);
                }
                return;
            }

            // 切换当前玩家
            currentPlayer = currentPlayer === 'X' ? 'O' : 'X';
        };

        // 重置游戏
        const resetGame = () => {
            board.fill(null);
            cells.forEach(cell => {
                cell.textContent = '';
                cell.classList.remove('x', 'o');
            });
            currentPlayer = 'X';
            gameActive = true;
        };

        // 为每个单元格添加点击事件监听器
        cells.forEach(cell => cell.addEventListener('click', handleClick));
        // 为重新开始按钮添加点击事件监听器
        resetButton.addEventListener('click', resetGame);
    </script>
</body>
</html>

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的实现,代码如下: HTML: ```html <div class="tic-tac-toe"> <div class="row"> <div class="cell" id="cell-0"></div> <div class="cell" id="cell-1"></div> <div class="cell" id="cell-2"></div> </div> <div class="row"> <div class="cell" id="cell-3"></div> <div class="cell" id="cell-4"></div> <div class="cell" id="cell-5"></div> </div> <div class="row"> <div class="cell" id="cell-6"></div> <div class="cell" id="cell-7"></div> <div class="cell" id="cell-8"></div> </div> </div> ``` CSS: ```css .tic-tac-toe { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-top: 50px; } .row { display: flex; } .cell { width: 100px; height: 100px; border: 2px solid black; font-size: 50px; font-weight: bold; display: flex; justify-content: center; align-items: center; cursor: pointer; } .cell:hover { background-color: #eee; } ``` JS: ```javascript const cells = document.querySelectorAll('.cell'); let currentPlayer = 'X'; let gameEnded = false; function checkWinner() { const winningCombinations = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ]; for (let i = 0; i < winningCombinations.length; i++) { const [a, b, c] = winningCombinations[i]; if (cells[a].textContent === cells[b].textContent && cells[b].textContent === cells[c].textContent && cells[a].textContent !== '') { return cells[a].textContent; } } return ''; } function resetGame() { cells.forEach(cell => { cell.textContent = ''; }); currentPlayer = 'X'; gameEnded = false; } cells.forEach(cell => { cell.addEventListener('click', () => { if (gameEnded || cell.textContent !== '') { return; } cell.textContent = currentPlayer; const winner = checkWinner(); if (winner !== '') { alert(`Winner: ${winner}`); gameEnded = true; return; } if (currentPlayer === 'X') { currentPlayer = 'O'; } else { currentPlayer = 'X'; } }); }); document.querySelector('#reset-button').addEventListener('click', resetGame); ``` 上述代码通过 HTMLCSS 创建了一个游戏界面,并通过 JavaScript 实现游戏的逻辑。在点击格子时会切换当前玩家并检查是否有获胜者,当游戏结束时可以通过点击“重置”按钮重新开始游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值