软件构造4——lab2实验心得2

*******这回还是先贴一下我这回实验用的资源:(这次的非常少,因为该查的原来也都已经查过了)
java.lang.NullPointerException出现的几种原因以及解决
https://blog.csdn.net/qq_44543508/article/details/94589868
1.1 Re-implement the Social Network in Lab1
这个就是把lab2中在P1里面实现的Graph应用在Social Network上面,我们只需要在FriendshipGraph类里面利用Graph的方法依次实现几个方法就好了,最后能够完成向图中添加边和计算距离的任务。
1.1.1 FriendshipGraph类给出你的设计和实现思路/过程/结果。
1.1.1.1 addVertex(Person person)
如果图中已经有了person这个点,就直接返回false;没有person这个点,就在图中添加person这个点
1.1.1.2 addEdge(Person p1, Person p2)
判断图中是否有p1和p2这两个点,如果没有就直接返回false;看从p1发出的边之中有没有指向p2的边,有的话就不用添加了;如果没有的话,就添加这条边,weight全都设置成
1 1.1.1.3 getDistance(Person p1, Person p2)
判断图中是否有p1和p2这两个点,如果没有就直接返回-1;看p1和p2是否是一个点,如果name相同,就是自己到自己的路径长度,就返回0 接下来就是普通的bfs算法
1.1.2 Person类
存放名字:private String name;
在breadth-first search中是否被遍历过:private boolean visit;
1.1.3 客户端main()
就是lab1里面的main函数
1.1.4 测试用例
测试为了能不能加入中重复的点
测试能不能向图中加如重复的边
测试getDistance函数
1.1.5 提交至Git仓库
git add *
git commit -m “2020/3/19Commit”
git push -u origin master
1.2 Playing Chess
1.2.1 ADT设计/实现方案
1.2.1.1 Position类
immutable类
Abstraction function:get和set方法,Equals方法
Representation invariant:无
Safety from rep exposure:将类中所有的属性(变量)定义为private类型 棋盘上的横纵坐标都设置成private的
Constructor:(就是给横纵坐标赋值)
get和set方法:(获取和设置横纵坐标)
棋盘上的点相等的Equals方法:(当横纵坐标分别相等时才是相等) 1.2.1.2 Piece类
mutable类
Abstraction function:get和set方法
Representation invariant:无
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
棋子的名字(final private)
棋子的归属(final private)
棋子的状态:放置->1;未放置->0;移除->-1(private)
棋子的位置坐标(private)
Constructor:(要注意这里面要初始化Position,防止空指针,还要设置name和belong)
get和set方法:(获取name,belong,状态,位置;设置状态和位置) 1.2.1.3 Board类
mutable类
Abstraction function:create方法,initial方法,place,move,remove,eat方法
Representation invariant:棋盘大小为8
8,最多有32个位置能放棋子
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
棋盘的类型:0表示棋子下在格子中,1表示棋子下在点上(final private)
棋盘的大小(final private)
整个棋盘(private)判断有没有放棋子的信息(private)
Constructor:(这里面要注意有两种下棋的方式,一种是下在格子上,一种是下在交叉点上,棋盘的种类、大小、棋盘、放棋子判断分别初始化)
get方法:(获取棋盘的种类和大小)
得到具体位置上的棋子:(先判断坐标是否超出边界,如果超出边界就直接返回null,否则就直接返回当前位置的piece)
在具体位置上放上棋子:(先判断坐标是否超出边界,再判断当前位置是否已经有棋子了,否则才能在当前的位置放棋子)
设置isPut信息:(将当前的位置信息设置成false或者true)
看具体位置是否放置了棋子:(先判断坐标是否超出界限,否则直接返回当前的位置信息)
1.2.1.4 Player类
mutable类
Abstraction function:get和set方法,addPiece方法,removePiece方法,PieceonBoard方法,addHistory方法
Representation invariant:无
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
存储选手的名字(final private)
存储选手拥有的棋子(private Set)
存储玩家的游戏历史信息(private)
Constructor:(给玩家的名字赋值)
get和set方法:(获取玩家的名字和有用的所有棋子)
给玩家添加棋子:(先看玩家是否有这个棋子,没有的话就把这个棋子添加到玩家里)
给玩家移除棋子:(先看玩家是否有这个棋子,有的话就把这个棋子从这个玩家的棋子中移除)
获得玩家棋盘上的棋子总数:(这个是在最后才说要实现的功能,这个可以在棋盘上统计也可以在玩家上统计)
添加一次下棋的历史记录:
1.2.1.5 Action接口
根据游戏类型看是哪种游戏,有chess和go两种:(实现类似于P1的empty)
创建玩家:(游戏中的动作应该有给玩家设置姓名之类的操作) 创建棋盘:(根据游戏类型创建一个棋盘)
初始化:chess和go应该有两种不同的初始化形式,chess中的棋子应该最开始就在棋盘上,而go中的棋子应该在最开始的时候都不在棋盘上,棋子应该分配给两个玩家
放置棋子,player将棋子piece放在[x,y]的位置(要注意一些特殊情况:chess中没有这个操作,go中棋手是否拥有该棋子,位置坐标是否超出界限 ,棋子是否已经在棋盘上,这个位置是否已经有棋子)
移动棋子,player将[x1,y1]的棋子移动到[x2,y2]处(要注意一些特殊情况:go中没有这个操作,初始位置是否有棋子,chess中棋手是否拥有该初始位置的棋子,位置坐标是否超出界限 ,目的坐标位置是否已经有棋子)
移除棋子,player将[x,y]处的棋子移除(要注意一些特殊情况:棋手是否拥有该位置的棋子,位置坐标是否超出界限,该位置是否有棋子)
吃棋子,player将[x1,y1]处的棋子移动到[x2,y2]处,并吃掉[x2,y2]处的棋子(要注意一些特殊情况:go中没有这个操作,初始位置是否有棋子,chess中棋手是否拥有该初始位置的棋子,棋手是否拥有该目的位置的棋子,位置坐标是否超出界限,目的坐标位置是否已经有棋子)
然后在两个Action的类中对应实现就好了。
1.2.1.6 ActionChess类
mutable类
Abstraction function:create方法,initial方法,place,move,remove,eat方法
Representation invariant:棋盘大小为8
8,最多有32个位置能放棋子
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
棋盘大小为8
8(final protected static)
总共有32个位置能放棋子(final protected static)
两个玩家(private)
棋盘(private)
1.2.1.7 ActionGo类
mutable类
Abstraction function:create方法,initial方法,place,move,remove,eat方法
Representation invariant:棋盘大小为18
18,最多有361个位置能放棋子
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
棋盘大小为(18+1)
(18+1):(final private static)
总共有361个位置能放棋子:(final private static)
两个玩家(private)
棋盘(private)
1.2.1.8 Game类
mutable类
Abstraction function:create方法,initial方法,place,move,remove,eat方法Representation invariant:棋盘大小为8
8,最多有32个位置能放棋子
Safety from rep exposure:将类中所有的属性(变量)定义为private类型
动作(private)
玩家1和玩家2(private)
棋盘(private)
这个类里面的方法几乎跟Action里面一模一样,就不写细节了

你可能感兴趣的:(java)