summaryreport.md
1. 实训任务简单介绍
本次中级实训目标是完善一个GridWorld的项目,该项目中包含多种类型的Actor,例如flower、rock、bug。同时包含unboundedgrid和boundedgrid两种grid。不同的Actor通过继承父类actor并实现方法的多态,使得每种Actor具有不同的移动规律。本次实训的目标是:
(1)熟悉Linux系统下Java程序的编译和运行。
(2)了解vim编辑器的使用。
(3)学会编写测试文件来检测所实现的方法。
(4)学会使用Sonar-runner检测自己的代码质量并根据问题进行修改。
(5)熟练使用Java语言,通过继承多态等方式实现具有不同特点的Actor。
(6)使用简单的搜索算法(DFS、BFS)以及较为复杂的启发式算法来解决一些问题。
2. 阶段一
阶段一主要是让我们熟悉Linux系统下Java项目的编译和运行,并且可以编写简单的测试文件。因为之前专选课已经简单得学过一些java知识,所有还是有一定的知识储备。阶段一的重点是要实现一个简单的计算器,这需要用到UI界面的相关知识,之前专选课已经实现过,所以稍加修改就可以满足要求。我认为阶段一的重点是学会熟练使用Ant和Junit,这在整个实训阶段都会用到。
3. 阶段二
总共有五个任务,主要会用到类的继承多态相关的知识点,在实训开始之前我们需要简单地阅读分析提供给我们的GridWorld项目。了解项目结构和接口方法等。这五个任务的实现还是没什么较大的难度,如果在实现代码之前仔细阅读过源代码,并且认真完成对应的问答题,我认为这一部分的实现不会有太大问题。
- Part2:实现CricleBug,使其能在调用turn方法之后只前进一步;实现SpiraBug,让Bug以spiral 模式在unboundedgrid中运行;实现ZBug,使其可以按照给定的 ‘Z’ 的大小在grid中的运动轨迹(每次父类Bug每次前进都会在原来位置放置一个flower)形成一个Z;实现一个DancingBug使其可以在grid中每前进一步就会变换方向,具有类似“跳舞”的功能;查看BoxBugRunner类,观察其运行模式。
- part3:按照需求设计一个Jumper类,一个jumper每次前进两个单位,可以跳过rock和flower。
- Part4:实现一个ChameleonKid类,继承ChameleonCritter类,它可以根据其正前方或正后方的Actor改变其颜色;实现一个RockHound类,它的运动方式继承了Critter,但是可以可以将遇到的rock移出grid;实现一个BlusterCritter类,运动·方式继承了critter,但是它可以根据其邻域内的Actor数量的多少变亮或变暗;实现一个QuickCrab类,继承CrabCritter,它只能向左或向右随机地移动一个或两个单位;实现一个KingCrab类,它可以驱逐其左前方、正前方、右前方的所有Actor,使其沿着对应方向前进一个单位。
- part5:为了解决当grid很大而其中的actor数量很少时的存储问题,可以使用线性列变或数组列表来存储Actor。实现BoundedGrid1类,通过ListLink实现存储;实现SparseBoundedGrid1类,通过Hashmap或Treemap来存储UnBoundedGrid中的Actor。实现UnBoundedGrid1类,该类可以无限扩大自身的范围。
4. 阶段三
这是本次实训最难的一个阶段,本人最后也没有完成该阶段第三部分数码问题的解决方法。
第一部分需要自学Java图像读取的知识,了解BMP格式图像的结构,方便我们读取图像内容,利用Java提供的API保存提取到的文件信息。
第二部分要实现MazeBug,该Bug具有走迷宫的功能,这将会使用到DFS搜索算法,实现过程比较繁琐,但是算法本身并不难。提升部分为了让Bug更快地找到出口,需要使其具有一定的方向倾向性。
第三部分时最难环节,可以使用BFS算法解决N-数码问题,用启发式算法解决N-数码问题,由于该部分未能实现完整的功能,所以就不再多加叙述。
5.总结
本次实训为期四周,中间有一周的休息时间,实训本身的任务量也算中等,但是实训会占用周末的时间,可能会挤压平时其它课程的学习时间,这也是考验我们的时间分配能力,这四周虽然不断在完成DDL的路上,但也收获了很多的知识,实训过程帮助我们更加深入地学习和掌握Java语言相关知识,提升我们的算法水平,也提升了我们的代码阅读和优化能力,获益匪浅。