原生 JavaScript 实现连连看游戏核心算法与源码解析

Finn
Finn
发布时间:2026-10-15| 3人浏览过
原创

如何利用原生 JavaScript 从零构建一个连连看小游戏?本文将深入解析其 HTML 结构搭建、CSS 视觉处理以及核心的 JS 逻辑控制,特别是基于网格坐标的路径搜索算法(直线、一弯、两弯),帮助开发者掌握前端游戏开发的基础技能。

游戏界面布局与样式设计

连连看游戏的界面主要由游戏面板、分数显示、时间倒计时以及控制按钮组成。在 HTML 结构中,所有元素被包裹在一个主容器 #whole 中。其中,#gamePanel 用于承载所有图片方块,右侧区域分别放置了 Logo、分数面板(#score)、时间面板(#time)和操作按钮(开始/重置)。

CSS 样式通过绝对定位(position: absolute)将功能区块固定在右侧,而游戏区域则采用相对定位配合浮动布局来排列每一个 .piece 元素。这种布局方式确保了在不同屏幕尺寸下,游戏主体与侧边栏的比例关系保持稳定,同时也为后续 JS 动态生成 DOM 元素提供了明确的视觉参考框架。

核心数据模型与初始化逻辑

游戏的核心在于对游戏状态的维护。我们定义了一个 Game 对象作为全局控制器,它负责管理地图映射 pieceMap、图片列表 pieceList、随机图片源列表 randomList 以及当前得分和时间等状态变量。

// Game 对象关键属性
var Game = {
    pieceMap : null, // 存储每个坐标对应的Piece对象
    score : 0,
    time : 0,
    isGameBegin : false,
    // ... 其他方法
};

初始化过程主要在 init 函数中执行。首先创建一个自定义的 Map 结构用于快速查找,然后调用 initRandomList 生成成对的图片索引(共 150 个偶数对,覆盖整个棋盘)。接着通过 messRandomList 打乱顺序,并遍历 204 个网格位置(部分边缘位置不填充图片以允许路径穿越),依次创建 Piece 实例并添加到页面 DOM 中。

第1步:构建地图坐标系

为了让算法能够准确识别两个图形是否连通,必须建立严格的坐标系统。在 initPieces 中,横坐标 x 为 i % 17,纵坐标 y 为 Math.floor(i / 17)。我们将每个格子的唯一标识 x+y 作为 Key,存入 pieceMap。这样,在后续判断路径时,可以通过坐标瞬间获取该位置是否存在实体图片。

第2步:绑定点击事件与状态更新

每个 Piece 对象在初始化时都会绑定自身的 onclick 事件。当用户点击方块时,触发 onClick 函数,此时会检查游戏是否已开始,并根据 onClicked 标志位判断是第一次点击还是第二次点击。如果是第二次点击,系统将尝试调用路径搜索算法进行匹配判定。

连连看核心算法:路径搜索

连连看判定的本质是寻找两条相同图片之间是否存在一条“路径”。规则通常包括:只能转弯最多两次,且路径不能穿过其他未消除的图片。我们通过三个主要函数由简入繁地实现了这一逻辑:isStraightReach(直线)、isReach1(一弯)和 isReach2(两弯)。

直线连接检测 (isStraightReach)

这是最基础的检测。如果两个方块的 X 或 Y 坐标相同,则尝试沿该轴遍历中间的所有格子。关键在于判断中间的格子是否为“空”(即不存在图片或已被消除)。在代码逻辑中,通过 isPass() 方法判断,如果某个格子存在 track 元素或者未被占用,则认为可通过。若整条路径畅通,则返回 true。

isStraightReach : function(piece) {
    // 沿y轴方向搜索
    if (this.x == piece.x) {
        for (var i = this.min(this.y, piece.y) + 1; i < this.max(this.y, piece.y); i ++) {
            if (!this.game.pieceMap.get(piece.x + "," + i).isPass()) {
                return false; // 遇到阻碍,中断
            }
        }
        return true;
    }
    // x轴同理...略
}

拐一次弯检测 (isReach1)

当无法直线连通时,尝试寻找转折点。对于起始点 A(x1, y1) 和目标点 B(x2, y2),理论上存在两个可能的拐角点:C1(x1, y2) 和 C2(x2, y1)。算法首先验证 C1 和 C2 是否为空(可通行)。如果为空,则进一步验证 A 到 C1 以及 C1 到 B 是否都能直线连通。只要其中一个拐点满足条件,即判定为“一弯”可达。

拐两次弯检测 (isReach2)

这是最复杂的逻辑,采用了扩展扫描法。以当前点击的方块为中心,分别向上下左右四个方向发射射线。每当射线上遇到一个空格子,就递归调用或复用 isReach(包含一直线和一弯的逻辑)来判断该空格子是否能与目标点连通。一旦在任意方向上找到这样的路径,即可判定为“两弯”可达。

isReach2 : function(piece) {
    // 沿x轴正向搜索
    for (var i = this.x + 1; i < 17; i ++) {
        var target = this.game.pieceMap.get(i + "," + this.y);
        if (!target.isPass()) break; // 撞墙停止
        if (target.isReach(piece) && target.isPass()) {
            return true; // 找到一个中转点成功
        }
    }
    // 其余方向循环同上...略
}

匹配成功后的反馈与状态清理

当路径算法返回 true 后,流程进入 linkTrack。此时需要给予玩家视觉反馈:将连接路径上的所有格子(包括起点、终点及经过的中转点)的样式切换为高亮轨迹(track2)。随后使用 setTimeout 延迟 500 毫秒执行 hideTrack,清除轨迹样式并将对应的 DOM 元素从游戏中移除(或将其实体标记为空),同时增加分数。

以上就是原生JavaScript实现连连看游戏路径搜索算法与源码结构的详细内容,更多关于JavaScript游戏开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。