vue制作翻牌配对小游戏

简友们,好久不见。最近一直忙于工作没时间来为大家分享经验,刚好上周为联*做了一个七夕活动,是vue做的一个翻牌配对小游戏,上线后吸引了无数广大好友前来挑战。也有好友问我这游戏制作难不难呢,可不可以分享一下呢。当然可以,今天它来了!

首先让大家看下最后效果图:
gif4.gif

简单介绍一下,开始游戏之后开始点击卡片进行翻转,在点击第二张卡片时去判断是否和第一张配对,如果配对成功直接用动画隐掉这两张,如果失败在点击第三张时让前两张翻转过去...以此类推

接下来先看页面布局部分:

      <ul class="gameTab father">
          <li
            :class="isRotate ? 'rotate' : ''"
            v-for="img in imgs"
            :key="img.id"
            @click="flip(img)"  
            ref="card"
          >
            <img :src="img.img" class="card front"  ref="cardz" />    <!-- 卡片正面图片  -->
            <div class="card back" ref="cardf"></div>         <!-- 卡片背面背景  -->
          </li>
        </ul>
// css部分:
// 消失动画
@keyframes vanish {
  0% {
    transform: rotate(0deg) scale(1);
    opacity: 1;
  }
  100% {
    transform: rotate(360deg) scale(0);
    opacity: 0;
  }
}
.gameTab {
        display: flex;
        justify-content: space-between;
        flex-wrap: wrap;
        width: 95%;
        margin: 20px auto 20px auto;
        .rotate {
          animation: vanish 0.5s forwards;
        }
        li {
          width: 24%;
          height: 150px;
          margin: 2px;
          position: relative;
          cursor: pointer;
          perspective: 800px;
          .card {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            color: #fff;
            line-height: 130px;
            text-align: center;
            cursor: pointer;
            transition: 0.3s ease-in-out;
            backface-visibility: hidden;
            -webkit-backface-visibility: hidden;
          }

          .front {
            background-color: #3949c0;
            z-index: 2;
            transform: rotateY(-180deg);
          }
          .back {
            background: url('./../assets/img/peidui.png') no-repeat;
            background-size: 100% 100%;
            z-index: 1;
            transform: rotateY(0);
          }
        }
      }

在这里我们可以看到布局其实很简单,用ul>li 以及vue的v-for循环来进行卡片的布局。动态设置的class样式是卡片消失的动画,样式也是简单的布局设置。
接下来看图片的json数据:

imgs: [
        {
          id: 1,
          img: require("./../assets/img/男1.png"),
          is_sign: 1,
        },
        {
          id: 2,
          img: require("./../assets/img/男2.png"),
          is_sign: 2,
        },
        {
          id: 3,
          img: require("./../assets/img/男3.png"),
          is_sign: 3,
        },
        {
          id: 4,
          img: require("./../assets/img/男4.png"),
          is_sign: 4,
        },
        {
          id: 5,
          img: require("./../assets/img/男5.png"),
          is_sign: 5,
        },
        {
          id: 6,
          img: require("./../assets/img/男6.png"),
          is_sign: 6,
        },
        {
          id: 7,
          img: require("./../assets/img/男7.png"),
          is_sign: 7,
        },
        {
          id: 8,
          img: require("./../assets/img/男8.png"),
          is_sign: 8,
        },
        {
          id: 9,
          img: require("./../assets/img/男9.png"),
          is_sign: 9,
        },
        {
          id: 10,
          img: require("./../assets/img/男10.png"),
          is_sign: 10,
        },
        {
          id: 11,
          img: require("./../assets/img/女1.png"),
          is_sign: 1,
        },
        {
          id: 12,
          img: require("./../assets/img/女2.png"),
          is_sign: 2,
        },
        {
          id: 13,
          img: require("./../assets/img/女3.png"),
          is_sign: 3,
        },
        {
          id: 14,
          img: require("./../assets/img/女4.png"),
          is_sign: 4,
        },
        {
          id: 15,
          img: require("./../assets/img/女5.png"),
          is_sign: 5,
        },
        {
          id: 16,
          img: require("./../assets/img/女6.png"),
          is_sign: 6,
        },
        {
          id: 17,
          img: require("./../assets/img/女7.png"),
          is_sign: 7,
        },
        {
          id: 18,
          img: require("./../assets/img/女8.png"),
          is_sign: 8,
        },
        {
          id: 19,
          img: require("./../assets/img/女9.png"),
          is_sign: 9,
        },
        {
          id: 20,
          img: require("./../assets/img/女10.png"),
          is_sign: 10,
        },
      ],

这里用is_sign来代表各张图片,后续可判断is_sign是否一致来判断是否配对成功。

// 随机图片位置
    randomRender() {
      let imgs = this.imgs,
        results = [];
      results = imgs.sort(() => {
        return Math.random() > 0.5 ? -1 : 1;
      });
      this.imgs = results;
    },

图片数据定好之后,我们初始随机图片位置,确保每次游戏的图片位置不一样。
点击卡片事件代码如下(讲解在每一步的注释中):

// 点击翻牌
    flip(img) {
        // 判断是否点击开始游戏
      if (this.isStar) {
        // 初始在data中定义空数组 ids;
        // 判断是否连续点击相同的牌 不同时添加到数组中
        if (img !== this.ids[0]) {
          // 翻转卡片
          this.$refs.cardz[img.id - 1].style.transform = "rotateY(0)";
          this.$refs.cardf[img.id - 1].style.transform = "rotateY(180deg)";
          this.ids.push(img);
        }
       // 当已经存进两张卡片时,去判断两张是否配对,如配对成功就将两张卡片消失,并记录一次
        if (this.ids.length == 2) {
          if (this.ids[0].is_sign === this.ids[1].is_sign) {
            for (let i = 0; i < this.ids.length; i++) {
              this.$refs.card[this.ids[i].id - 1].className = "rotate";
            }
            this.ids.splice(0, 2);
            // 配对成功记录一次  当success = 10 时 挑战成功
            this.success++;
            if (this.success == 10) {
              clearInterval(this.timer);
              // 游戏成功 关闭计时器 展示成功弹窗
            }
          }
        } else if (this.ids.length > 2) {
       // 若前两张未配对成功 当翻开三张牌时 让前两张翻过去 并将数组中这俩卡片数据删除
          let x = this.ids.find((value, index, arr) => {
            if (index < 2) {
              return arr[index] == img;
            }
          });
          if (x == undefined) {
            for (let i = 0; i < this.ids.length - 1; i++) {
              this.$refs.cardz[this.ids[i].id - 1].style.transform =
                "rotateY(180deg)";
              this.$refs.cardf[this.ids[i].id - 1].style.transform =
                "rotateY(0)";
            }
            this.ids.splice(0, 2);
          } else {
            this.ids.splice(this.ids.length - 1, 1);
          }
        }
      } else {
        Toast("请点击开始游戏");
      }
   }

代码每一步的具体思路讲解在代码中的注释里(想的是根据代码来讲解每一步可能会更清楚一点 -.-!!)
逻辑其实很简单,就是判断点击的两张是否配对,成则消失败则回翻。
游戏代码大致就是这样啦~
如果有不懂的可以评论说出你的疑问哦~或者你有更好的见解也可以共同研究研究哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353