summaryreport.md

2019年中山大学软件工程中级实训报告

阶段一:项目启动

java小程序

编写一个Java小程序:功能就是简单的计算器,如下图。参考内容可阅读Java的组件GUI设计部分以及基础Java知识。
计算器图片
这个主要是用java swing实现的,涉及到网格布局、组件使用(如JButton, JTextField, JLable)和一些按钮事件的处理。需要注意的是,读入非数字内容和除以0这两个的实现,当然,还有就是展示的时候为了美观,需要截断小数点。

环境配置

配置环境真的很坑,不过最后还是配成功了,主要还是看实训网站上的资料以及网上的一些说明,配置的环境有ant, sonar等。
ant的目的在于简化编译运行的过程,防止每次运行都输入一大堆javac, java语句,但是如果使用eclipse,同样可以直接运行,不得不说ant有点鸡肋了。
sonar是对语法进行检测,比如if, else这些分支语句如果没有使用{},又或者注释,都会出现提示。反正最后sonar评测分数必须达到60,越高越好,也算是对自己编程规范的一个改正了。

Part1

第一部分主要是运行一下项目,并且对项目的一些原理进行阐述回答,主要根据问题回答,比如问题询问Bug遇到Rock会怎么样,运行一下看就知道Bug会转弯了。

阶段二:基本任务

Part2

Part2其实是对Bug的运行方式进行改变。有些Bug走圆形,有些Bug走Z形。它的主要规则如下,如果能往前走,就往前走;否则,转弯。比如圆形,我们只需要要求它每走几步,转一次弯(45度)就行了;Z形也是如此,不过是转两次弯,弯角也不一样。其它bug类似。

public void act()
{
    if (canMove())
        move();
    else
        turn();
}
Part3

这个部分要求实现一个Jumper,与Bug不同的是,它每次需要走两个格子。所以它的语法与Bug略有不同,比如canMove函数中,检查的是下下个格子,而不是下个格子。移动的时候,移动到下下个格子,而不是下个格子。

Part4

这个部分实现了各种Critter,Critter扩展了Actor的功能,它能够观察(得到周围的Actor),能够对周围环境做出反应(比如吃掉其它Critter),最后它也有独特的行走方式(比如Crab是横着走的)。
这些功能在以下函数进行实现

ArrayList<Actor> getActors();
void processActors(ArrayList<Actor> actors);
ArrayList<Location> getMoveLocations();
Location selectMoveLocation(ArrayList<Location> locs);
void makeMove(Location loc);
Part5

这个部分是对有界网格和无界网格的实现。用不同的数据结构存储含有Actor的位置(二维数组、LinkedList、HashMap、TreeMap ),保证地图功能能够正常运行,并且比较不同数据结构之间的优劣性。比如在大的稀疏的无界网格中,Map的空间利用率明显优于二维数组,并且遍历网格时的速度也比较快

阶段三:扩展任务

ImageProcessing

这个部分要求我们掌握一些位图的知识,并对位图做一些处理,包括图片读写、色彩通道的提取、灰度化图像。以二进制方式获取图片,并且根据每个字节含义的不同进行处理。比如第18-21个字节是图片宽度(每行像素个数)。获取图片信息之后,转为Image。
如果要获取Image每个像素的值,需要使用BufferedImage(int width, int height, int imageType)的方法,然后通过GetRGB获取像素值,然后转为红绿蓝的值。
需要注意的是转为灰度图的时候每种颜色的比重不同,I = 0.299 * R + 0.587 * G + 0.114 *B,其中R,G,B分别为红、绿、蓝通道的颜色值。

MazeBug

本实验要求同学们在改进的Grid World软件装置中实现深度优先搜索算法,从而使虫子走出迷宫。
深度优先算法的原理很简单,相信大家都耳熟能详了,不过需要注意的是优化虫子走的路线。通过为四个方向增加比重系数,即每走一步比重加一,可以较好的为虫子选择出一条比较好的路径。

N-Puzzle

这是一个拼图问题,包括33和55两种类型,需要使用广度优先(BFS)和A* 算法实现。
广度优先很简单,每走一步,判断是否复原,如果是则结束;否则,将周围位置放入列表中(注意不要重复添加位置进入列表!),一直到终点或者列表为空(列表为空代表无法复原,当然,实验文件中的拼图都是能够拼出来的,不存在复原不了的问题)
A*算法的流程已经被实现好了,我们需要做的就是修改价值函数,从而选择价值最优的下一节点,减少搜索次数。所谓价值(或称代价),主要从三个方面出发:

  1. 所有 放错位的数码 个数
  2. 所有 放错位的数码与其正确位置的距离 之和
  3. 后续节点不正确的数码个数

总结

总的来说,这次的实训还是比较简单地,实现的功能也并不复杂,说明文档也比较详细。通过这次实验,我重温了java的语法,重温了GUI、extends、interface这些知识,并且最重要的是,我从GridWorld中了解到一个好的项目所应该具备的层次结构。
此外,此次实训还涉及到一些常用算法(BFS, DFS, A*)和一些文件、图片处理的知识,这让我收获颇丰。
最后,非常感谢各位老师和TA辛勤的劳动,希望我也能变得和你们一样优秀!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值