大二实训总结报告

大二实训总结报告

@author: SYSUcarey
@date: 2018-05-06
@blog: https://blog.csdn.net/cbb944131226
@github: https://github.com/SYSUcarey/Software-Development-Training2
@本人学院

  • 大二实训总结报告
  • 阶段一
    • 实验介绍
    • 实验感想收获
    • 实验结果
  • 阶段二
    • 实验介绍
    • 实验感想收获
    • 实验结果
  • 阶段三
    • 实验介绍
    • 实验感想收获
    • 实验结果
  • 更多



阶段一

实验介绍

实验目的:
为本次实训项目做基本的技术准备,学会使用Vi(or) VimJAVAAntJunitsonar-qube,以及熟悉GridWorld的使用。

实验内容:
1.学习ViVim编辑器的使用,包括Vim更人性化的配置、命令模式下的各种命令的学习和熟悉。
2.配置JDK,配置JAVA环境变量,学会在终端下编译并运行简单的JAVA代码文件——HelloWorld.java
3.学习Ant的使用,学习利用Ant进行代码的编译、运行、生成Jar包。
4.用JAVA完成简单的计算器设计。
5.学习使用Junit来进行对Java文件的测试。
6.学习使用sonar-qubeJava文件进行规范性检查。


实验感想收获

遇到的最主要的问题:
在学习Junit的使用的时候,需要引用Junit-4.9.jar包对Test.java进行编译运行,一开始接触,并不知道如何去引用。
解决方法:
我们有两种方法:
1.如果还没有配置环境变量,那么可以用-classpath路径引用junit-4.9.jar进行编译。
我们先把junit-4.9.jar放进src文件夹内,然后在终端下:

javac -classpath .:junit-4.9.jar HelloWorldTest.java
java -classpath .:junit-4.9.jar org.junit.runner.JUnitCore HelloWorldTest

大二实训总结报告_第1张图片

如果junit-4.9.jar不在src内也可以通过相对路径去引用它,例如如果它在上图图片中文件结构的Desktop目录下.

javac -classpath .:../../../junit-4.9.jar HelloWorldTest.java
java -classpath .:../../../junit-4.9.jar org.junit.runner.JUnitCore HelloWorldTest

大二实训总结报告_第2张图片

2.如果已经配置好了环境变量,我们直接在Terminal敲下命令编译HelloWorldTest即可:

javac HelloWorldTest.java
java org.junit.runner.JUnitCore HelloWorldTest

大二实训总结报告_第3张图片


实验结果

1.@阶段一实验报告
2.@代码文件



阶段二

实验介绍

实验目的:
进行GridWorld项目的探究,熟悉GridWorld项目的整个文件结构和运行结构。特别是熟悉关于:
·各种Grid的布局设计,以及各种各样的成员类的实现。

