2048微信小程序效果

布局页面

页面结构
<view class="action_cavas" bindtouchstart="tapStart" bindtouchmove="tapMove" bindtouchend="tapEnd">
<view class="score">
<view class="title">2048</view>
<view class="scoredetail">
<view class="scoredesc">得分</view>
<view class="scorenumber">{{score}}</view>
</view>
<view class="scoredetail">
<view class="scoredesc">历史最高</view>
<view class="scorenumber">{{maxscore}}</view>
</view>
</view>
<view class="bc_cavas">
<view class="bc" wx:for="{{numbers}}" wx:for-item="row" >
<view wx:for="{{row}}" class="bc_ bc_{{item}}"> {{item}} </view>
</view>
</view>
</view>
<modal class="modal" hidden="{{modalHidden}}" bindconfirm="modalChange" bindcancel="modalCancle">
<view> 游戏结束,重新开始吗? </view>
</modal>
JS
//index.js
//获取应用实例
var app = getApp()
Page({
data: {
score: 0,
maxscore: 0,
startx: 0,
starty: 0,
endx:0,
endy:0,
direction:'',
numbers:[[0,0,2,2],[0,2,4,0],[0,4,0,0],[0,0,0,0]],
modalHidden: true,
},
onLoad: function () {
//调用API从本地缓存中获取数据
var maxscore = wx.getStorageSync('maxscore')
if(!maxscore) maxscore = 0
this.setData({
maxscore:maxscore
})
},
storeScore:function(){
console.log(this.data.maxscore, this.data.score)
if(this.data.maxscore < this.data.score){
this.setData({
maxscore:this.data.score
})
wx.setStorageSync('maxscore', this.data.maxscore)
}
},
tapStart: function(event){
this.setData({
startx: event.touches[0].pageX,
starty: event.touches[0].pageY
})
},
tapMove: function(event){
this.setData({
endx: event.touches[0].pageX,
endy: event.touches[0].pageY
})
},
tapEnd: function(event){
var heng = (this.data.endx) ? (this.data.endx - this.data.startx) : 0;
var shu = (this.data.endy) ? (this.data.endy - this.data.starty) : 0;
console.log(heng, shu);
if(Math.abs(heng) > 5 || Math.abs(shu) > 5){
var direction = (Math.abs(heng) > Math.abs(shu)) ? this.computeDir(1, heng):this.computeDir(0, shu);
this.setData({
startx:0,
starty:0,
endx:0,
endy:0
})
this.mergeAll(direction) && this.randInsert();
}
},
computeDir: function(heng, num){
if(heng) return (num > 0) ? 'right' : 'left';
return (num > 0) ? 'bottom' : 'top';
},
mergeAll: function(dir){
this.checkGame();
switch(dir){
case 'left':
return this.mergeleft();
break;
case 'right':
return this.mergeright();
break;
case 'top':
return this.mergetop();
break;
case 'bottom':
return this.mergebottom();
break;
default:
}
},
//左划
mergeleft: function(){
var change = false;
var arr = this.data.numbers;
for(var i = 0; i < 4; i++){
//merge first
for(var j = 0; j < 3; j++){
if(arr[i][j] == 0) continue;
for(var k = 1; k < 4-j; k++){
if(arr[i][j] != 0 && arr[i][j+k] != 0){
if(arr[i][j] != arr[i][j+k]) break; //不相同则直接跳过
arr[i][j] = arr[i][j] *2;
arr[i][j+k] = 0;
change = true;
this.setData({
score: this.data.score + arr[i][j]/2
})
break;
}
}
}
//movemove
for(var j = 0; j < 3; j++){
if(arr[i][j] == 0){
for(var k = 1; k < 4-j; k++){
if(arr[i][j+k] != 0){
arr[i][j] = arr[i][j+k];
arr[i][j+k] = 0;
change = true;
break;
}
}
}
}
}
this.setData({
numbers:arr
})
this.storeScore()
return change
},
//右滑
mergeright: function(){
var change = false
var arr = this.data.numbers;
for(var i = 0; i < 4; i++){
//merge first
for(var j = 3; j > 0; j--){
if(arr[i][j] == 0) continue;
for(var k = 1; k <= j; k++){
if(arr[i][j] != 0 && arr[i][j-k] != 0){
if(arr[i][j] != arr[i][j-k]) break;
arr[i][j] = arr[i][j] *2;
arr[i][j-k] = 0;
change = true;
this.setData({
score: this.data.score + arr[i][j]/2
})
break;
}
}
}
//movemove
for(var j = 3; j > 0; j--){
if(arr[i][j] == 0){
for(var k = 1; k <= j; k++){
if(arr[i][j-k] != 0){
arr[i][j] = arr[i][j-k];
arr[i][j-k] = 0;
change = true;
break;
}
}
}
}
}
this.setData({
numbers:arr
})
this.storeScore()
return change
},
//下划
mergebottom: function(){
var change = false
var arr = this.data.numbers;
for(var i = 0; i < 4; i++){
//merge first
for(var j = 3; j > 0; j--){
if(arr[j][i] == 0) continue;
for(var k = 1; k <= j; k++){
if(arr[j][i] != 0 && arr[j-k][i] != 0){
if(arr[j][i] != arr[j-k][i]) break;
arr[j][i] = arr[j][i] *2;
arr[j-k][i] = 0;
change = true
this.setData({
score: this.data.score + arr[j][i]/2
})
break;
}
}
}
//movemove
for(var j = 3; j > 0; j--){
if(arr[j][i] == 0){
for(var k = 1; k <= j; k++){
if(arr[j-k][i] != 0){
arr[j][i] = arr[j-k][i];
arr[j-k][i] = 0;
change = true
break;
}
}
}
}
}
this.setData({
numbers:arr
})
this.storeScore()
return change
},
//上滑
mergetop: function(){
var change = false
var arr = this.data.numbers;
for(var i = 0; i < 4; i++){
//merge first
for(var j = 0; j < 3; j++){
if(arr[j][i] == 0) continue;
for(var k = 1; k < 4-j; k++){
if(arr[j][i] != 0 && arr[j+k][i] != 0){
if(arr[j][i] != arr[j+k][i]) break;
arr[j][i] = arr[j][i] *2;
arr[j+k][i] = 0;
change = true
this.setData({
score: this.data.score + arr[j][i]/2
})
break;
}
}
}
//movemove
for(var j = 0; j < 3; j++){
if(arr[j][i] == 0){
for(var k = 1; k < 4-j; k++){
if(arr[j+k][i] != 0){
arr[j][i] = arr[j+k][i];
arr[j+k][i] = 0;
change = true
break;
}
}
}
}
}
this.setData({
numbers:arr
})
this.storeScore()
return change
},
//随机插入
randInsert: function(){
var arr = this.data.numbers
//随机2或4
var num = Math.random() < 0.8 ? 2 : 4
//计算随机位置
var zeros = [];
for(var i = 0; i < 4; i++){
for(var j = 0; j < 4; j++){
if(arr[i][j] == 0){
zeros.push([i, j]);
}
}
}
var position = zeros[Math.floor(Math.random() * zeros.length)];
arr[position[0]][position[1]] = num
this.setData({
numbers:arr
})
//this.checkGame()
},
checkGame: function(){
var arr = this.data.numbers
for(var i = 0; i < 4; i++){
for(var j = 0; j < 4; j++){
if(arr[i][j] == 0) return;
}
}
for(var i = 0; i < 3; i++){
for(var j = 0; j < 3; j++){
if(arr[i][j] == arr[i+1][j] || arr[i][j] == arr[i][j+1]) return;
}
}
for(var j = 0; j < 3; j++){
if(arr[3][j] == arr[3][j+1]) return;
if(arr[j][3] == arr[j+1][3]) return;
}
this.setData({
modalHidden: false,
})
},
modalChange:function(){
this.setData({
score: 0,
numbers:[[0,0,2,2],[0,2,4,0],[0,4,0,0],[0,0,0,0]],
modalHidden: true,
})
},
modalCancle:function(){
this.setData({
modalHidden: true,
})
},
})

