赞
踩
判断手指滑动的方向符不符合,符合的话将手指滑过的字符记录起来,如果方向正确的话,最后抬手时将滑过的字符与我们正确的单词进行比较。
这个程序总的都不是很难,唯一一个需要注意的点是斜线方向的判断,由于我们手指划过斜线时可能会同时划过其他的方块,我们在这种情况下要如何判断方向是不是符合的。
我们可以发现,当我们手指只划过1-2个方块时,我们既可能是划了一条直线,也可能是一条没有到达对角方块的斜线,因此,我们只有在手指划过三个方块时才会对方向进行初次的判断,如果是斜线的话必然会有两个方块的位置处于对角线上。后续再划过方块时,我们可以根据已经有的当前线的方向和新加入这个方块之后访问过的字符数组中的最后四个的方向进行比较,如果是相同则说明该次滑动是合法的,否则不合法,我们将方向设置为error,后续的滑动不会再记录。
为什么上面判断时是3个方块,但到了再判断时反而是四块,因为我上面初次判断斜线方向时是根据的有两个方块在对角线上,但这样对于一个长点的斜线来说会出现一些错误的情况,因为我在这里的想让手指在同个方向上往回滑也是允许的,所以我只能使用最后四个来进行判断,具体可以在图上用手尝试一下(暂时就不画图了。。有空补上),这里判断出来的也只是一个大概的斜线方向,不是一条标准的斜线,也就是说我们可以在斜线周围稍微绕一格也是判断是一条合法的斜线,所以之后我们会根据访问过的字符与要匹配的单词匹配程度进行判断。
具体的代码如下判断方向的代码如下,我的方向在这里面是一个枚举类型的值,并且左斜线和右斜线在这里分别是forwardSlash和backSlash,他们属于不同的方向。
- private void UpdateDirection(List<int> vised ) //三个方块确定一个方向
- {
- if (direction == Direction.error)
- return;
-
-
- int n = vised.Count;
- if (n < 3)
- {
- direction = Direction.none;
- return;
- }
- int posA = vised[n - 1];
- int posB = vised[n - 2];
- int posC = vised[n - 3];
- int posD;
- if (n == 3)
- {
- if (posA % GameManager.n == posB % GameManager.n && posC % GameManager.n == posB % GameManager.n) //同列
- {
- direction= Direction.vertical;
-
- return;
- }
- else if ((posA - 1) / GameManager.n == (posB - 1) / GameManager.n && (posC - 1) / GameManager.n == (posB - 1) / GameManager.n)//同行
- {
- direction= Direction.horizontal;
-
- return;
- }
- else
- {
-
- //只要有任意两个点是某种斜线上的就可以确定了,因为我们的方块之间是没有间隙的,第三个方块只有两个有效的可能值,哪种都不影响斜线的方向
- if (posA - GameManager.n + 1 == posB || posA + GameManager.n - 1 == posB || posA - GameManager.n + 1 == posC || posA + GameManager.n - 1 == posC || posB - GameManager.n + 1 == posC || posB + GameManager.n - 1 == posC)
- {
- direction = Direction.forwardSlash;
-
- return;
- }
- else if (posA - GameManager.n - 1 == posB || posA + GameManager.n + 1 == posB || posA - GameManager.n - 1 == posC || posA + GameManager.n + 1 == posC || posB - GameManager.n - 1 == posC || posB + GameManager.n + 1 == posC)
- {
- direction = Direction.backSlash;
- return;
- }
-
- }
- }//n>3
- else
- {
- posD = vised[n - 4];
- if (direction == Direction.vertical )
- {
- if (posA % GameManager.n == posB % GameManager.n && posC % GameManager.n == posB % GameManager.n)
- {
- return;
- }
- else
- {
- direction = Direction.error;
- }
- }
- else if (direction == Direction.horizontal)
- {
- if ((posA - 1) / GameManager.n == (posB - 1) / GameManager.n && (posC - 1) / GameManager.n == (posB - 1) / GameManager.n)
- {
- return;
- }
- else {
- direction = Direction.error;
- }
- }
- else//只有斜线时才需要4个方块的判定
- {
- if (direction == Direction.forwardSlash)
- {
- if (ifForwardSlash(posA, posB) || ifForwardSlash(posA, posC) || ifForwardSlash(posA, posD) || ifForwardSlash(posB, posC) || ifForwardSlash(posB, posD) || ifForwardSlash(posC, posD))
- {
- return;
- }
- else
- {
- direction = Direction.error;
- return;
- }
- }
-
- if (ifBackSlash(posA, posB) || ifBackSlash(posA, posC) || ifBackSlash(posA, posD) || ifBackSlash(posB, posC) || ifBackSlash(posB, posD) || ifBackSlash(posC, posD))
- {
- return;
- }
- else
- {
- direction = Direction.error;
- return;
- }
-
- }
- }
具体的类
一,CharGrid
类CharGird用来表示字符方块,在里面持有了一个Text组件,一个SetChar和GetChar方法,建立一个prefab来持有它,实例化创建时根据我们读取到的当前关卡的字符对text的文本进行赋值。实现了IPointerDownHandler,IPointerEnterHandler,IPointerUpHandler接口,当手指触发事件时通知Matcher类,调用相应的方法。
二,Word
保存一个单词的string,以及它包括的字符的位置,在这里我字符的位置是根据(row+1)*(col+1)算的。
三,Matcher类
这里面主要实现了上面的UpdateDirection类,还持有一个记录滑动过的字符数组,实现了当点击和进入时会调用的添加字符,会在这里通过方向判断要不要添加,还有一个抬手时触发的类,在有一个合法方向时,对我们的目标Word的字符和我们记录的字符进行比较,我们的字符可能会比较多,因为斜线方向的话会划过其他的字符,当我们的字符包含Word的字符(我们这里是通过位置判断,字符相同位置不同的字符也是不同的),则判断成功识别目标字符。
这里只是花了几个小时做的一个demo,可能有其他更好的方法,欢迎探讨(*`∀´*)ノ!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。