简单分享下
写这篇文章主要是想跟刚迈入编程这条水泥路的小程序新手开发人员一起交流交流的,因为咱也只是个开发小程序的菜鸟人员,技术帖咱是写不来了,就只能跟大家唠唠嗑了。
1. 开篇
接触微信小程序也有一年多了,在这一年多的时间里也写过五、六个小程序,最初接触小程序是因为我们想通过小程序,来推广运营公众号和扩展公众号功能。
之后的开发就完全是因为好玩和兴趣了吧!
好玩??? 怎么玩?
大一大二咱大家刚接触算法编程,或许对算法编程是这样的:
而且经常会听到学这到底干什么用的呀!
好烦,这周数据结构又学了几个算法,二叉树?图?那行吧,咱就用这些个数据结构写个小程序吧!
又或者我们玩了一些好玩的小程序,那行吧,咱也试着用我们学过的算法知识在小程序上也写一个吧?
即使是些老掉牙的游戏,贪吃蛇、扫雷、连连看消消乐、成语接龙等等这些小游戏,实现后你还能在这些个游戏基础上发挥你的脑洞,进行创作改编。或许还能让你编个爆款小程序出来也说不定,是吧。
这些小游戏,小程序内部或多或少都用到了传说中的算法。
之所以选择用小程序来实现,还有一个最主要的原因就是小程序能够很轻易、很低调的就让我们秀一波。
小程序在真机上运行测试很容易,一个二维码就搞定,而且开发的小程序,不仅仅只是让我们本专业同学能够测测玩玩,还能够让更多非本专业的,好比你对象呀同学呀爸爸妈妈呀爷爷奶奶呀哥哥姐姐弟弟妹妹姑姑婶婶阿姨婆婆呀等等等等(只要他们有微信就行)都能够一起体验我们写的这些个小游戏呀。(o(∩_∩)o )
所以在小程序开发过程中不仅学到了知识,还让我们见到了知识,玩到了知识,还能从中时不时的得到些个赞赏鼓励。你说这样子学习,你学不好才怪!
小程序还可以是一个表白神器,花点心思写一个专属 Ta 的独一无二的小程序,只给你的 Ta 开放个权限,再送给 Ta 比你花多少钱买个什么礼物都珍贵,你说我说的在理不!所以,你说小程序开发好不好,爱情学习双丰收呀。
2. 案例
好吧,上面废话有点多,下面先放几个自己做的小程序聊聊,素材什么的都是自己花心思画的(丑不丑无所谓,自己看着舒服就行),而且写一款完完全全凭自己感觉设计出来的小程序会让自己更有成就感。
2.1 反义词消消乐
反义词消消乐这个就是去年参加微信小程序应用开发赛做的一个小程序,为了增加游戏趣味性也增加了多人对战的功能。
反义词的逻辑匹配算法其实很简单,后台字词数据表,表中每条数据存储正、反两词,因此拥有共同的id值(int类型),前端获取到数据后只需将每条数据进行简单分割处理,可以让正意思词的标记值等于+id,反意思词的标记值等于-id,这样我们就能通过两标记值相加为0,来判断字词是否匹配成功。
游戏内的所有逻辑都交给小程序来判断运转,后端只是用来实现数据的存取,中转和传输。多人中前后端是使用 WebSocket 通道进行实时双向通信的,确保游戏内所有消息能够快速同步。逻辑如下:
简单解释下上图,当用户点击匹配后,发送信号与后台建立websocket连接,连接成功后传回连接的websocket的id值即sid,前端打包用户数据,sid,用户状态,用户转态就是此时是否已经退出游戏,发送给后端,后端保存信息,放入用户匹配池中,当准备就绪后,传回前端,前端发送匹配请求,后端再次开始为用户分配房间号,之后判断实时监听判断分配的房间是否满足两人,满足即可开始游戏逻辑。当游戏开始后,前端与后端的处理逻辑为如下所示:
上图是表示游戏匹配过程中的逻辑,其中打包小程序端发送的游戏信息其实就是用户点击反义词数据的状态信息,有助于后台判断分数加减等情况。服务器端的定向广播游戏信息,就是将处理好的分数等情况广播发送给定向房间内的用户。
反义词小程序整体流程大致是这么实现,而分配玩家的逻辑可以是按随机,按先到先服务,又或者按指定条件(如胜率分段等)将玩家分配到一起。
2.2 困住小星星
困住小星星这个小程序,其玩法是模仿日本游戏设计师TaroIto2007年制作的“黑猫”(ChatNoir)游戏,而我在将其成功围住之后放了一些彩蛋,具体内容嘛就不说了 (✿◡‿◡),你们可以自己更改主题后随意发挥。
玩法就是游戏初始化墙的个数大概是9-13个之间。玩家需自己想办法点一个圈,目的就是要将其围住,不让她从边界跑掉即可。
小星星的寻路机制算法用到了最小路径和最大通路的算法,在每次寻路前先计算出各个非墙点的最小路径步数,以及最大通路步数,当最小路径步数相同时,就用最大通路步数来进行比较,最终找到最优路径,所以要想困住其实还是有点难的。
因为游戏中的地图是9*9,因此在最短路径算法中,其中点是(4,4),要计算到各边界的最短路径问题,可以从外往里开始计算。比如最外围,因为是边界,所以其路径长度为0,之后每往里一层,其路径长度就加1,直到到达主角位置。在不存在墙的情况下如下示:
最小路径:
其实要想计算出这个图的路径,我们不难发现,计算某个点的路径时(例如上图标红处),我们只需遍历找出每个点周围(即左、左上、右上、右、右下、左下)路径最小的值并加1,即是最终的最短路径长度。
如何实现?首先我们规定图中81个点初始path值可设为 -100,障碍物的path值可设为 100,边界path值可设为 0,主角位置可设为 999。之后再分别从四个大方向,即左上、右上、右下、左下这四个方向进行反复计算。
如何计算,以左上为例,左上计算即表示从左到右,从上到下,对各个点进行遍历。在遍历各点的同时,判断该点是否为障碍物,是则直接返回path的值为100,若该点为边界,则直接返回path的值为0。
如果都不是,则找出该点周围的6个点,并分别遍历周围的这6个点,判断这6个点的路径值,找出周围6个点路径的最小值min,min初值设为100。
如果筛选出来周围的点中存在没有计算过的点,即存在小于0的值,那需要等以后来计算他们的值,因此先不参与比较判断。而周围点的path值满足大于0的条件时,与min值比较,选出其中的最小值并赋给min,遍历完6个点后。当min值满足小于100的条件时,那么说明该点周围的最小值已经计算出来,直接将该点周围最小值路径值加1即为该点path值。
上面说的有点绕,直接上代码:
calPath: function(location) { //计算路径
var row = location.row
var col = location.col
if (this.data.map_location[row][col] == 1) { //墙直接返回100
location.path = 100
return location.path
}
if (row == 0 || col == 0 || row == 8 || col == 8) { //边界直接返回0
location.path = 0
return location.path
}
var sixDir = this.calSixDir(location) //寻找周围的六个点
//遍历周围6个点,找出最小值
var min = 100
for (var i = 0; i < 6; i++) {
if (sixDir[i].path >= 0) { // 存在点没有值,那需要等下次再来计算其值
var tmp = sixDir[i].path
if (min > tmp) {
min = tmp
}
}
}
if (min < 100) {
location.path = min + 1
} else {
location.path += 1
}
return location.path
},
以此类推,从右上、右下、左下这三个方向进行计算,也都是相同的逻辑操作。
最大通路:
最大通路其实与最短路径的计算差不多,只是最大通路我们计算的是该点周围能走的个数,即寻找出该点周围6个点后,统计一下该点周围非墙的个数即可。因此计算时只需两个for循环遍历一遍图中所有点并分别计算一下即可。
2.3 fly 拖鞋、摩斯密码
这个名字嘛fly 拖鞋,就是我随便取的。当时画素材的时候,就是随笔画了画涂了涂,看着有点像拖鞋就叫了 fly 拖鞋,这个游戏其实是用小游戏写的,游戏内容其实就跟fly bird一样。
开发这个游戏的过程中其实没用到什么算法,也没什么好说的。但用到了些物理知识,就是高中咱都学过的上抛与自由落体的公式,说这个就是想你知道写游戏的时候其实很经常用到物理知识。
这个摩斯密码,就是因为当时跟那谁谁谁聊起过摩斯密码,感觉那滴滴哒哒的也很神奇,而且又凑巧那天看到了个摩斯密码表,于是就照着那个表写了这个翻译器。所以用小程序写个小工具自己用还是很方便的。我觉得吧小程序是最适合自己写工具的,方便,而且干什么都行,就看你怎么用了。
上面说那么多其实就想让学弟学妹们知道小程序可以这么玩。把我们所学的知识用可视化的形式体现出来,这可能比单纯的学习课本上的知识更有趣。
3.聊聊
小程序开发起来不会太难,在这个过程中其实也没有遇到太多大问题,遇到的bug无非就两种,要么语法错误,要么逻辑错误。
其实当遇到一个问题的时候,最好的解决办法就是官方文档了。这个真不是废话,很多时候遇到的bug其实就是我们对api的不熟悉,错用,用错而已,再不是,那就是咱自己代码逻辑错误了吧。
3.1 开发
开发个小程序的过程无非就这五个过程:问题—>分析—>设计—> 编码—>优化。
本人开发的心路历程首先就是自己要明白到底要开发个什么东西出来,之后便是去官方文档中简单查询下这些api,看看我们设计实现的这些个功能到底可不可行能不能实现。实现不了的,就换个思路看看有什么可替代的方案。
之后就是得想清楚,具体的实现步骤,实现逻辑,并分配好前后端的功能逻辑,之后再简单搭建小程序的整体框架,架构。我写的小程序其实大部分的实现逻辑都是在前端实现,后端我只是单纯的用来做些数据存取、中转等功能。
当然现在小程序的云开发,大大方便了我们,直接可以将数据放到云开发数据库上,用官方的原话讲就是一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库,而且这也大大简化了后台服务器的环境构建,运营维护等。可以减少很大的工作量。
最后再是动手编码实现我们的想法,将小程序的基础功能逻辑基本实现后,再慢慢的对其进行优化,完善。
其实我最喜欢就是完善和优化的这个过程,它能够让我很惬意的去设计、体验,将我们自己的小程序从粗糙的demo到精致的成品这个过程,是一件很有成就感的事。作出一个美美哒,精致的小程序,你就会连吃饭学习睡觉都感觉很舒畅。
3.2 收尾
最后总结就是,在开发过程中,可以先分析好功能逻辑,再开发个拥有主要功能的demo出来(先不管页面什么的设计有多难看),之后我们在这个demo的基础上一版版的优化修改,一步步迭代,最终成型。是的,小程序的开发就是这么容易,这么简单,这么好学,这么有趣。
还有就是要开发设计一个小程序其实不需要太多太复杂的功能,开发一个小程序的真谛就是简洁! 不仅仅是界面简洁,操作简洁,其实最主要的就是功能简洁,这或许也就是小程序设计的初衷吧。
最后还有就是遇到问题咱们首先确定一下是不是语法错误,再看看是不是逻辑错误,再不是,可以去文档上看看找找原因,文档还没有就去开发者社区里搜搜,开发者社区还没有的话可以先在这里面提个问题,最后咱们再去百度google,查查看,如果还没有解决方案的话。
那没办法了,只能开大招了—— 小黄鸭调试法!
在很久很久以前,有一个传说,传说中有一位程序大师,他随身携带了一只小黄鸭,每当在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码…没了,这个传说就这么短,这就是传说中的小黄鸭调试发。
为什么呢?维基百科是这么解释的,小黄鸭调试法,又称橡皮鸭调试法,或者黄鸭除虫法,是在软件工程中使用的代码调试的一种方法,方法就是在程序调试,测试,除错过程中,操作人向小黄鸭耐心的解释每一行程序的作用,以此来激发灵感与发现矛盾
说白了就是回归带自己代码上,然后自言自语一翻。
你还别说,这个真管用,说出来更容易帮自己捋清楚思路,这个方法真的是屡试不爽,一直试一直爽!
要是你有幸能够把问题解决好了,最好可以记录一下踩过的坑那是最好的了,如果你再善良一点那就来开发者社区中分享一波吧。不管问题多简单,你要知道比你懂的少的人还是有很多的,他们那些新新手可能更需要的是咱们这些菜鸟新手的帮助吧。
最后再说一句话:
后台有没有考虑过用云开发实现,更简单(坏笑)
大家都看过来,,云开发了解一下!
云开发是怎么回事?
变秃了,也变强了
小黄鸭调试法 感觉很棒!
写的这个反义消消乐的系小程序还是小游戏?
是用小程序写的
能看看你的消消乐的代码吗
能认识你真的很高兴
哈哈,,我也是!!感觉你是真厉害
要不要找工作,或找实习,可以联系我哈。
这个。。暂时不考虑,准备读研
这个文章的目录是怎么生成的。这个文章是哪里写的呢?
目录不是生成的,,这个是微信开发社区做的一个关于高校开发者的专题活动,然后花了些时间写的。
也是就是说写好了,微信小程序官方自己上传的对吧。
厉害啊 在校生能沉下心写代码 我现在下了班回到家都不想看代码
我一回寝室我也不想写。。
小黄鸭调试法get😄
小黄鸭,程序员的好朋友!
楼主应该是单身(手动滑稽)
完蛋,,你知道的太多了
作为一个在校学生,还能够有这么好的定力,没有被 花花世界和 游戏、电影、小说等捕获。 很难得。
嘻嘻,,过奖啦。。这个我也就单纯为了好玩
1111