实验内容:
1.熟悉各种不一样的基础成员类:ActorBugRockFlower等的实现方法,它们的行为表现和实现方法。
2实现各种复杂一点继承成员类:ZBugBlusterCritterKingCrabQuickCrab等,它们的行为决定了它们如何去实现它们的Override方法。
3.实现不一样的Grid布局,包括BoundedGridUnboundedGrid,可以通过节点SparseGridNode + ArrayList<>\ Array[]来实现,可以通过`LinkedList实现,可以通过HashMap来实现,也可以通过TreeMap实现,比较这几种方式实现的优劣,以及它们实现的复杂度。
4.完成与项目相关的多个问答题。


实验感想收获

Part2的代码部分其实不难,只要认真思考它行为的逻辑,就容易写出相应的代码。
比较麻烦的是问答题的完成,因为要贴源码,所以非常棘手,花费的时间很多。
这一部分最大的收获其实还是JunitTest.java代码文件。
虽然上一个学期学的是Java专选课,不过并没有学习到Junit的相关知识,其实在Test.java里面的@Test测试函数里面,也可以通过实例化对象进行操作,从而得到自己想要比较的两个值,然后校验。
下面举一个例子:
JumperTest.java文件中,对于Jumperact()函数的测试,由于act()函数涉及到的逻辑比较复杂,所以分成了好几个cases。在每一个cases下,都用一个@Test测试函数来测试,例如下面的这种情况:
Test act() method in case5
Question:
What will a jumper do if it encounters another jumper in its path?
Answer:
(A) If the two jumpers jump for the same location, we excepted that the first jumper will take the location and the other one turn right of 90 degrees.
(B)If the two jumpers just jump by, which means they don’t jump to the same location, we excepted that they can both jump to their own locations.

Test Code:

//@file: JumperTest.java
//@TestFunction: testActFive()

//jump for same location:
world.add(new Location(6, 4), alice);
world.add(new Location(3, 4), bob);
bob.setDirection(Location.SOUTH);
alice.act();
bob.act();
assertEquals(new Location(4, 4), alice.getLocation());
assertEquals(new Location(5, 4), bob.getLocation());
//jump by
bob.moveTo(new Location(0, 4));
int direction = (alice.getDirection() + Location.RIGHT)%360;
bob.act();
alice.act();
assertEquals(new Location(2, 4), bob.getLocation());
assertEquals(direction, alice.getDirection());

实验结果

1.@问答题
2.@Part3测试文档报告
3.@Part3设计文档报告
4.@代码文件



阶段三

实验介绍

实验目的:
基于GridWorld项目下的拓展项目:图像处理、迷宫、拼图。

实验内容:
1.图像处理:
利用课程网页上提供的实验软装置ImageReader_code.zip和测试图片集bmptest.zip简单实现和测试一个利用二进制流读取Bitmap图像,并且能够进行简单的色彩处理和保存的软件。

2.迷宫:
基于GridWorld项目下,利用深搜算法和启发式算法,让虫子MazeBug走出迷宫。

3.拼图:
N-数码问题,利用广搜算法和Astar算法(启发函数)来完成拼图任务。


实验感想收获

这一阶段的任务其实基本上与GridWorld没有太大的关系了。
收获是我认为三个阶段中最大的:

收获一:
了解了Bitmap图片文件的文件存储结构:
https://blog.csdn.net/sjzlxd/article/details/3923907
了解如何通过 FileInputStream读取Bitmap文件信息到一个byte[]数组。
了解色彩通道的提取,了解像素的RGB值。

收获二:
深入学习了解深度优先搜索算法:
1.先将树的所有节点标记为”未访问”状态。
2.输出起始节点,将起始节点标记为”已访问”状态。
3.将起始节点入栈。
4.当栈非空时重复执行以下步骤:

a. 取当前栈顶节点。

b. 如果当前栈顶节点是结束节点(迷宫出口),输出该节点,结束搜索。

c. 如果当前栈顶节点存在”未访问”状态的邻接节点,则选择一个未访问节点,置为”已访问”状态,并将它入栈,继续步骤a。

d. 如果当前栈顶节点不存在”未访问”状态的邻接节点,则将栈顶节点出栈,继续步骤a。

收获三:
深入学习了解广度优先搜索算法
1.将起始节点放入一个open列表中。
2.如果open列表为空,则搜索失败,问题无解;否则重复以下步骤:

a. 访问open列表中的第一个节点v,若v为目标节点,则搜索成功,退出。

b. 从open列表中删除节点v,放入close列表中。

c. 将所有与v邻接且未曾被访问的节点放入open列表中。

收获三:
接触用估价函数实现Astar算法。

并且可以同时使用多个估价方法,f(n) = a*f1(n) + b*f2(n) + … 通过适当调整权重(a,b,…),能够加快搜索速度.

以拼图部分中我使用的估价函数为例子:
一开始用的f(n) = ManhattanDis + EuclideanDis + ChebyshevDis
后来发现这个估价方法虽然能满足课程题目的要求,但并没有特别有效地提高拼图解决效率。
后来改用f(n) = ManhattanDis * 2 + s + EuclideanDis,相比较之下,效率更高。

/**
     *(Demo+实验二)计算并修改状态节点jNode的代价估计值:f(n)
     * 此函数会改变该节点的estimatedValue属性值
     * 修改此函数,可在Solution类中添加其他函数,属性
     * @param jNode - 要计算代价估计值的节点
     */
    public void estimateValue(JigsawNode jNode) {

        int s = 0; // 后续节点不正确的数码个数
        int dimension = JigsawNode.getDimension();
        for (int index = 1; index < dimension * dimension; index++) {
            if (jNode.getNodesState()[index] + 1 != jNode.getNodesState()[index + 1]) {
                s++;
            }
        }
        jNode.setEstimatedValue(s);

        int len = (int)(Math.sqrt(jNode.getNodesState().length - 1));
        //int dimension = JigsawNode.getDimension();
        int ManhattanDis = 0;
        int EuclideanDis = 0;
        int ChebyshevDis = 0;
        for (int i = 1; i <=  dimension*dimension; i++) {
            for (int j = 1; j <= dimension*dimension; j++) {
                if (jNode.getNodesState()[i] != 0 && jNode.getNodesState()[i] == this.endJNode.getNodesState()[j]) {
                    int x1 = (i-1) / len;
                    int y1 = (i+4) % len;
                    int x2 = (j-1) / len;
                    int y2 = (j+4) % len;

                    int abs_x = (x1 > x2) ? (x1-x2) : (x2-x1);
                    int abs_y = (y1 > y2) ? (y1-y2) : (y2-y1);  

                    ManhattanDis += (int)(abs_x + abs_y);
                    ChebyshevDis += (int)(Math.max(abs_x, abs_y));
                    EuclideanDis += (int)(Math.sqrt(abs_x * abs_x + abs_y * abs_y));
                    break;
                }
            }
        }
        int aver = ManhattanDis * 2 + s + EuclideanDis;// + ChebyshevDis;
        jNode.setEstimatedValue(aver);
    }

实验结果

1.ImageReader.README
2.MazeBug.README
3.@代码文件



更多

总感想:
这一次实训历时四个周末,期中有一个周末是五一放假。严格来说其实是三个周末的实训时间。无一例外每一个周末都是在凌晨四点的星光下入眠,庆幸地是能准时地完成实训的每一项任务。感觉实训放在学期中的周末很不科学,因为本身大二下课程就多,作业也非常多,又选上了一个要命的专选课,所以这四周来,熬夜到两点以后的天数比不熬夜的天数要多很多,学习节奏很快,过的非常非常充实。

实训的收获还是很多的,希望自己实训过后,能回望自己的代码,回顾自己学到的知识,温故而知新。很开心终于来到这次实训的最后一个节点,感谢TA们的热心解答,以上。

项目代码
Talk is cheap, show you the code.

你可能感兴趣的:(实训)