|
6 C6 h- V( ?& s. G% u$ k6 \" ] 今天突发感想想实现一个不一样的2048小游戏,此时我就会直接开干吗?这是不存在的,首先我想到了“全球最大同性交友网站”,上面那么多现成的常规2048小游戏,直接拷贝下来一份,读懂精髓然后在此基础上进行修改岂不更能达到”事半功倍“的效果,说干就干,下面开启了我的猎艳修改之旅。 6 q( s: E# T+ n- L5 ^" Z8 y
一、猎艳之旅登录“交友网站”后,开启了关键词搜索,通过搜索“2048小程序”,发现了一批优秀的代码,一位倩倩美女映入了我的眼帘,这位美女的网址是:https://github.com/windlany/wec ( O! T6 ^- w8 U! z; y
hat-weapp-2048 + R* c5 M3 e9 L
1.1 初始化偶遇这位美女,第一步肯定是将美女拉过来,然后仔细欣赏一下是否符合自己的需求git clone https://github.com/windlany/wechat-weapp-2048.git。 + I! ~* x; e( ]: G
美女拉过来了,接下来要怎么处理呢?肯定先要欣赏一波美女喽,下面就有我们帅气的“微信开发者工具”打开一下,看看这个美女到底长啥样,符不符合我们的需求。 ( \4 T7 E" S5 |1 t( S$ k6 k
1.2 核心内容理解run起之后,发现其形象气质完全符合我们的需求,外表达标了,是时候了解一波内涵了,正所谓“外行看热闹,内行看门道”,下面就以内行的眼光看一看是否符合我们的需求。 : w; l" \9 a; |: T/ F& Y
通过观察其目录结构,很快就能够定位到需要关键的核心内容在/page/2038这个目录下面,这个里面的核心代码就不跟读者一行一行读了,就直接抛出其核心思路吧,毕竟思路捋清楚了,后面就是编码的问题,具体思路可以分为以下三步:
" S" \8 w- H: A5 M q, u 初始化初始化阶段即完成对应网格中内容的初始化填充 ( v! G" e! }' o7 j
(1) 从外观上看,其初始化的内容就是一个4*4的网格,其通过标签即可实现;(2)从数据层面看,其背后存储的就是一个4行4列的二维数组,没值得位置就填空;(3)初始时会随意挑选两个位置填充上其初始值2(此处是后期我们要动刀的一个位置,记住记住) 7 }0 K6 j7 k2 d
方向判断初始化之后就需要进行对应的操作了,不能初始化之后咱们啥也不做吧!通过监听对应用户的操作然后进行对应的处理,为了监听用户的操作,需要绑定用户触摸的一系列事件(touchstart、touchmove、touchend),在这些事件触发之后获取对应的坐标位置,进而判断其移动方向,从而才有后续的内容更新环节。 6 S+ C1 n) ]$ ?3 r( {
/ U6 S ]( e4 ?3 W
// 触摸刚开始的时候将会去获取手指触摸的位置坐标* @ y& S4 T# ^& N' v) k& x1 A; j* k
touchStart: function(ev) {2 k: r/ F7 Y H. r( M" s
var touch = ev.touches[0];+ W0 P$ t' g) F. \, J3 F* D
this.touchStartX = touch.clientX;" V3 z9 Q0 m' r7 t) y
this.touchStartY = touch.clientY;
3 n4 b* g* H4 \5 a- _) T1 q& z, O% E% ^# b6 k5 `: G, H1 l, r( M. m- ]
},$ Y; s, i& Y" r9 T' Z
// 当在移动过程中不断获取其手指坐标
2 A, m" z7 Y/ v, t1 h1 _6 {5 u touchMove: function(ev) {
4 j% a- a; t" K; k6 @ var touch = ev.touches[0];- T: u: `( V* O! R& f+ _- `, E
this.touchEndX = touch.clientX;
, R8 b# N0 B; ~ this.touchEndY = touch.clientY;
% C, Y: Y. @' ]/ |6 u+ ? },9 r# b4 P3 T t8 @4 a
// 通过对比前后的坐标值,确定其移动的方向(0:上, 1:右, 2:下, 3:左) @7 [9 m! s G2 {& K5 w
touchEnd: function() {
& }, B5 Y* |- Q1 Z var disX = this.touchStartX - this.touchEndX;5 Q+ [$ I) G) u
var absdisX = Math.abs(disX);
8 O9 o$ u7 R0 \9 A0 l var disY = this.touchStartY - this.touchEndY;8 W, O7 N0 w1 j: z2 T; U
var absdisY = Math.abs(disY); Q7 C' q/ n0 M1 z, I
8 V+ w6 }. F: q/ H( Z. m var direction = absdisX > absdisY ? (disX < 0 ? 1 : 3) : (disY < 0 ? 2 : 0);# k& Y/ m' c' h9 |
} 8 r) u, j9 s1 \+ O4 s
内容更新合并当判断完方向之后就到了根据方向进行对应内容的更新合并,并产生一个新的随机值进行填充,如下所示: ' c2 u$ D: _1 T- ^6 {
如上图所示,左图是原始图,右图是向左滑动之后的结果,可以看到滑动之后其结果是将最后一行的内容进行了移动和内容求和,并在空闲区域产生了最小值,基于这个思路,是否可以将合并思路拆解为以下步骤:(1) 根据方向将二维数组划分为对应方向的一维数组,例如向左移动则每一行就是一个一维数组,数组头是左侧;向上滑动每一列就是一维数组,数组头部就是上侧;
( e6 H: d6 f- u& U+ U {5 g1 r (2)将每个一维数组中内容进行移动——合并——移动,即先将所有有值得内容移动到头部,相邻相等的值相加至前一个,最后再将其合并后内容移动至头部;(程序中的思路拆解的很清楚,感觉做的很棒,点个赞)(3)所有内容全部更新完毕之后,将选择一个空闲区域产生一个新值进行填充,最终渲染页面进行内容更新。
' D$ ]8 c, t2 A5 x# M 二、修改之旅上述已经将该基础2048的所有核心内容介绍完了,那么我们找到这位美女不魔改一下是不是说不过去呀,话不多说,先亮出要修改的位置吧!!起始值一定是2吗?为什么不能是3、4、5、6等任意值呢?一定要是求和的模式吗?为什么不能从2048依次递减呢?
9 F; r/ d1 f/ E 2.1 模式一第一种模式就改一下能够支持任意初始值既然支持任意值,则必须有一个位置进行输入,此时我们在页面中添加一个input标签用于输入其值;
( w f* A% g! Z 有了输入则就要找到对应修改的位置,经过一步步定位,最终找到了其最终修改的位置,然后将该值复制给对应的位置即可。 4 U/ _# g3 N. F) i- q* S
让我们看看最终的效果
* ^- |) g9 P# P 2.2 模式二第二种模式就是除了增加咱们是不是可以选择不断减少的策略呢?下面来看看此种模式实现需要对代码进行如何修改,其实这个模式仅仅只需要在模式一的基础上做很小的改动即可。改动点 8 H+ l5 C+ Q3 I) B" y( C' i
2. 最终效果 5 |1 [2 s$ _( Q! m1 X3 P
除了上述我想到的两种新玩法,你们还有什么新的玩法呢?分享出来让我们一起嗨皮一波三、总结本次做的事情很简单,就是在大佬原有基础上读懂其代码,然后对其进行相应修改,产生新的模式通过本次的分享主要学习了以下几点:。
R, Z7 a+ L! J1 {8 O# L 多利用“同性交友网站”,利用其内容可以事半功倍;多学习别的的分析问题的思路,如何将复杂的问题拆解为简单的问题并进行解决;多看别人的代码,一方面学习其代码书写模式;另一方面学习其如何进行内容的抽象(例如其在进行合并抽象部分);
$ P* F% @ B4 |! x- o) E1 f4 u R& u. L
2 f' `6 s0 K: H8 x
5 ~0 ^' t! r0 q" k a( F( D& D+ a
|