背景以及最终效果

随着几个项目的提测,也闲下来了,恰好玩了一把拼图游戏,于是突发奇想打算自己写一个试试。
在线体验

实现的功能有:

  1. 普通拼图的功能
  2. 自动拼图

本部分是这篇文章的第一部分,主要讲的是实现普通拼图的功能。

原理

相信拼图的玩法大家一点都不陌生,就是点击一个非空的块,如果它的周围有空的块,被点击的块就会往空块的方向移动。如果最后的排列是[1,2,3,4,5,6,7,8,0],则过关。
于是总结一下,我们需要做的事包括以下几个:

  1. 使用Vue
  2. 页面布局
  3. 打乱
  4. 点击和移动
  5. 判断有没有过关

具体步骤

清楚了具体要做的事,那就一件一件跟着做就好了。

使用Vue

直接使用vue-cli脚手架工具安装即可。

  • 1.安装

npm install -g @vue/cli

  • 2.创建一个项目

vue create hello-world

页面布局

html

<template><div class="box"><transition-group name="cell" tag="div" class="container"><div@click.prevent="clickBlock(index)"v-for="(puzzle,index) in puzzles":key="puzzle"v-text="puzzle":class="puzzle === ''? 'cell cells':'cell'"></div></transition-group></div>
</template>

css

<style>
.box {width: 400px;margin: 60px auto 0;
}.container {display: flex;flex-wrap: wrap;width: 306px;margin-top: 10px;border: 1px solid #ccc;
}
.cell {color: #fff;font-size: 20px;display: flex;justify-content: space-around;align-items: center;width: 100px;height: 100px;margin: 1px;-moz-box-shadow: 0px 0px 3px #333333;-webkit-box-shadow: 0px 0px 3px #333333;box-shadow: 0px 0px 3px #333333;background-color: #996666;
}
.cells {background-color: #fff;-moz-box-shadow: 0px 0px 0px #333333;-webkit-box-shadow: 0px 0px 0px #333333;box-shadow: 0px 0px 0px #333333;z-index: -999;
}
.cell-move {transition: transform 0.5s;
}
</style>

有一点需要注意的是我在页面中是使用Vue的列表的排序过渡动画,效果看起来挺不错的。<transition-group> 组件有一个特殊之处。不仅可以进入和离开动画,还可以改变定位。要使用这个新功能只需了解新增的 v-move 特性,它会在元素的改变定位的过程中应用。像之前的类名一样,可以通过 name 属性来自定义前缀,也可以通过 move-class 属性手动设置。详细使用情况请看:
https://cn.vuejs.org/v2/guide/transitions.html

js部分则需要在data属性中定义一个数组,methods中需要定义一个渲染函数,mounted中则是执行这个渲染函数:

data() {return {puzzles: []};
},
rander() {this.puzzles = [1,2,3,4,5,6,7,8,'']
},
mounted() {this.rander();
}

