【前端】开发五子棋小游戏全流程

帅比九日
前端领域优质创作者
2024-05-17 10:10:45

使用前端技术开发五子棋小游戏

在这篇博文中,我们将详细介绍如何使用HTML、CSS和JavaScript开发一个简单的五子棋小游戏。我们将展示如何初始化棋盘、处理用户交互以及实现胜负判定。特别是,我们将着重介绍胜负判定的逻辑实现。
完整代码我放在了这里:github

在这里插入图片描述

项目结构

项目主要由两个文件组成:

  1. HTML文件:用于定义页面结构。
  2. JavaScript文件:负责游戏的逻辑和交互。

HTML结构

首先,我们创建一个简单的HTML文件,它定义了棋盘和基本样式。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>五子棋小游戏</title>
    <style>
        /* 添加简单的样式 */
        #board {
            display: grid;
            grid-template-columns: repeat(15, 40px);
            grid-template-rows: repeat(15, 40px);
            border: 1px solid #000;
        }
        .cell {
            width: 40px;
            height: 40px;
            border: 1px solid #ccc;
            display: flex;
            align-items: center;
            justify-content: center;
        }
    </style>
</head>
<body>
    <h1>五子棋小游戏</h1>
    <div id="board"></div>
    <script src="game.js"></script>
</body>
</html>

棋盘初始化

game.js 文件中,我们首先初始化棋盘和相关变量,然后生成棋盘界面并为每个单元格添加点击事件监听器。

const board = document.getElementById('board');
const size = 15;
let currentPlayer = 'black';

// 初始化棋盘数组
const boardArray = Array(size).fill(null).map(() => Array(size).fill(null));

// 初始化棋盘
for (let i = 0; i < size * size; i++) {
    const cell = document.createElement('div');
    cell.classList.add('cell');
    cell.dataset.index = i;
    board.appendChild(cell);
}

// 监听点击事件
board.addEventListener('click', (event) => {
    const cell = event.target;
    if (cell.classList.contains('cell') && !cell.innerHTML) {
        const index = +cell.dataset.index;
        const x = index % size;
        const y = Math.floor(index / size);
        
        const disc = document.createElement('div');
        disc.style.width = '30px';
        disc.style.height = '30px';
        disc.style.borderRadius = '50%';
        disc.style.backgroundColor = currentPlayer;
        cell.appendChild(disc);
        
        // 更新棋盘状态
        boardArray[y][x] = currentPlayer;
        
        // 检查胜负
        if (checkWinner(boardArray, currentPlayer)) {
            alert(`${currentPlayer} wins!`);
        } else {
            // 切换玩家
            currentPlayer = currentPlayer === 'black' ? 'white' : 'black';
        }
    }
});

胜负判定

胜负判定逻辑是这个游戏的核心部分。我们需要检测棋盘上是否有五个连续的棋子。我们将从四个方向(水平、垂直、左上到右下、右上到左下)进行检查。

function checkWinner(boardArray, player) {
    const directions = [
        [1, 0], // 水平
        [0, 1], // 垂直
        [1, 1], // 左上到右下
        [1, -1] // 右上到左下
    ];
    
    for (let y = 0; y < size; y++) {
        for (let x = 0; x < size; x++) {
            if (boardArray[y][x] === player) {
                for (let [dx, dy] of directions) {
                    let count = 1;
                    for (let step = 1; step < 5; step++) {
                        const nx = x + dx * step;
                        const ny = y + dy * step;
                        
                        if (
                            nx >= 0 && nx < size &&
                            ny >= 0 && ny < size &&
                            boardArray[ny][nx] === player
                        ) {
                            count++;
                        } else {
                            break;
                        }
                    }
                    if (count === 5) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

胜负判定逻辑解释

  1. 定义四个方向:我们定义了四个方向的增量 (dx, dy),分别对应水平、垂直、左上到右下和右上到左下。

  2. 遍历棋盘:在每个格子上,如果该格子是当前玩家的棋子,我们检查四个方向上是否有连续五个棋子。

  3. 检测五个连续的棋子:在每个方向上,我们使用一个 for 循环从1到4逐步增加步数 (step),计算新的坐标 (nx, ny),如果新坐标上的棋子和当前玩家相同,则增加计数器 count

  4. 返回胜利结果:如果在任何方向上计数器 count 达到5,则当前玩家胜利,函数返回 true,否则返回 false

总结

通过这篇博客,我们介绍了如何使用HTML、CSS和JavaScript开发一个简单的五子棋小游戏,重点介绍了棋盘初始化和点击事件处理,以及胜负判定的逻辑实现。希望这篇文章能帮助你更好地理解前端开发和算法的基础知识。享受编程的乐趣吧!

...全文
366 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

309,873

社区成员

发帖
与我相关
我的任务
社区描述
欢迎加入几何心凉的前端社区,本社区活动丰富可以拿到众多周边礼物,本社区还对接Vue技能树可以更加系统的进行学习,还为大家定期举办博主成长计划,助您赢在CSDN同时带您遨游在前端技术的海洋中!!
前端学习经验分享 个人社区 北京·丰台区
社区管理员
  • 几何心凉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

诚挚的邀请大家加入几何心凉社区,在这里您可以结实挚友、提升技术、分享经验、成就自己

  • 【社区活动】本社区受官方长期扶持,您可以通过活动打造个人IP,让更多的人受益于您的分享,同时我们还会奉上精美周边;
  • 【赢在CSDN】社区会对社区成员开设博主扶持计划,集结优质博主分享成长经验,更是疑问在线解答,定期直播连麦,只要您是本社区成员皆可免费享受此权益,让我们携手共进助您速获万粉头衔;
  • 【Vue技能树】本社区创建人同时作为Vue技能树构建者,可为本社区开设技能树投稿通道,获得此权益后我们的高质量的文章被技能树收录获得更多曝光机会;
  • 【简历/就业指导】本社区创建者目前兼职高校就业指导,如果您是学生准备找工作或者您是职场人在应聘中遇到任何问题都可以在这里寻求帮助,我们会定期开设简历审查、面试技巧等就业方面的直播讲解;
  • 【技术交流】任何语言任何方向的技术文章我们都可以汇聚于此,大家可以摸鱼时间可以来此处提升自己,遨游在技术的海洋中;
  • 【立码吐槽】不管你是学生还是打工人,相信在生活中肯定有不断的新鲜事发生,这些事情可以是令你高兴的(比如今天过生日)可以是伤心的(比如我们丢了一个发卡)当然还会有很多,不满、发泄、求安慰等等,那么你可以在这个专栏中做出分享,求一句生日快乐、上岸顺利、加油老铁等等暖心的话;相信我们社区的伙伴看到后一定会速来吐槽;
  • 【bug记录】开发中的坑、学习中的雷,我们皆可投递于此,让更多的人借着分享精准避免从而高效开发;
  • 【更多】更多专栏正在筹备中。。。如果您是社区成员、如果您想为社区建设贡献力量,可以私聊社区管理员;

试试用AI创作助手写篇文章吧