2012年5月21日星期一

Gobang summary

电工实习两周,算是抽空把Java的大作业搞好了。感悟还是蛮多的,遂记录之。
原来看《thinking in Java》的时候是完全不懂GUI,不单如此,很多之前看过的知识由于没有应用到具体项目中,时间一长竟然忘了许多。以《thinking in Java》如此丰富高深的内容,涉及各种design pattern和 类机制,其实真正会用的真不多。。。现在觉得可以重新回头看看要点了。
老实说吧,刚开始的时候真是各种不适应。用惯了C的人,代码越简洁越好,但是面对Java这一坨坨的类。。。好吧,确实有点难以接受咯。如果不是有eclipse这种自动化程度这么高的IDE,而是用什么notepad ++,估计早就崩溃了 = =

敲代码过程中主要还是吃老本,Java的特性没用到多少,反倒是有点C++的OOP影子。但是基础方面我觉得两者差不多吧,都是OOP的话。

说回五子棋。其实核心的也就是AI算法。基本思路是用二维数组模拟棋盘状况,然后对每个可能下子的空位置进行评价,也就是在最有价值的位置下子。这个价值判定分两部分,对己方的有利程度和对敌方的有利程度。对一个位置的考虑是有主攻和主防两种方向。实现起来也不算难,就是根据相同的权值表对该位置进行两种角色的评价。但是这个算法其实还远远不够,顶多只能算考虑了一步半(比只考虑进攻的要好点)。考虑过A*寻路算法+启发式搜索,还有博弈树,但是无奈水准还不够啊,真要弄起来估计deadline之前完成不了,遂暂且作罢。但是这个思路我觉得还是不错的,就是实现起来可能会比较麻烦。
另外还有一点深有体会的就是各组件之间触发事件的相互响应。Java的事件机制感觉上比较混乱,而且功能不够齐全,有些还有自己实现。各部件之间基本上是通过父部件来进行通信。e.g. A component 的listener接受到触发信号,然后需要通过parent component来调用B component的函数。有时候直接用getparent方法还不行,要在构造的时候直接传入父部件的引用,这样貌似效果要好点。

类的设计也是很讲究技巧的。怎样才能体现程序的高内聚,低耦合呢,这里貌似有点类似递归的思想。把大任务分成很多的小任务,由对应的对象完成。也就是说,作为某一类对象,其自身拥有的特殊属性和操作应该封装起来。这个就好像DIY,父部件把任务分配给子部件,至于怎么完成就是子部件的事了,父部件关心的只是任务完成的结果。如果是大量重复的子部件,更应该仔细考虑这个问题,尽量提高代码复用性,同时注意节约内存空间。这些都体现在代码的细节上。

前期的话,基本上是变开发边重构的。因为本身就不熟悉Java,同时会参考另外的样例程序。通过比较代码,了解原作者的思路,同时思想为什么要这样写,有什么好处,是否有更好的实现方法。经过不断的对比debug,算是搞出一个相对精简的AI算法。效果上来说还过得去吧。还有就是蛋疼的UI布局管理器,这里就不多说。各种触发事件之间的协调变化也是要慢慢理清思路才好下手,反正都是细节问题。

要说开发这个程序,主要目的还是熟悉基本的UI设计与操作,事件机制和OOP思想。现在看来,预期目标算是基本达到了,良好的核心算法是需要扎实的算法基本功和建模能力的,这个在不断加强中。
Anyway,熟悉软件开发流程算是暂告一段落。貌似各种书和资料(PPT,pdf)什么的已经积压的很多了,还有得忙呢。期待暑假的锻炼~


源码已托管于Google Code:
code.google.com/p/gobang-scut-csne/
为开源社区贡献的第一份代码 T_T