使用vue.js编写蓝色拼图小游戏

发布时间 - 2026-01-11 00:13:42    点击率:

之前在网上看到《蓝色拼图》这款小游戏,作者是用jquery写的。于是便考虑能不能用vue.js优雅简单的编写出来呢?

Later equals never!说干就干。首先理解游戏的规则:第一关为1*1的方块,第二关为2*2以此类推

该图为第三关3*3的方块。点击一个小方块,该方块和它相邻的方块的的颜色会从黄色变为蓝色,全部变为蓝色就过关了。

现在规则清楚了,开动吧!

/*style*/
.game_bg{
background: #333;
width: 600px;
height: 600px;
margin: 30px auto;
border-radius: 3px;
}
.card{
background: #E6AB5E;
float: left;
margin: 6px 0 0 6px;
}
.blueCard{
background: #5C90FF;
}
/*html*/
<div id="game">
<div class='game_bg'>
<div></div>
</div>
</div>
/*js*/
var vm=ew Vue({
el:'#game',
data:{
margin:6,//每张卡片间的距离
level:1,//游戏等级
cards:[],//卡片
size:0,//每张卡片的尺寸
},
methods:{},
});

卡片数为等级的平方,而每张卡片有黄色和蓝色两种颜色,并且随着游戏难度的升级,方块间的距离也在变小。所以在vue构造函数中添加初始化游戏方法

initGame:function(){//初始化游戏函数
if(this.level<4){
this.margin=12;
}else if(this.level<8){
this.margin=6;
}else if(this.level<16){
this.margin=3;
}else{
this.margin=1;
}
this.cards=[];
this.size=(600-(this.level+1)*this.margin)/this.level;
for(var i=this.level*this.level;i--;){
this.cards.push({
color:false,//false是黄色,true是蓝色
})
}
}

<div class='game_bg'></div>中的div进行数据绑定

<div class='card'
:style="{'width':size+'px','height':size+'px','marginTop':margin+'px','marginLeft':margin+'px'}" 
:class="{'blueCard':card.color}" v-for="(index,card) in cards"></div>
</div>

 接下来就是点击一个方块进行翻牌的方法。它本身和相邻的卡片的color属性取反就行了。而我们注意到:位于该卡片左边的是下标减1;右边的是下标加1;上面的是下标减等级;下面的下标加等级。要注意的vm.cards下标不存在的时候和在最左边或最右边时虽然下标有可能存在但是相邻的卡片是可能没有的。所以加了一个改变相邻区域的颜色的方法和在methods中加了一个翻牌子的方法

var changeNeighbor=function(index){
var cards=vm.cards;
if(index>0){//左边
if(index%vm.level){//不在最左边
cards[index-1].color=!cards[index-1].color;
}
}
if(index<cards.length-1){//右边
if((index+1)%vm.level){//不在最右边
cards[index+1].color=!cards[index+1].color;
}
}
if(index-vm.level>=0){//上面
cards[index-vm.level].color=!cards[index-vm.level].color;
}
if(index+vm.level<cards.length){//下面
cards[index+vm.level].color=!cards[index+vm.level].color;
}
}
/*********************************************************/
flop:function(index){//翻牌
this.cards[index].color=!this.cards[index].color;
changeNeighbor(index);
}

每次点击后都要判断本关游戏是否结束。遍历vm.cards。发现如果存在color属性为false的就是没有过关,反之则关过。

var gameOver=function(){
var cards=vm.cards;
for(var i=cards.length;i--;){
if(!cards[i].color) return false;
}
return true
};

