「哎呀,别卖关子了,赶紧说吧!」
看着老爹一幅悠然闲适的样子我牙根儿都痒痒,如果不是害怕遭雷劈可能早就用鞋底招呼过去了。
「好吧好吧,那我就说吧。其实要通过键值来避过switch目前我能够想到的有两种方法,其中一种比较取巧,另一种就是正儿八经的通过计算得出来。
刚刚你们也说了,如果是对灰太狼进行上下移动,实质上是在对行数x进行加减,左右移动,是对列数y做加减,那我们定义一个二维数组,把要加减的量放在数组里面,然后通过键值把数组取出来就好了。
向上移动,x-1,也就是x+(-1),y+0;
向下移动,x+1,y+0;
向左移动,x+0,y-1,也就是y+(-1);
向右移动,x+0,y+1;
键值的排列是左37,上38,右39,下40,如果我们对它们进行减运算,得到的结果是左0,上1,右2,下3,正好可以作为数组的下标。
于是就可以声明一个偏移量数组:
int offset[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
我们知道了灰太狼当前的位置,也可以通过键值获取位置的改变量,那么下一个位置、下下个位置自然就能够确定了。假设我们把移动这部分的逻辑定义成一个move函数,那么实现逻辑大概如下:
int move(int keyCode)
{
int index = keyCode - 37;
int x1 =灰太狼当前位置x+ offset[index][0];
int y1 =灰太狼当前位置y+ offset[index][1];
int x2 =灰太狼当前位置x+ offset[index][0]* 2;
int y2 =灰太狼当前位置y+ offset[index][1]* 2;
/*移动判断逻辑*/
}
x1,y1和x2,y2就是当前移动方向的下个位置,下下个位置的坐标,有了它们,实现功能应该就不是什么难事儿了吧?」
「这样……都行?」
我和小弦子都被老爹这波操作秀到了,真的特别让人无语。就好像你想尽一切办法,使尽浑身解数都没有将一块大石头给搬起来,然而在这个时候某个人拿了几个滑轮和绳子,不费吹灰之力就大石头给搬起来了。
不仅是我和小弦子有这种感觉,就连之前陷入沉思的六叔叔也是好一阵无语,如果一定要用一个词语来形容我们此时此刻的心情,大概还是只有「卧槽」这两个字了。
但不得不是说的是,老爹的这种做法让人挑不出来任何的毛病来,而且简单易懂,实现起来也极为容易。
很显然,这并不是我,小弦子和六叔叔想要看到的结果,因为这和我们想象中的算法相差太大了!
算法难道不应该是经过一系列精密的计算后,最终得到想要的结果么?
「哈哈,你们别这样看着我,我之前声明过的,这种方法比较取巧。而且作为一个合格的程序员,就是要用最简洁的代码实现最复杂的功能,因为简洁同时也意味着效率高。」
老爹似乎是看穿了我们三个人的心思。好吧,我承认他说得很有道理的样子,但是依然没有办法让我平静的接受,毕竟之前我为了考虑键值和位置移动偏移量的关系扣了那么久的头皮,让我如何能够接受这种毫无技术含量的答案?
小弦子和六叔叔没有说话,不过我猜他们和我想的应该是差不多。
「行了行了,那我就说说第二种方法吧,如果这种方法依然不能让你们满意,我就没有办法了!」
老爹被我们三人看得有些头皮发麻,最终还是屈服了。
「首先,在上下方向上,上下的键值分别是38和40,这个时候通过计算得到的结果是:x的偏移量是±1,y的偏移量为0。x的偏移比较容易,用键值减去39就好了。
同理,在左右方向上,左右的键值分别是37和39,这个时候通过计算得到的结果是:x的偏移量为0,y的偏移量是±1。y的偏移比较容易,用键值减去38就好了。
换句话说,键值为38和40时,x的偏移量是±1,为37和39,x的偏移量是0。同样,键值为38和40时,y的偏移量是0,为37和39,y的偏移量是±1。
那么,你们能不能告诉我,38、40和37、39这两组数有什么区别么?」
老爹在一阵分析后,然后抛出了这个问题,如果没有什么意外的话,这个问题的答案就是破解一切问题的关键所在。
「嗯~,都是数字,能有什么区别?数值不同?」
我想了半天,也没能想出这其中有什么区别。
「难道是奇偶?」
就在这时,从上课开始到现在都没有说话的六叔叔居然发声的!
「对啊,就是奇偶!」
同时六叔叔的这句话也点醒了我和小弦子。
「没错,它们最大的不同就是奇偶性不同!我们的算法也正是要借助这一点,使用奇偶来完成一个统一的计算过程。」
老爹坦言道。
有了老爹提供的思路,我脑袋飞速运转了起来,开始挖掘移动偏移量和奇偶性的关系。可是即便如此,我依然没有能够想出这其中的联系所在,只能败下阵来,等待老爹的最终答案。
「好吧,我还是直接公布答案吧,不然你们两个小家伙怕是要被逼疯了。
首先,我们依然对所有的键值进行减37处理,然后得到的结果就是:上1,下3,左0,右2。
注意,这个时候奇偶性已经发生了改变。而且问题也已经变成了通过1、3得到x偏移±1,y偏移量0;0、2得到x偏移0,y偏移±1。
1和3要得到±1,只需要减去2,但是0和2减去2变成了-2和0,怎么办?如果这个时候我们再对减去2的结果对2取余呢?
也就是说,x的偏移量=(键值-37-2)%2,即x的偏移量=(键值-39)%2。」
「对了!可以等到正确的结果!」
我和小弦子惊呼道。
「好了,按照相同的分析办法,你们自己看看y的偏移量应该如何计算。」
y的偏移量正好与x的相反,通过1、3得到y偏移量0;0、2得到 y偏移±1。
0和2要得到±1,只需要减去1就可以了,1和3减去1后是0和2,依然对2取余就可以得到0,因此y的偏移量=(键值-37-1)%2,即y的偏移量=(键值-38)%2!