阶段1:项目启动
实验目的
为本次实验的实训打下基础,学会使用vi/vim
,Java
,Ant
,JUnit
,sonar-qube
以及完成环境配置并尝试使用GridWorld
。
实验内容
- 学习
vi/vim
编辑器的使用 - 熟悉JDK的环境并学习JAVA语言,完成
HelloWorld
的编译运行 - 熟悉Ant的环境并学习
Ant
,利用Ant
实现HelloWorld
的自动编译 - 学习
Junit
,利用Ant
、Junit
测试通过HelloWorld
- 学习并配置
SonarQube
,利用SonarQube
测试自己昨天写的Java小程序 - 完成
GridWorld
的环境配置,学习gridworld.jar的引用,编译运行BugRunner
实验感想
在这个阶段,我个人觉得其实各个部分说起来都不难,只是由于我之前并没有接触过相关的知识,对于环境配置这一方面实在是不熟,导致了各种错误频发,最后还是花费了一个周末在这里,现在回想起来,其实需要做的东西也是不多的。不过,给我们探路和熟悉的时间本身就是阶段一的意义。下面是在阶段一中给我印象最深的部分:
JUnit是用于Java单元测试,测试java中某函数方法是否执行正确。执行HelloWorldTest
文件需要使用junit-4.10.jar包,由于当时没有使用eclipse软件,所以是通过命令行来实现的,但是由于对命令行操作的不熟悉,出现了大量的错误,迟迟无法运行,最后才得出以下具体命令:
javac -classpath .:../lib/junit-4.10.jar HelloWorldTest.java
java -classpath .:../lib/junit-4.9.jar org.junit.runner.JUnitCore HelloWorldTest
其实使用eclipse软件建立一个HelloWorld的项目,向其中加入相关的代码和junit-4.10.jar包,便可以直接运行,方便许多。
阶段2:基本任务
实验目的
进一步熟悉GridWorld
项目中的各个成员的代码,了解其整体的结构和运行方式,并且依据其修改并实现相关的各种子类。
实验内容
- 观看各个基础成员类:
Actor
、Bug
、Rock
、Flower
等的具体实现代码,了解它们的行为表现以及相应的实现函数。并完成相应的问答题。 - 在父类的基础上实现各种变化的子类:
ZBug
、BlusterCritter
、KingCrab
、QuickCrab
等,根据题目中给出的要求去选择性的重载对应的实现函数。 - 通过
SparseGridNode
和HashMap
或TreeMap
实现了不一样的BoundedGrid
的布局,并比较使用不同方法的时间复杂度。最后实现一个可以不停扩展的UnboundedGrid
子类。
实验感想
刚开始的时候我还觉得阶段二内容不多,直到我发现了问答题。这个阶段的代码题我觉得其实还是可以完成的,大多都是依据已有的父类,对其的一或两个函数进行修改重载,只要理顺了原有父类的代码执行逻辑,知道那些行为表现对应那些函数,根据题目的要求重载部分函数,就能实现相应的子类。但是问答题部分是真的多,需要寻找到对应文件的位置,然后标记位置并贴出源代码,这都花费了我许多时间,但是不得不承认这个方法也是极其有效的,因为它让我迅速的熟悉了GridWorld
项目中的各个成员。
阶段二也让我熟悉了对eclipse软件的使用。单纯使用命令行容易出现找不到对应文件的情况,而每个文件都手动写Ant又比较麻烦,使用eclipse软件则不会出现以上问题,十分的便利。
阶段3:扩展任务
实验目的
学会对图像进行处理,读写Bitmap位图文件。了解深度优先搜索算法(Depth-First-Search),广度优先搜索算法(Breadth-First-Search)和启发式搜索算法。
实验内容
- 图像处理:利用课程网站给出扩展库
ImageReader
和测试图片集bmptest.zip来实现一个简单的程序,它能利用二进制流读写取Bitmap图像,并且能够进行简单的色彩处理。 - 走迷宫:利用课程网站给出的软装置MazeBug,实现深度优先搜索算法,使得虫子
MazeBug
可以走出迷宫。 - 拼图游戏:完成N-数码问题,利用广度优先搜索算法和启发式搜索算法实现拼图。
实验感想
在阶段三中,我对Bitmap位图文件的文件结构有了更深刻的了解,知道其具体由位图头,位图信息,调色板和位图数据几个数据块组成。其中位图数据包含的内容最多,保存一个又一个像素的实际图像。详细内容可以查看博客:http://blog.csdn.net/sjzlxd/article/details/3923907。了解了什么是色彩通道和如何提取它,以及如何获取灰度图。
阶段三还对深度优先搜索算法(Depth-First-Search),广度优先搜索算法(Breadth-First-Search)和启发式搜索算法这三个算法有了更加详细的介绍。其中深度优先搜索算法和广度优先搜索算法也可以统称为盲目搜索方法。这两种盲目搜索方法我都曾经使用c++实现过,因此虽然让我使用java实现,但是还是算是得心应手。而启发式搜索算法了解得就比较少了,只是在其它的课程中听老师讲过,并没有自己具体实现过,因此在这部分花了大量的时间。不过我也有所收获,以前一直以为估计方法只能使用一种,但在实训中发现可以多种估计方法一起使用,如此一来,只要合理的设置各个估计方法,便可以大大的提高搜索速度,提升效率。
实验总心得
这次实训历时几乎一个月,花费了我许多的精力和时间在其中,而我也从中收获了许多。虽然由于要进行体测的缘故,我没有能够按时的完成实训,但是还是在补交周完成了检查。回顾整个实训的过程,每个阶段安排的任务都是比较贴地气,使得我一个没有任何java基础的新手都能逐渐成长变成胜任各个阶段要求的学习者,并且每周的工作量都安排得十分合理,不会出现十分轻松或者不可能完成的情况,都是只要努力就能够完成。
实训到这周就结束了,虽然它并不简单,不过它还是给我带来了很多的收获,让我不再对java感到陌生,不再对java内容一无所知。很高兴自己能够完成这次实训,感谢TA们的辛苦陪伴和热心解答。