今天写完了 CS61B Project 0,该项目是写一个游戏 2048, 难度不大但是作者 Josh Hug 的设计很精妙。这个项目已经很像现实工作时的状态了:你的同事写好了框架和一些方法、函数和接口,给了你文档说明,然后你来完成剩下的逻辑,你不用知道它们的函数和方法是怎么实现的,只需要知道整个项目的数据结构和同事们写的函数的调用方法。

其中 Josh Hug 写的这个项目版本最亮眼的地方是对四个方向(上下左右,这里用 北南西东 表示)的处理。简单来说,我们先对一个方向(默认北)处理完游戏的所有逻辑。最后把另外三个方向加进项目时,并不是复制粘贴三次,而是加了两行非常简洁的代码就实现了:

public void tilt(Side side) {
        // TODO: Tasks 8 and 9. Fill in this function.
        board.setViewingPerspective(side); // 加入的第一行代码
        int size = board.size();
        for (int x = 0; x < size; x++) {
            tiltColumn(x);
        }
        board.setViewingPerspective(Side.NORTH); // 加入的第二行代码
    }

其中方法 setViewingPerspective() 正如它的名字的意思所表示的:我们改变一下看的视角。比如我们本来按的 左箭头(即西边),那么这里就会把西边看成北边(即第一行代码为 board.setViewingPerspective(Side.WEST)),那么我们之前完成的对于 NORTH 的所有的游戏逻辑就完全适用了,等到移动滑块结束后,我们再把视角还原回去,即 setViewingPerspective(Side.NORTH),用图来表示:

setViewingPerspective

当然其它部分也有很精妙的地方,整体来说完成这个项目差不多花了四五个小时,比起学 CS61A 那时候确实熟稔了不少。听说后面的项目还有从零开始搓项目的。嗯。