这样游戏基本的功能就实现了。然后再加上过关之后将等级提高1。并且将等级存到localStorage中。每次进入页面都去localStorage中查询等级。过关之后给个提示。将点击的步骤数显现出来。加上重置本轮和重置等级的方法。在细节上进行一些修改和增加最后的代码就是这样

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.game_bg{
background: #333;
width: 600px;
height: 600px;
margin: 30px auto;
border-radius: 3px;
}
.card{
background: #E6AB5E;
float: left;
margin: 6px 0 0 6px;
}
.blueCard{
background: #5C90FF;
}
.btn_box{
text-align: center;
}
.info_box{
text-align: center;
}
.info_box span{
padding: 20px;
}
.rule_box{
width: 300px;
position: fixed;
top: 100px;
left: 50px;
color: #333;
}
h1{
margin: 0;
text-align: center;
font-size: 28px;
margin-bottom: 10px;
}
</style>
</body>
<h1>翻牌子游戏</h1>
<div id="game">
<div class="info_box">
<span v-text="'第'+level+'关'"></span>
<span v-text="'点击'+stepCount+'次'"></span>
</div>
<div class='game_bg'>
<div class='card' @click="flop(index)"
:style="{'width':size+'px','height':size+'px','marginTop':margin+'px','marginLeft':margin+'px'}" 
:class="{'blueCard':card.color}" v-for="(index,card) in cards"></div>
</div>
<div class="rule_box">
<h3>游戏规则</h3>
<h4>点击相应的方块该方块和它相邻的方块的的颜色会发生变化,全部变为蓝色就过关了</h4>
</div>
<div class="btn_box">
<button @click="resetLevel">重置等级</button>
<button @click="initGame">重新开始本轮</button>
</div>
</div>
<script src="vue/Vue.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
/**
* 该函数用来改变点击的卡片相邻卡片的颜色
* 位于该卡片左边的是下标减1;右边的是下标加1;上面的是下标减等级;下面的下标加等级
*/
var changeNeighbor=function(index){
var cards=vm.cards;
if(index>0){//左边
if(index%vm.level){//不在最左边
cards[index-1].color=!cards[index-1].color;
}
}
if(index<cards.length-1){//右边
if((index+1)%vm.level){//不在最右边
cards[index+1].color=!cards[index+1].color;
}
}
if(index-vm.level>=0){//上面
cards[index-vm.level].color=!cards[index-vm.level].color;
}
if(index+vm.level<cards.length){//下面
cards[index+vm.level].color=!cards[index+vm.level].color;
}
}
/**
*该函数用来判断游戏是否结束 
*/
var gameOver=function(){
var cards=vm.cards;
for(var i=cards.length;i--;){
if(!cards[i].color) return false;
}
setLevel(vm.level+1);
vm.stepCount=0;
return true
};
/**
* 将等级储存止本地
*/
var setLevel=function(level){
localStorage.cardLevel=level;
};
/**
* 得到本地的等级
*/
var getLevel=function(){
if(localStorage.cardLevel) return localStorage.cardLevel*1;
return 0;
};
/**
* 构建vue构造函数
*/
var vm=new Vue({
el:'#game',
data:{
margin:6,//每张卡片间的距离
level:1,//游戏等级
cards:[],//卡片
size:0,//每张卡片的尺寸
stepCount:0,//每轮点击的次数
},
methods:{
initGame:function(){//初始化游戏函数
var level=getLevel();
if(level){
this.level=level;
}
if(this.level<4){
this.margin=12;
}else if(this.level<8){
this.margin=6;
}else if(this.level<16){
this.margin=3;
}else{
this.margin=1;
}
this.cards=[];
this.size=(600-(this.level+1)*this.margin)/this.level;
for(var i=this.level*this.level;i--;){
this.cards.push({
color:false,//false是黄色,true是蓝色
})
}
},
flop:function(index){//翻牌
this.stepCount++;
this.cards[index].color=!this.cards[index].color;
changeNeighbor(index);
if(gameOver()){
setTimeout(function(){
alert('恭喜通过第'+vm.level+'关');
vm.level++;
vm.initGame();
},200)
}
},
resetLevel:function(){//重置等级
this.level=1;
localStorage.cardLevel=1;
vm.initGame();
},
},
});
vm.initGame();
</script>
</html>

别忘了加上vue2.0。就可以玩了。


以上所述是小编给大家介绍的vue.js编写蓝色拼图小游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# vue  # js  # 小游戏  # 使用vue编写一个点击数字计时小游戏  # Vue实现开心消消乐游戏算法  # 基于Vue.js实现数字拼图游戏  # vue实现打地鼠小游戏  # 如何利用vue3实现一个俄罗斯方块  # 的是  # 关了  # 小编  # 本轮  # 游戏等级  # 都要  # 有可能  # 在此  # 也在  # 两种  # 遍历  # 这款  # 以此类推  # 再加上  # 要注意  # 注意到  # 给大家  # 不存在  # 后将  # 别忘了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么判断请求类型_Laravel Request isMethod用法  如何快速查询网站的真实建站时间?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  香港服务器租用费用高吗?如何避免常见误区?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何正确选择百度移动适配建站域名?  如何快速搭建高效可靠的建站解决方案?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何处理表单验证?(Requests代码示例)  如何构建满足综合性能需求的优质建站方案?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在IIS管理器中快速创建并配置网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  JavaScript模板引擎Template.js使用详解  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  北京的网站制作公司有哪些,哪个视频网站最好?  七夕网站制作视频,七夕大促活动怎么报名?  如何获取免费开源的自助建站系统源码?  Laravel Session怎么存储_Laravel Session驱动配置详解  免费视频制作网站,更新又快又好的免费电影网站?  Android okhttputils现在进度显示实例代码  如何在腾讯云免费申请建站?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Laravel如何创建自定义中间件?(Middleware代码示例)  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在IIS7中新建站点?详细步骤解析  如何快速搭建自助建站会员专属系统?  中国移动官方网站首页入口 中国移动官网网页登录  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何发送系统通知?(Notification渠道示例)  Python面向对象测试方法_mock解析【教程】  Laravel PHP版本要求一览_Laravel各版本环境要求对照  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何续费美橙建站之星域名及服务?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  如何确保西部建站助手FTP传输的安全性?  使用spring连接及操作mongodb3.0实例  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  想要更高端的建设网站,这些原则一定要坚持!  深圳网站制作的公司有哪些,dido官方网站?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】