微信小程序-开发实战(二)
刚刚写了小程序入门没几天,小程序就开放个人开发者资格,感觉为我而来啊 \(≧▽≦)/。迫不及待的去注册,准备将之前的处女作传上去体验一把,结果卡在了服务器配置上:免费的果然不靠谱/(ㄒoㄒ)/~~,后来尝试用个人服务器转发代理请求,发现不支持http,必须https!必须https!必须https!
好不容易做的项目不能上线,感觉心被掏空了,这种憋屈大家懂得~,于是不甘寂寞的我,准备做个不需要请求的单机版,就是这么机智(*^__^*) 嘻嘻……文末高能,慎入~
接下来我们开始动手吧,之前做过类似连连看,这次准备尝试做个小程序扫雷,来个最终效果图,先睹为快吧
因为有了上一节入门基础,这一节就讲的快一点,如果有什么不太理解的,可以去看我的上一篇文章《微信小程序-开发入门(一)》
一、初始化项目
主要包括:设置app.js、app.json和app.wxss三个文件,建立pages文件结构
//app.js,将游戏配置文件放在APP中,可实现跨页之间共享 App({row:12,//扫雷游戏的行数column:8,//扫雷游戏的列数bomb:8//包含雷的总数 })
二、游戏页面逻辑
重点在首页游戏逻辑的处理,因为小程序以数据为驱动,无法操作dom,所以很多实现最终要落实到数据上,查看如下index.js
//index.js Page({data: {dialog_warn:false,//通过修改此数据值,改变弹框的显示状态dialog_suc:false, //游戏成功,设为true,视图层通过wx:if来判断是否渲染该弹窗count:null,//翻牌计数,初始值为app.row*app.columngamearr:[]//游戏地图的基础数据(二维数组),根据此来生成游戏 } })
<!--index.wxml--> <view class="dialog warn" wx:if="{{dialog_warn}}"><icon type="warn" size="60" color="orange"></icon><text>Game Over</text><button bindtap="reset">重新开始</button> </view> <view class="dialog success" wx:if="{{dialog_suc}}"><icon type="success" size="60" color="green"></icon><text>Success~</text><button bindtap="reset">重新开始</button> </view>
根据app.js中的数据,生成游戏地图数据:gamearr
setgamearr:function(row,column,bomb){//根据行列设置游戏二维数组(地图)var that=this;var arrmap=[];//二维初始数组,全为空for(var i=row-1;i>=0;i--){arrmap[i]=[];for(var j=column-1;j>=0;j--){arrmap[i][j]={val:"",cover:true};}//val用来记录周边雷的数量,cover用来记录是否翻开:无dom操作只能用数据记录状态}var arr=[];//一维自然数for(var k=row*column-1;k>=0;k--){arr[k]=k}//随机炸弹位置for(var h=bomb-1;h>=0;h--){var seat=arr.splice(Math.floor(Math.random()*arr.length),1)[0]var r=Math.floor(seat/column),c=Math.floor(seat%column);//console.log(seat+'\n'+r+","+c);arrmap[r][c].val="B";arrmap=that.addcount(r,c,arrmap)//给炸弹周围九宫格增加标记数 }that.setData({gamearr:arrmap})},
给炸弹周围九宫格增加标记数
addcount:function(r,c,arrmap){var that=this;if(r-1>=0){//九宫格上三个if(c-1>=0 && arrmap[r-1][c-1].val!="B"){arrmap[r-1][c-1].val++}if(arrmap[r-1][c].val!="B"){arrmap[r-1][c].val++}if(c+1<app.column && arrmap[r-1][c+1].val!="B"){arrmap[r-1][c+1].val++}}if(r+1<app.row){//九宫格下三个if(c-1>=0 && arrmap[r+1][c-1].val!="B"){arrmap[r+1][c-1].val++}if(arrmap[r+1][c].val!="B"){arrmap[r+1][c].val++}if(c+1<app.column && arrmap[r+1][c+1].val!="B"){arrmap[r+1][c+1].val++}}//九宫格左右两个if(c-1>=0 && arrmap[r][c-1].val!="B"){arrmap[r][c-1].val++}if(c+1<app.column && arrmap[r][c+1].val!="B"){arrmap[r][c+1].val++}return arrmap;}
生成数据后,根据数据生成页面视图
<view class="game"><view class="tr" wx:for="{{gamearr}}" wx:for-index="row" wx:for-item="itemrow"><!--根据数据遍历行--><view class="td" wx:for="{{itemrow}}" wx:for-index="column" wx:for-item="itemcolumn" data-row="{{row}}" data-column="{{column}}" bindtap="taphandler"><view class="mask" wx:if="{{itemcolumn.cover}}"></view><!--遮罩层,无法用伪元素before来更改状态,只能数据来判断了--><text wx:if="{{itemcolumn.val==''}}">{{itemcolumn.val}}</text><!--根据数值显示不同样式,如果是web能用jquery选择器就简单多了,这里略显复杂--><text class="color1" wx:elif="{{itemcolumn.val==1}}">{{itemcolumn.val}}</text><text class="color2" wx:elif="{{itemcolumn.val==2}}">{{itemcolumn.val}}</text><text class="color3" wx:else>{{itemcolumn.val}}</text></view></view></view>
游戏控制部分,单元格tap事件
//游戏控制部分taphandler:function(e){var that=this;var r=e.currentTarget.dataset.row,c=e.currentTarget.dataset.column;//无法想jquery获得index,只能用数据记录,直接获取喽if(that.data.gamearr[r][c].val!="B"){//如果没点到炸弹that.data.gamearr[r][c].cover=false;that.data.count--;that.setData({count:that.data.count})if(that.data.count==app.bomb){that.setData({dialog_suc:true})}//当剩余单元格计数等于雷数,游戏胜利if(that.data.gamearr[r][c].val==""){//如果点到的是空,将它周围的四个打开that.data.gamearr=that.show4(r,c,that.data.gamearr)// that.data.gamearr=that.show9(r,c,that.data.gamearr)//原先考虑九点,结果递归直接栈溢出了,(⊙﹏⊙)b }console.log(that.data.count)}else{that.setData({dialog_warn:true})}//点到了雷,游戏结束 that.setData({gamearr:that.data.gamearr})}
如果点击为空,将它周围四个翻牌,并进行递归操作
show4:function(r,c,arrmap){//显示周边的4点var that=this;if(r-1>=0 && arrmap[r-1][c].val==""){//上if(arrmap[r-1][c].cover){arrmap[r-1][c].cover=false;that.data.count--;that.setData({count:that.data.count})that.show4(r-1,c,arrmap)//递归 }}if(r+1<app.row && arrmap[r+1][c].val==""){//下if(arrmap[r+1][c].cover){arrmap[r+1][c].cover=false;that.data.count--;that.setData({count:that.data.count})that.show4(r+1,c,arrmap)//递归 }}if(c-1>=0 && arrmap[r][c-1].val==""){//左if(arrmap[r][c-1].cover){arrmap[r][c-1].cover=false;that.data.count--;that.setData({count:that.data.count})that.show4(r,c-1,arrmap)//递归 }}if(c+1<app.column && arrmap[r][c+1].val==""){//右if(arrmap[r][c+1].cover){arrmap[r][c+1].cover=false;that.data.count--;that.setData({count:that.data.count})that.show4(r,c+1,arrmap)//递归 }}return arrmap;}
三、游戏设置
游戏设置就相对简单了,直接读取app.js的数据为设置页的数据,操作修改则修改app数据,然后切换回游戏页面onshow获取更新后的数据重新生成游戏
// pages/set/set.js var app = getApp(); Page({data:{row:app.row,column:app.column,bomb:app.bomb},//游戏设置部分,修改设置将重新生成游戏rowChange:function(e){app.row=e.detail.value;},columnChange:function(e){app.column=e.detail.value;},bombChange:function(e){app.bomb=e.detail.value;} })
四、总结
做完了发布上传的时候才发现,小程序的分类里面没有游戏,更多的是工具应用类,不知道小程序以后会不会放开服务类目,拭目以待吧~
微信小程序开发 : http://www.sfxl9.com
上传小程序审核等了一天,结果不通过详情如下,(⊙o⊙)…我想一个人静静…
微信小程序开发 企业站建设 雪利酒网络科技
微信小程序-开发实战(二)相关推荐
- 《微信小程序开发实战》课后题
黑马程序员版<微信小程序开发实战> 第一章 填空题 1.微信小程序可以通过________方式打开. 答案:扫描二维码 2.微信开发者工具中的上传是指将代码上传到________. 答案: ...
- 王者级微信小程序开发实战教学 从零到高手搭建微信小程序框架开发教程
王者级微信小程序开发实战教学 从零到高手搭建微信小程序框架开发教程 小程序进阶 王者级微信小程序开发实战教学课程,讲师手把手对同学们进行微信小程序开发的进阶实战,从零开始搭建,从本地到云端开始系统化的 ...
- 视频教程-微信小程序开发实战之番茄时钟开发-微信开发
微信小程序开发实战之番茄时钟开发 4年web前后端开发经验,熟悉PHP,Python后端技术,熟悉基于Lnmp环境的项目开发和部署,擅长Yii,ThinkPHP,CI,Django,Flask等国内外 ...
- 微信小程序开发笔记二(WXSS和CSS样式美化)
微信小程序开发笔记二(WXSS和CSS样式美化) 一.CSS基本知识 1.Class选择器的定义 2.ID选择器的定义 3.ID选择器和class选择器的区别 4.CSS中设置颜色 5.CSS中的文本 ...
- 微信小程序开发实战(9):单行输入和多行输入组件
-----------支持作者请转发本文----------- 1. 单行输入组件(input) input组件用于录入单行文本,尽管input的基本功能是文本录入,但该组件的属性还是比较多的,也比 ...
- JEECG社区微信小程序开发实战-张代浩-专题视频课程
JEECG社区微信小程序开发实战-511人已学习 课程介绍 微信小程序开发培训,包含环境搭建.实例讲解.对接支付功能等课题. 课程收益 微信小程序开发培训,包含环境搭建.实例讲 ...
- 微信小程序python入门教程-2020Python+微信小程序开发实战(视频+课件)
本套课程出自老男孩IT教程的Python+微信小程序开发实战官网售价79元,课程基于微信小程序平台开发的的拍卖系统.课程分为4个章节微信小程序快速入门用微信小程序快速开发认证和发布动态模块,第二章拍卖 ...
- 微信小程序开发实战课程之油耗计算器-耿广龙-专题视频课程
微信小程序开发实战课程之油耗计算器-3406人已学习 课程介绍 微信小程序开发实战课程之油耗计算器,通过练习开发工具类的油耗计算器小程序,可以帮助大家了解微信小程序的API,相关组件的 ...
- 微信小程序|开发实战篇之二
开发实战篇之二 前言 1.零碎知识点和优化点 1.1 ES6模板字符串 1.2 ES6扩展运算符 1.3 独立更新like组件状态 1.4 自定义组件支持hidden 2.音乐music组件开发 2. ...
最新文章
- 12月4日云栖精选夜读 | 你不知道的Web前端安全技术
- react服务端/客户端,同构代码心得
- Oracle如何手工执行job,求助高手,JOB执行和手工执行执行结果不同,JOB执行不出来,手工却没问题...
- pow(x,y)函数
- 【华为云技术分享】在 K8S 大规模场景下 Service 性能如何优化?
- java 保存的代码怎么写_java实现写入并保存txt文件的示例代码
- 剑指 Offer 43. 1~n 整数中 1 出现的次数
- 119. PHP 性能问题(2)
- php把文本数据保存为文件格式,word如何保存文件格式为纯文本格式?
- Kindle Paperwhite安装PDF阅读器Koreader
- B2B跨境电子商务平台综合服务解决方案 1
- 徐培成电商项目-徐培成-专题视频课程
- 会员数据化运营应用场景与分析模型
- 华为路由器交换机配置命令
- 加入先进制造的追光者-探索现代机械设计团队的高效协作方式
- 大制作,1500多行python代码实现各大平台音乐搜索,下载,收听
- Pywinauto基础03--控件操作
- HTML中表单的练习代码。
- 【ENVI入门系列】10.图像裁剪
- apache common JCS的使用
热门文章
- 基于Distflow的最优潮流模型(OPF)--模型推导篇
- SQL Server 常用日期函数的运用
- 【嵌入式】嵌入式设备实现网络功能——综述
- HAPPY -1 打死我也不说 (未完成)
- api.php act orders,api.php · 深圳市龙岗区余生网络工作室/酷享云支付 - Gitee.com
- win7计算机脱机,Win7系统IE脱机状态怎么解除?
- 热塑性塑料注射成型中的常见缺陷及产生原因
- 心与心的距离 (思维)
- MySQL服务无法启动伴随部分ERROR解决001
- 微信网页发红包服务器卡住,「」实用技巧:微信红包“发放失败,此请求可能存在风险,已被微信拦截”的解决办法...