当前位置:首页 > JavaScript

js 实现拼图

2026-04-05 10:06:59JavaScript

实现拼图游戏的步骤

使用JavaScript实现拼图游戏可以通过HTML5的Canvas或DOM操作完成。以下是基于DOM的实现方法。

初始化拼图棋盘

创建HTML结构,包含一个容器和拼图块。拼图块使用绝对定位,通过CSS控制样式。

<div id="puzzle-container">
  <div class="tile" data-index="1">1</div>
  <div class="tile" data-index="2">2</div>
  <!-- 更多拼图块 -->
</div>
#puzzle-container {
  position: relative;
  width: 300px;
  height: 300px;
}
.tile {
  position: absolute;
  width: 100px;
  height: 100px;
  border: 1px solid black;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

随机排列拼图块

使用Fisher-Yates洗牌算法随机排列拼图块的位置。

function shuffleTiles() {
  const tiles = Array.from(document.querySelectorAll('.tile'));
  const positions = tiles.map((_, index) => index);

  for (let i = positions.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [positions[i], positions[j]] = [positions[j], positions[i]];
  }

  tiles.forEach((tile, index) => {
    const row = Math.floor(positions[index] / 3);
    const col = positions[index] % 3;
    tile.style.top = `${row * 100}px`;
    tile.style.left = `${col * 100}px`;
  });
}

处理拼图块点击事件

检查点击的拼图块是否与空白块相邻,如果是则交换位置。

function handleTileClick(event) {
  const tile = event.target;
  const tileIndex = parseInt(tile.dataset.index);
  const tileRect = tile.getBoundingClientRect();
  const emptyTile = document.querySelector('.empty');

  if (isAdjacent(tile, emptyTile)) {
    swapTiles(tile, emptyTile);
    checkWin();
  }
}

function isAdjacent(tile1, tile2) {
  const rect1 = tile1.getBoundingClientRect();
  const rect2 = tile2.getBoundingClientRect();
  return (
    (Math.abs(rect1.left - rect2.left) === 100 && rect1.top === rect2.top) ||
    (Math.abs(rect1.top - rect2.top) === 100 && rect1.left === rect2.left)
  );
}

交换拼图块位置

更新拼图块的CSS位置属性以实现交换效果。

function swapTiles(tile1, tile2) {
  const tempTop = tile1.style.top;
  const tempLeft = tile1.style.left;

  tile1.style.top = tile2.style.top;
  tile1.style.left = tile2.style.left;

  tile2.style.top = tempTop;
  tile2.style.left = tempLeft;
}

检查游戏是否胜利

比较当前拼图块位置与胜利状态是否一致。

function checkWin() {
  const tiles = Array.from(document.querySelectorAll('.tile:not(.empty)'));
  const isWin = tiles.every(tile => {
    const currentPos = parseInt(tile.style.top) / 100 * 3 + parseInt(tile.style.left) / 100;
    return currentPos === parseInt(tile.dataset.index) - 1;
  });

  if (isWin) {
    alert('恭喜你赢了!');
  }
}

完整初始化函数

将所有功能整合到初始化函数中。

function initPuzzle() {
  shuffleTiles();
  document.querySelectorAll('.tile').forEach(tile => {
    tile.addEventListener('click', handleTileClick);
  });
}

window.onload = initPuzzle;

进阶功能

添加空白块标记和动画效果提升用户体验。

js 实现拼图

// 在shuffleTiles函数中标记空白块
const emptyIndex = positions.indexOf(8); // 假设第9块是空白
tiles[emptyIndex].classList.add('empty');
tiles[emptyIndex].style.visibility = 'hidden';

// 添加CSS过渡效果
.tile {
  transition: all 0.3s ease;
}

以上代码实现了一个基本的3x3拼图游戏,可根据需要扩展为不同尺寸或添加更多功能。

标签: 拼图js
分享给朋友:

相关文章

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…