每日分享一个小程序源码
源码地址:https://wheart.cn/so/home?m=dw&rid=7cdc5eff-d47b-11ed-96fa-52540016e6ac
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍 介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。 内容有: ①:Hub模型的方法介绍 ②:服务器端代码介绍 ③:前端vue3安装并调用后端方法 ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke() 去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on
提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信
对传统的餐饮商家来说,小程序很好地解决了餐厅线下线上连接的问题,在引流获客、节约人力、营销宣传、塑造会员体系、改善消费体验等方面都有很大帮助。小程序点餐可以帮助餐饮企业节省一大把人力开支。一个包含扫码点单、菜品管理、优惠券推送、外卖配送的小程序,商家花几万元就能完成开发测试并投入。商家为什么要开通“扫码点餐”1.解决服务员不够用的问题。2.不怕顾客跑单漏单。3.在微信就能管理菜品、查看营业额。4.订单小票显示顾客桌号和已点菜品。5.可在“附近的小程序”找到您的门店。如今餐饮业常用的三种经营模式:1堂食点单模式客人通过小程序堂食点单。商家可以在微信扫码点餐小程序管理后台根据自己店内情况来设置不同
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
快速导航(持续更新中…)Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理)Cesium源码解析二(metadataAvailability的含义)Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)Cesium源码解析四(Quantized-Mesh(.terrain)格式文件在CesiumJS和UE中加载情况的对比)目录1.前言2.本篇的由来3.terrain文件的加载3.1更新环境3.2更新和执行渲染命令3.3数据优化3.4结束当前帧4.总结1.前言 目前市场上三维比较火的实现方案主要有两种,b/s的方案主要是Cesium,c/s的方案主要是u