网页版羊了个羊 Vue3 实现

本文展示了使用Vue3开发的网页版羊了个羊游戏,包括入口界面的难度选择和主页面的游戏功能。游戏功能包括生成卡片、消除、打乱顺序等,还有计时器和排行榜。关键代码涉及卡片重叠判断和棋盘生成。完整代码可在Github和Gitee仓库找到。
摘要由CSDN通过智能技术生成

1. 成果展示

1.1 动图展示

在这里插入图片描述

1.2 主要界面展示

在这里插入图片描述
在这里插入图片描述

2. 主要功能介绍

Vue3 的羊了个羊主要有两个页面:

  • 入口界面

实现了难度选择,包括简单、苦难、复杂等,不同的难度,卡片的数量、层级不同以及侧边卡片是否存在。

  • 主页面

除了羊了个羊的基本功能(生成卡片、消除等),还实现了与手机中类似的打乱顺序功能的技能。以及排行版的功能,但这需要用到数据库或是本地缓存,亦或是本地存储,有兴趣的小伙伴可以自己在此基础上开发一下。同时,还有计时器及返回入口界面的功能。

3. 思路

css的绝对定位为基础,topy轴,leftx轴,z-index为z轴,再通过此思想用循环生成一个类型棋盘的卡片区域,在动态的生成卡片,也就是随机的将这些生成的卡片插入到棋盘中。

4. 关键代码(主要为js)

  • 判断卡片是否重叠(用于判断此卡片是否能点击,以及上层卡片消除后,下层卡片变成可点状态)
// 判断两个长方形是否重叠
export function isOverlap(sourceRect, targetRect) {
  // 先获取目标 长方形的四个顶点
  const targetList = [
    { x: targetRect.x, y: targetRect.y }, // 左上角
    { x: targetRect.x, y: targetRect.y + sheepLen }, // 左下角
    { x: targetRect.x + sheepLen, y: targetRect.y }, // 右上角
    { x: targetRect.x + sheepLen, y: targetRect.y + sheepLen }, // 右下角
  ];
  let flag = false;
  for (let index = 0; index < targetList.length; index++) {
    const element = targetList[index];
    // 判断点是否在 source 长方形内
    if (element.x >= sourceRect.xBegin && element.y >= sourceRect.yBegin) {
      if (element.x <= sourceRect.xEnd && element.y <= sourceRect.yEnd) {
        flag = true;
      }
    }
    if (flag) {
      break;
    }
  }
  return flag;
}
  • 创建游戏卡片棋盘
// 创建棋盘三维数组
// x:y轴  y:x轴 z:是否被占用
export function generateGamePiece(gameArea) {
  let pieceList = new Array();
  for (
    let yIndex = 0;
    yIndex < parseInt((gameArea.yEnd - gameArea.yBegin) / SheepPieceLen);
    yIndex++
  ) {
    pieceList[yIndex] = new Array();
    for (
      let xIndex = 0;
      xIndex < parseInt((gameArea.xEnd - gameArea.xBegin) / SheepPieceLen);
      xIndex++
    ) {
      pieceList[yIndex][xIndex] = [
        xIndex * SheepPieceLen,
        yIndex * SheepPieceLen,
        0,
      ];
    }
  }
  const pieceListInfo = {
    pieceList,
    xNum: parseInt((gameArea.xEnd - gameArea.xBegin) / SheepPieceLen),
    yNum: parseInt((gameArea.yEnd - gameArea.yBegin) / SheepPieceLen),
  };
  return pieceListInfo;
}
  • 创建每层次棋盘区域以及产生的小羊总数量
function generateGameAreaAndRandSheepNum(inlevelNum) {
  let gameAreaAndRandSheepNumList = [];
  let sheepTotal = 0; // 小羊总数(所有层次相加)
  for (let level = inlevelNum; level >= 1; level--) {
    let t = {};
    t.gameArea = {
      xBegin: gameAreaRange.xBegin + (inlevelNum - level) * inlevelNum,
      yBegin:
        gameAreaRange.yBegin +
        Math.ceil(((inlevelNum - level) * inlevelNum) / 2),
      xEnd: gameAreaRange.xEnd - (inlevelNum - level) * inlevelNum,
      yEnd:
        gameAreaRange.yEnd - Math.ceil(((inlevelNum - level) * inlevelNum) / 2),
    };
    t.gameDisc = generateGamePiece(t.gameArea);
    t.randomSheepNum = randomRangeByTimes(
      Math.ceil((t.gameDisc.xNum * t.gameDisc.yNum) / 2),
      t.gameDisc.xNum * t.gameDisc.yNum,
      3
    );
    sheepTotal += t.randomSheepNum;
    gameAreaAndRandSheepNumList[level] = t;
  }
  return { gameAreaAndRandSheepNumList, sheepTotal };
}

5. 完整代码

Github仓库
Gitee仓库

项目还存在许多不足之处,望请各位大佬指出

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

News777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值