You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

卡片配对游戏中如何实现数组内图片的匹配逻辑?

卡片配对游戏匹配逻辑实现步骤

首先调整卡片渲染代码,给每张卡片添加自定义标识属性,比直接读取src比对更稳妥,修改后的渲染代码如下:

const container = document.querySelector(".Soprano-game");
// 这里替换为你自己写的数组打乱函数的返回结果
const shuffledCards = 你的打乱函数(cardsArray);

for (let i of shuffledCards) {
  const code = `
  <div class="Soprano-card" data-name="${i.name}">
    <div class="Back-card">
      <img class="Soprano_image" src="assets/img/Characters/${i.img}" alt="Characters">
    </div>
    <div class="front-card">
      <img class="Soprano_image" src="assets/img/Sopranos-Title.jpg" alt="Sopranos-Title">
    </div>
  </div>
  `;
  container.innerHTML += code;
}

接下来实现核心匹配逻辑:

  • 首先定义全局状态变量,存储选中卡片、防止重复点击的锁
// 存储当前选中的两张卡片
let selectedCards = [];
// 点击锁,匹配判断完成前禁止点击其他卡片,避免逻辑混乱
let lockBoard = false;
  • 绑定点击事件,实现翻转、匹配判断逻辑
// 给所有卡片绑定点击事件
document.querySelectorAll('.Soprano-card').forEach(card => {
  card.addEventListener('click', flipCard);
});

// 卡片翻转逻辑
function flipCard() {
  // 面板锁住时、点击已选中的同一张卡片时直接返回不执行操作
  if (lockBoard) return;
  if (this === selectedCards[0]) return;

  // 你需要提前在CSS中写好flipped类对应的翻转动画
  this.classList.add('flipped');
  // 将当前选中的卡片存入数组
  selectedCards.push(this);

  // 选中两张卡片后触发匹配判断
  if (selectedCards.length === 2) {
    checkForMatch();
  }
}

// 匹配判断逻辑
function checkForMatch() {
  // 先锁住面板,禁止后续点击
  lockBoard = true;
  // 比对两张卡片的name标识
  const isMatch = selectedCards[0].dataset.name === selectedCards[1].dataset.name;

  isMatch ? matchSuccess() : matchFail();
}

// 匹配成功处理:移除卡片点击事件,避免重复触发
function matchSuccess() {
  selectedCards[0].removeEventListener('click', flipCard);
  selectedCards[1].removeEventListener('click', flipCard);
  resetBoard();
}

// 匹配失败处理:延迟1秒后把两张卡片翻回正面
function matchFail() {
  setTimeout(() => {
    selectedCards[0].classList.remove('flipped');
    selectedCards[1].classList.remove('flipped');
    resetBoard();
  }, 1000);
}

// 重置面板状态,方便下一次点击
function resetBoard() {
  selectedCards = [];
  lockBoard = false;
}
  • 附翻转动画参考CSS,你可以根据需求调整样式参数:
.Soprano-card {
  position: relative;
  transform-style: preserve-3d;
  transition: transform 0.5s;
  cursor: pointer;
}
.Soprano-card.flipped {
  transform: rotateY(180deg);
}
.Back-card, .front-card {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
}
.Back-card {
  transform: rotateY(180deg);
}

内容的提问来源于stack exchange,提问作者user16217445

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:36:02