现在我们来看一下效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4vQH8cB-1578640484937)(http://www.caomage.com/wp-content/uploads/2019/03/2-296x300.jpg)]

打乱

现在给这个拼图加个打乱的按钮。

<button @click="shuffle">重置</button>

然后在methods中定义一个‘shuffle’函数,负责打乱整个拼图:

shuffle() {this.puzzles = _.shuffle(this.puzzles);
},

其中_.shufflelodash的打乱数组函数,当然不喜欢这个库的话也可以自己写一个打乱函数。
然后我们再看看效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZYuIQuq-1578640484937)(http://www.caomage.com/wp-content/uploads/2019/03/3.gif)]

有一个需要注意的点:我们写的打乱函数打乱的拼图其实不一定都是可以复原的。能不能复原需要用专门的算法计算出来,我会在下一篇文章讲到。

点击和移动

这个地方稍微复杂一点,具体过程就是当点击某个块的时候获取点击快上下左右的值,如果空白块在点击快的左边,并且点击快不是此列的第一个,则点击块往左侧和空白块交换位置,其实是交换值。
具体的代码如下:

// 点击方块
clickBlock(index) {let curIndex = this.puzzles[index];let leftIndex = this.puzzles[index - 1];let rightIndex = this.puzzles[index + 1];let topIndex = this.puzzles[index - 3];let bottomIndex = this.puzzles[index + 3];if (leftIndex === '' && index % 3) {this.$set(this.puzzles, index - 1, curIndex);this.$set(this.puzzles, index, '');} else if (rightIndex === '' && 2 !== index % 3) {this.$set(this.puzzles, index + 1, curIndex);this.$set(this.puzzles, index, '');} else if (topIndex === '') {this.$set(this.puzzles, index - 3, curIndex);this.$set(this.puzzles, index, '');} else if (bottomIndex === '') {this.$set(this.puzzles, index + 3, curIndex);this.$set(this.puzzles, index, '');}
}

可以点击之后再来看看效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kXTAey7-1578640484938)(http://www.caomage.com/wp-content/uploads/2019/03/4.gif)]

判断有没有过关

判断有没有过关的条件是:

  1. 最后一块是空
  2. 前面8个是从1-8顺序排列
pass() {if (this.puzzles[8] === '') {const newPuzzles = this.puzzles.slice(0, 8);const isPass = newPuzzles.every((e, i) => e === i + 1);if (isPass) {alert('666!');}}
}

看看最终的效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsqdGWxz-1578640484938)(http://www.caomage.com/wp-content/uploads/2019/03/5.gif)]
caomage的个人主页
项目源码:https://github.com/usecodelee/Vue-jigsawPuzzle

使用Vue做一个可自动拼图的拼图小游戏(一)相关推荐

  1. canvas+websocket+vue做一个完整的你画我猜小游戏

    第一次在掘金发文章,瑟瑟发抖. 这个主要是为了学习使用一下canvas和websocket,项目地址.求star- 你画我猜大家应该都玩过,一个人画,其他人猜.目前实现了最基本的功能,慢慢修改. 项目 ...

  2. Vue 开发一个简略版的飞机大战小游戏

    文章目录 使用 Vue 开发一个简略版的飞机大战小游戏 一.实现思路 二.所需知识点 三.实现步骤 使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,你决 ...

  3. 利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏

    1 首先小编先打开IDLE,如下图: 2 然后这里点击菜单栏的'File',然后点击菜单"New File",如下图: 3 然后我们就在idle中新建了一个python文件,如下图 ...

  4. 使用Vue做一个可自动拼图的拼图小游戏(二)

    背景以及最终效果 在上一篇文章中我们已经写完了一个可以正常玩的拼图小游戏,但是这还没有结束,我们还要接着试一下让拼图游戏可以自己完成拼图. 在线体验 本部分是这篇文章的第二部分,主要讲的是实现自动拼图 ...

  5. 整活~使用webAI做一个网页AR吃豆人小游戏

    一个好习惯,先给结论 使用网页端深度学习框架识别人脸,做一个AR吃豆人小游戏.吃豆人会随着人脸在镜头内的移动而移动,吃完全部豆子即为获胜. 在线体验地址:点我预览 代码地址:点我github 本文首发 ...

  6. cocos creator做一个儿童数字答题的微信小游戏(1)

    接了个外包要做个数字答题的微信小游戏 给小学生玩的 准备大概15天完成吧,每天抽点一两个小时做一下 今天第一天先做主界面,先用cocos creator拼一个主界面出来 下面的每个按钮都是一个butt ...

  7. 如何用Cocos Creator做一个胶体(果冻效果)小游戏(四)+测试收尾

    一.游戏测试 测试环节是检测游戏,发现游戏缺陷的一个必不可少的环节.通过进行游戏测试能够不断发现游戏存在的问题以及可能出现的问题,寻找有效可行的解决方案,不断改进,提升游戏的质量,让游戏趋于完善. 一 ...

  8. 如何用Cocos Creator做一个胶体(果冻效果)小游戏(三)+JavaScript

    游戏实现部分 一.游戏关卡实现 这里就只放两个关卡(其余大部分重复性,还不好看:( ),关卡设计图的草纸找不到了,就不放出来了. 初始情况下,玩家控制的胶体方块角色出现在屏幕左下角的盒子中,上方的白字 ...

  9. 【Unity小游戏】Unity 结合 声网音频SDK做一个《打地猫》小游戏,还可以跟好友们边聊天边撸猫~

    目录

最新文章

  1. nginx 没有cookie_Nginx灰度升级实现说明
  2. 下列哪个不是目前python里的内置模块-python引入模块的五种方式与内置模块
  3. Android分享-微信、Facebook、Google
  4. 3.QT中的debug相关的函数,以及文件锁的使用
  5. 无法跳转 vscode_爱了爱了,这个VSCode插件将极大提高你的工mo作yu效率
  6. JVM调优总结(一)
  7. vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?
  8. 【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?
  9. Spring boot 配置tomcat后 控制台不打印SQL日志
  10. Android开发进阶1 思维改变 如何知道我需要学什么(上)
  11. 可以自动化部署吗_从自动化测试到持续部署,你需要了解这些!
  12. 修改linux最大文件句柄数
  13. VMware服务器虚拟化平台应急方案
  14. Q96:PT(3.2):包裹的基于噪声的纹理(Wrapped Noise-Based Textures)
  15. 计算机保研面试题总汇(网上搜集的题 自己写的答案)
  16. Vue富文本编辑器使用教程
  17. 宏批量替换多个word指定文字
  18. CSS3居中的几种方法
  19. 鼓励与信任让人变得强大
  20. 高性能Web应用程序–数据URI

热门文章

  1. 使用react-native-audio进行华为云语音交互服务(实时语音转写)大致流程
  2. 新媒体运营必备工具推荐,助力高效运营输出爆款
  3. echarts柱状图横向 名字过长时显示省略号
  4. H5手机录像并获取录像内容转base64
  5. 神机也有软肋 小米手机
  6. 【机器人领域几大国际会议】
  7. debug版没有问题而release版本无法运行的问题
  8. 原创:千兆光模块和百兆光收发器的兼容问题
  9. 男人是瑜伽服的下一个风口?这家公司靠他们拯救了股价
  10. 强缓存和弱缓存是什么