使用Vue做一个可自动拼图的拼图小游戏(一)
背景以及最终效果
随着几个项目的提测,也闲下来了,恰好玩了一把拼图游戏,于是突发奇想打算自己写一个试试。
在线体验
实现的功能有:
- 普通拼图的功能
- 自动拼图
本部分是这篇文章的第一部分,主要讲的是实现普通拼图的功能。
原理
相信拼图的玩法大家一点都不陌生,就是点击一个非空的块,如果它的周围有空的块,被点击的块就会往空块的方向移动。如果最后的排列是[1,2,3,4,5,6,7,8,0]
,则过关。
于是总结一下,我们需要做的事包括以下几个:
- 使用Vue
- 页面布局
- 打乱
- 点击和移动
- 判断有没有过关
具体步骤
清楚了具体要做的事,那就一件一件跟着做就好了。
使用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);
},
其中_.shuffle
是lodash
的打乱数组函数,当然不喜欢这个库的话也可以自己写一个打乱函数。
然后我们再看看效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
判断有没有过关
判断有没有过关的条件是:
- 最后一块是空
- 前面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做一个可自动拼图的拼图小游戏(一)相关推荐
- canvas+websocket+vue做一个完整的你画我猜小游戏
第一次在掘金发文章,瑟瑟发抖. 这个主要是为了学习使用一下canvas和websocket,项目地址.求star- 你画我猜大家应该都玩过,一个人画,其他人猜.目前实现了最基本的功能,慢慢修改. 项目 ...
- Vue 开发一个简略版的飞机大战小游戏
文章目录 使用 Vue 开发一个简略版的飞机大战小游戏 一.实现思路 二.所需知识点 三.实现步骤 使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,你决 ...
- 利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏
1 首先小编先打开IDLE,如下图: 2 然后这里点击菜单栏的'File',然后点击菜单"New File",如下图: 3 然后我们就在idle中新建了一个python文件,如下图 ...
- 使用Vue做一个可自动拼图的拼图小游戏(二)
背景以及最终效果 在上一篇文章中我们已经写完了一个可以正常玩的拼图小游戏,但是这还没有结束,我们还要接着试一下让拼图游戏可以自己完成拼图. 在线体验 本部分是这篇文章的第二部分,主要讲的是实现自动拼图 ...
- 整活~使用webAI做一个网页AR吃豆人小游戏
一个好习惯,先给结论 使用网页端深度学习框架识别人脸,做一个AR吃豆人小游戏.吃豆人会随着人脸在镜头内的移动而移动,吃完全部豆子即为获胜. 在线体验地址:点我预览 代码地址:点我github 本文首发 ...
- cocos creator做一个儿童数字答题的微信小游戏(1)
接了个外包要做个数字答题的微信小游戏 给小学生玩的 准备大概15天完成吧,每天抽点一两个小时做一下 今天第一天先做主界面,先用cocos creator拼一个主界面出来 下面的每个按钮都是一个butt ...
- 如何用Cocos Creator做一个胶体(果冻效果)小游戏(四)+测试收尾
一.游戏测试 测试环节是检测游戏,发现游戏缺陷的一个必不可少的环节.通过进行游戏测试能够不断发现游戏存在的问题以及可能出现的问题,寻找有效可行的解决方案,不断改进,提升游戏的质量,让游戏趋于完善. 一 ...
- 如何用Cocos Creator做一个胶体(果冻效果)小游戏(三)+JavaScript
游戏实现部分 一.游戏关卡实现 这里就只放两个关卡(其余大部分重复性,还不好看:( ),关卡设计图的草纸找不到了,就不放出来了. 初始情况下,玩家控制的胶体方块角色出现在屏幕左下角的盒子中,上方的白字 ...
- 【Unity小游戏】Unity 结合 声网音频SDK做一个《打地猫》小游戏,还可以跟好友们边聊天边撸猫~
目录
最新文章
- nginx 没有cookie_Nginx灰度升级实现说明
- 下列哪个不是目前python里的内置模块-python引入模块的五种方式与内置模块
- Android分享-微信、Facebook、Google
- 3.QT中的debug相关的函数,以及文件锁的使用
- 无法跳转 vscode_爱了爱了,这个VSCode插件将极大提高你的工mo作yu效率
- JVM调优总结(一)
- vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?
- 【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?
- Spring boot 配置tomcat后 控制台不打印SQL日志
- Android开发进阶1 思维改变 如何知道我需要学什么(上)
- 可以自动化部署吗_从自动化测试到持续部署,你需要了解这些!
- 修改linux最大文件句柄数
- VMware服务器虚拟化平台应急方案
- Q96:PT(3.2):包裹的基于噪声的纹理(Wrapped Noise-Based Textures)
- 计算机保研面试题总汇(网上搜集的题 自己写的答案)
- Vue富文本编辑器使用教程
- 宏批量替换多个word指定文字
- CSS3居中的几种方法
- 鼓励与信任让人变得强大
- 高性能Web应用程序–数据URI