微信小程序版翻牌游戏
一、新建一个quick start项目看看结构
在微信开发工具点击添加项目,选择 无appid,勾上"在当前目录中创建quick start 项目"。
二、改造index页面
<!--index.wxml-->
<view class="container"><view class="userinfo"><text class="userinfo-nickname"></text><image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image><text class="userinfo-nickname">{{userInfo.nickName}}</text><text class="userinfo-nickname">你好</text></view><view class="usermotto" ><text class="user-motto" bindtap="startGame">{{motto}}</text></view><view style="margin-top:30rpx; "><text class="user-motto" bindtap="viewScore" >查看排名</text></view>
</view>
2.index.js 文件的Page中增加两个处理点击事件的函数,用wx.navigateTo来跳转的目标页
//index.js
//获取应用实例
var app = getApp()
Page({data: {motto: '开始游戏',userInfo: {},welcome:'你好'},//事件处理函数startGame: function() {wx.navigateTo({url: '../game/game'})},viewScore: function() {wx.navigateTo({url: '../logs/logs'})},onLoad: function () {console.log('onLoad')var that = this//调用应用实例的方法获取全局数据app.getUserInfo(function(userInfo){//更新数据that.setData({userInfo:userInfo})})}
})
page{background: url('../images/gamebg.jpg') center top; }
http://pan.baidu.com/share/link?shareid=1434710849&uk=3758963053
三、游戏主界面和逻辑
{"pages":["pages/index/index","pages/logs/logs","pages/game/game" ],"window":{"backgroundTextStyle":"light","navigationBarBackgroundColor":"white","navigationBarTitleText": "微信翻牌小程序","navigationBarTextStyle":"black"}
}
data: {clickNum:0, // 点击次数useTime:0, // 游戏时间 checked:0, // 已匹配牌数allCard:allCard, // 全部卡牌数组backImage:backCardImage, // 牌背面 图片地址modalHidden: true, // 游戏完成提示是否显示firstX:-1, // 点击的第一张卡牌的坐标 firstY:-1,cards:[], // 随机挑选出来的牌 size:8 , // 界面显示的牌数=size*2clickable:false, // 当前是否可点击timer:'' // 游戏计时的定时器}
游戏初始化时随机从牌堆中挑出一些,打乱显示在界面上几秒,然后翻回去游戏正式开始.
startGame:function(){ // 开始游戏var data = this.data;var that = this;console.log('startGame');var tmp = this.data.allCard.sort(function(a,b){ return Math.random()>.5 ? -1 : 1;}).splice(0,Math.floor(data.size)); // 打乱牌堆,挑出size/2张牌tmp = tmp.concat(tmp).sort(function(a,b){ return Math.random()>.5 ? -1 : 1;}); // 牌*2,再打乱// 添加图片src和卡牌翻转状态state,存在二维数组方便展示var cards = [];var ix = -1; var iy = 0;for(var i in tmp){if( i%4 == 0){cards.push([]);ix++; iy = 0;}cards[ix].push({src:'../images/' +tmp[i]+ '.jpg',state:1 // 为1时显示图片,为0时显示牌背面});}this.data.cards = cards;this.setData({cards:cards,clickNum:0,useTime:0,checked:0,modalHidden:true,firstX:-1,clickable:false});var that = this;setTimeout(function(){that.turnAllBack(); // 所有的牌翻到背面console.log('turn all back');data.clickable = true;if(data.timer === ''){data.timer = setInterval(function(){data.useTime++;that.setData({useTime:data.useTime});},1000); // 游戏开始计时}else{that.setData({useTime:0});}},5000); // 游戏开始前先让玩家记忆几秒钟}
响应点击事件
onTap: function(event){var that = this;var data = this.data;var ix = event.currentTarget.dataset.ix; // 获取点击对象的坐标var iy = event.currentTarget.dataset.iy; console.log('onTap ' + ix + ' ' + iy);if(data.cards[ix][iy].state != 0 || !data.clickable) // 点击的不是未翻过来的牌或者现在不让点直接passreturn;that.setData({clickNum:++data.clickNum}); //点击数加1 // 1. 检测是翻过来的第几张牌if(data.firstX == -1){// 1.1 第一张修改状态为 1data.cards[ix][iy].state = 1;data.firstX = ix; data.firstY = iy; // 记下坐标that.setData({cards:data.cards}); // 通过setData让界面变化}else{// 1.2 前面已经有张牌翻过来了,先翻到正面然后看是不是一样data.cards[ix][iy].state = 1;that.setData({cards:data.cards});if(data.cards[data.firstX][data.firstY].src === data.cards[ix][iy].src){// 1.2.1.1 两张牌相同, 修改两张牌的state为2完成配对data.cards[data.firstX][data.firstY].state = 2;data.cards[ix][iy].state = 2;data.checked += 1; // 完成配对数++data.firstX = -1; // 准备下一轮匹配 // 1.2.1.2 检查是否所有牌都已经翻过来,都已翻过来提示游戏结束if(data.checked == data.size){ // 所有牌都配对成功了!this.setData({ modalHidden: false}); clearInterval(this.data.timer); // 暂停计时this.data.timer = '';this.saveScore({'time':data.useTime,'click':data.clickNum}) // 保存成绩}}else{ // 1.2.2 两张牌不同, 修改两张牌的state为 0data.cards[data.firstX][data.firstY].state = 0; data.cards[ix][iy].state = 0;data.firstX = -1;data.clickable = false;setTimeout(function(){that.setData({cards:data.cards,clickable:true});},500); //过半秒再翻回去}} console.log(this.data.cards);}
把所有牌翻到反面
turnAllBack:function(){for(var ix in this.data.cards)for(var iy in this.data.cards[ix])this.data.cards[ix][iy].state = 0;this.setData({ cards:this.data.cards });}
游戏结束时,对游戏成绩进行排名然后通过wx.getStorageSync保存到本地
saveScore:function(score){ // 保存分数var maxscore = wx.getStorageSync('maxscore');if(maxscore == undefined || maxscore == '')maxscore = [];maxscore.push(score);maxscore = maxscore.sort(function(a,b){ if(a.time < b.time )return -1;else if( a.time == b.time && a.click < b.click)return -1;else return 1;});wx.setStorageSync( 'maxscore',maxscore);}
进入页面时记得调用startGame
onLoad: function () {this.startGame();console.log(this.data.cards);}
2.界面布局
<view class="score"><view class="scoredetail"><view class="scoredesc">时间</view><view class="scorenumber">{{useTime}}</view></view><view class="scoredetail"><view class="scoredesc">点击次数</view><view class="scorenumber">{{clickNum}}</view></view>
</view>
<view class=""><view class="board" ><view class="rows" wx:for="{{cards}}" wx:for-index="idx" wx:for-item="row"><view wx:for="{{row}}" class="cols" wx:for-index="idy" wx:for-item="card" ><view class="" data-ix="{{idx}}" data-iy="{{idy}}" bindtap="onTap" ><image class="card" style="display:{{card.state == 0 ? 'none' : 'block'}}" mode="scaleToFill" src= "{{card.src}}" data-card="{{card}}"></image> <!--牌正面--><image class="card back" style="display:{{card.state != 0 ? 'none' : 'block'}}" mode="scaleToFill" src= "{{backImage}}" ></image> <!--牌背面--></view></view></view></view>
</view>
for(row in cards){for(card in row){<image>...</image>
<image>...</image>
}}
最后用model标签来弹出游戏结束时的提示, hidden属性用来控制modal是否显示,bindconfirm是点击确认时调用的方法, bindcancel是点取消时的方法, 这里点取消时我们让游戏跳转到排名页.
<modal class="modal" hidden="{{modalHidden}}" bindconfirm="modalComfirm" bindcancel="modalCancle" cancelText="查看排名"><view> 游戏结束 ,重新开始吗? </view>
</modal>
在game.js中加两个响应函数
modalComfirm:function(){this.startGame();},
modalCancle:function(){this.setData({modalHidden: true,})wx.navigateTo({url: '../logs/logs'})}
3.样式文件
.score {display: flex;font-size: 1vh;
}.scoredetail{flex: 1;height: 150rpx;background:rgba(185, 65, 189, 0.8);/*opacity: 0.6; */margin: 50rpx 20rpx 40rpx 20rpx;text-align: center;border-radius: 11rpx;
}.scoredetail:last-child{margin-right: 40rpx;
}.scoredesc{font-size: 0.9rem;line-height: 50rpx;margin-top: 10rpx;color:yellow;
}
.scorenumber{line-height: 60rpx;font-size: 1.1rem;margin-top: 5rpx;color:yellow;
}.board{margin-left: 5rpx;margin-bottom: 5rpx;
}
.rows{margin-bottom:1rpx ;padding:0rpx;text-algin:center;flex-direction:row;display:flex;
}
.cols{margin: 5rpx;
}
.card{width: 175rpx;height: 237rpx;padding:1rpx;magrin: 2rpx;
}
page{background: url('../images/gamebg.jpg') center top; }
四、最后把logs页面改造成游戏成绩页
//logs.js
Page({data: {logs: []},onLoad: function () {this.setData({logs: (wx.getStorageSync('maxscore') || [])})}
})
<!--logs.wxml-->
<view class="container log-list"><text class="log-item"> 用时 点击</text><block wx:for="{{logs}}" wx:for-item="log" wx:key="*this"><text class="log-item">{{index + 1}}. {{log.time}}秒 {{log.click}}次</text></block>
</view>
然后就大功告成啦
https://github.com/kwdhd/wxFpgame
http://blog.csdn.net/fdipzone/article/details/8630427
微信小程序版翻牌游戏相关推荐
- php 翻牌,微信小程序版翻牌小游戏的实现
这篇文章主要为大家详细介绍了微信小程序版翻牌小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了微信小程序翻牌游戏的具体代码,供大家参考,具体内容如下 一.新建一个quick ...
- 适合编程初学者的开源项目:小游戏2048(微信小程序版)
目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现. 2048游戏规则 一共16个单元格,初始时由2或者4构成. 1.手指向一个方向滑动,所有格子会向那个方向运动. 2.相同数字的两个格子 ...
- 用mpvue实现的微信小程序版cnode社区
五一放假,没出去玩,想熟悉下vue的开发流程,又想体验下mpvue,于是写了个练手项目.一个用mpvue实现的cnode微信小程序版. 代码在仓库.欢迎各位star.fork.issue.pr.目前已 ...
- 微信小程序开发的游戏《拼图游戏》
微信小程序开发的游戏<拼图游戏> 代码直接考进去就能用 pintu.js // pintu.js Page({/*** 页面的初始数据*/data: {},initGame: functi ...
- 微信小程序版博客——开发汇总总结(附源码)
花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...
- 视频直播终端开发之微信小程序版
前言 由于项目需要最近接到公司的一个研发任务,尝试开发视频直播功能,要求双方可以对讲互动,并提供微信小程序.PC.Web等版本.由于之前对流媒体技术有所积累,这个任务只要满足功能演示,因此这个任务对我 ...
- 开源leaflet地图组件的微信小程序版——leafletwx
leafletwx开源地址:leafletwx leaflet库的微信小程序版(使用小程序原生组件view+image显示瓦片,并非web-view方式) leafletwx在leaflet的基础上开 ...
- 微信小程序版QQ音乐
来源 <a href="http://www.see-source.com:80/weixinwidget/downloadZip.html?wid=161">实例源码 ...
- 微信小程序版个人博客及简历---面试加分
WeChatMiniProgram-Blog 微信小程序初体验 微信小程序版的个人博客及简历 说明: 本项目为小程序入门项目,需要一定的前端基础及一点后端知识,项目可能不太好,欢迎大家吐槽,纯萌新小白 ...
最新文章
- springboot核心原理
- c++常见操作的模板
- .net你不行——是你的父亲把你封装的太死,还是你的子孙们太懒,未把你发扬光大。...
- python是什么和c++是什么区别_c++和python的区别有哪些
- IDEA无法通过类加载器获取resources文件夹配置文件解决办法
- c#枚举数字转枚举_C#枚举能力问题和解答 套装4
- 批处理 java环境_java环境配置简单批处理方法一键OK
- html间数据传送,Express框架与html之间如何进行数据传递(示例代码)
- mfc color 亮度_双十一4K投影仪怎么选?小心别掉“亮度坑” - 电视
- mysql 导入导出 csv_mysql文件导入导出为csv格式
- 遗传优化算法优化LSTM-MSE
- Python | 股票数据可视化
- 两款强大的PC优化工具推荐,CleanMyPc与Memreduct
- R语言 时间序列arima模型
- 加速Pytorch安装的速度
- java new jsonparser_java – JSONParser无法解析为某种类型
- redis数据结构及其应用场景
- 【原创】畅言实现单点登录的设计流程和技术细节(2/2)
- connectex: No connection could be made because the target machine actively refused it.
- Ubuntu Linux 系统安装、分区规划