2020-11-17

中级实训总结报告

这次中级实训主要分成了三个部分:

阶段一:项目启动。

主要内容包括熟悉JAVA、Ant、Junit环境,尝试编写Java小程序,学习和配置SonarQube,编译运行GridWorld中的BugRunner,以及回答Part1的问题和练习。
这部分在阶段一的自学报告中已经总结过了,这里附上我上次已经写过的阶段一报告:阶段一报告

编译运行GridWorld中的BugRunner:BugRunner实际是写一个main函数来测试所写的Bug类的功能,然后通过操作观察Bug的实现。后面会通过Junit单元测试测试接口更加方便。

阶段二:基本任务。

这阶段包括Part2、Part3、Part4、Part5
Part2
这一部分主要是熟悉各种不一样的基础成员类:Actor、Bug、Rock、Flower等的实现方法,它们的行为表现和实现方法。要熟悉Bug类的各种操作,进行继承类函数接口的重写问题,比如对act()、move()等函数进行重写,让拓展的Bug有新的实现。这部分比较简单。

Part3
这一部分的主要难点在于Jumper的各种边界条件问题,需要在编写Jumper类对act()、move()等函数进行重写。相比于Part1这部分要学会运用阶段一学到Junit来写测试单元对Jumper类中予以检验。这里是一个
Junit测试单元学习教程

Part4

这一部分主要是实现各种复杂一点继承成员类:ZBug、BlusterCritter、KingCrab、QuickCrab等,它们的行为决定了它们如何去实现它们的Override方法。拓展各种Critter的类型,基本功能不算太困难,只需要考虑的特殊情况,比如Critter被两层Actor围起来会怎么样等等。但是要考虑的比较多,代码量也不小,需要考虑清楚后耐心打代码就可以解决了。

Part5
这部分实现不一样的Grid布局,包括BoundedGrid和UnboundedGrid,可以通过节点SparseGridNode + ArrayList<>\ Array[]来实现,可以通过`LinkedList实现,可以通过HashMap来实现,也可以通过TreeMap实现,比较这几种方式实现的优劣,以及它们实现的复杂度。难点和之前不同,之前的难点主要在于功能的实现和边界条件的考虑,这一部分的难点主要在于程序空间和时间复杂度。
做法就是使用高效率的数据结构,如节点数组、HashMap等。然后尽量通过高效的数据结构来降低get()、put()等函数的时间复杂度。

阶段二总结:阶段二字主要还是考验只需掌握Java 基本语法知识,然后动手编程就可以了,耐心理解Bug基本内容,然后根据要求写接口实现,进行单元测试,代码检查就可以,难度还是在于代码量比较大,需要耐心干就完了。

阶段三:拓展任务。

ImageProcessing

这次的任务不再使用到gridworld.jar,主要的难点变为了理解Bitmap文件结构,并使用二进制流读取Bitmap文件,然后在三个色彩通道进行操作。利用课程网页上提供的实验软装置ImageReader_code.zip和测试图片集bmptest.zip简单实现和测试一个利用二进制流读取Bitmap图像,并且能够进行简单的色彩处理和保存的软件。
了解了Bitmap图片文件的文件存储结构,了解如何通过 FileInputStream读取Bitmap文件信息到一个byte[]数组,了解色彩通道的提取,了解像素的RGB值。学习教程:Bitmap教程

MazeBug

这部分主要难点在于理解深度优先搜索以及完成进阶部分:增加方向的概率估计。
深度优先搜索的基本步骤是先将树的所有节点标记为”未访问”状态。然后输出起始节点,将起始节点标记为”已访问”状态。再将起始节点入栈。并且当栈非空时重复执行以下步骤:
a. 取当前栈顶节点。
b. 如果当前栈顶节点是结束节点(迷宫出口),输出该节点,结束搜索。
c. 如果当前栈顶节点存在”未访问”状态的邻接节点,则选择一个未访问节点,置为”已访问”状态,并将它入栈,继续步骤a。
d. 如果当前栈顶节点不存在”未访问”状态的邻接节点,则将栈顶节点出栈,继续步骤a。

深度优先搜索: 增加方向的概率估计主要是要用一个数组来储存4个方向的概率,然后每当之前向上、下、左、右移动一次,就在数组对应的概率上加1,然后在每次选择方向时根据数组来决定各方向概率。

N-Puzzle

这一部分的主要难点在于广度优先搜索算法和启发式搜索算法。

广度优先搜索算法主要步骤是先将起始节点放入一个open列表中,然后如果open列表为空,则搜索失败,问题无解;否则重复以下步骤:
a. 访问open列表中的第一个节点v,若v为目标节点,则搜索成功,退出。
b. 从open列表中删除节点v,放入close列表中。
c. 将所有与v邻接且未曾被访问的节点放入open列表中。

总结与感悟

三个阶段由简入深,是一种很好的实践方法,但是由于此前没有学过Java,虽然在实训中遇到了许多困难,但ta与同学的帮助下还是勉强完成实训。Java的面向对象编程的特性,将所有方法和成员变量都用类封装好了,然后通过jar包的方式来调用,比起C/C++变得非常的方便。Java的Junit测试,会让人从不同的角度来思考代码的构成,从怎样搭建代码变成了怎样攻击才能让代码出现Bug,非常有趣和新颖。而sonarqube也从新的规范角度教会了我怎么提升代码质量,让代码变得可读、健壮。与大一的初级实训相比,这次的中级实训是一个完整的项目开发过程,而且注重良好的代码习惯和结果检查,拓展了一些高级算法。而且是在一个已经搭建好的平台gridworld上进行再次开发,也更接近实际情况,更贴近面向对象的开发过程。
通过这次实训让我有机会学习Java这门语言,并学会运用Java进行项目开发,了解了面向对象的开发流程,可谓受益颇多。在这个过程中,虽然困难重重,但是学到了许多新的东西,进一步提高了编程基础。最后由衷感谢ta们在整个过程中的学习指导与帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值