软件构造lab2部分问题要点总结

3.1 Poetic Walks
完善 Graph 接口类,并运用泛型的思想,将 String 拓展为泛型 L 类;
● 实现 Graph 类的方法:add、set、remove、vertices、sources、targets;
● 利用实现的 Graph 类,应用图的思想,实现 GraphPoet 类,如果输入的
文本的两个单词之间存在桥接词,则插入该桥接词;若存在多个单一桥
接词,则选取边权重较大者。简而言之就是完成诗歌的润色

3.1.1 Get the code and prepare Git repository
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
上不了github从老师那里直接拿到了所需的代码部分,作业上交通过邮箱

3.1.2 Problem 1: Test Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
先要求写测试用例,然后依此实现具体方法,故先完成测试用例的编写
静态测试方法在所给的test的GraphStaticTest.java中,实例测试方法则是在test的GraphInstanceTest.java中。
GraphInstanceTest里需要针对Graph的不同实现编写具体的测试类且需要继承GraphInstanceTest类
查看Graph类的接口规约可以写出各个测试类,而且因为你没写实现,测试是无法通过的。类似先写好答案没写题目?

3.1.3.1 Implement ConcreteEdgesGraph
ConcreteEdgesGraph是对Graph的一个具体实现。类中各个部分作用如下
Set:储存所有的顶点
List:储存所有的边(边的类Edge要自行完成,同时边的类型不可变,需要吧source与target和weight设置为final来保证安全的同时保证不被修改)
Edge类和ConcreteEdgesGraph类都要实现toString()方便测试输出。
坑点:使用remove删顶点时不单单需要在set删除那个点还需要把和它有关系的点处理了,即遍历Edges来删除与该点有关系的边。

3.1.3.2 Implement ConcreteVerticesGraph
ConcreteVerticesGraph是Graph的具体实现,类使用List来储存顶点,定点类Vertex要自己实现,要求不能修改它的属性,只能加入一个Map来描述顶点与边的关系,所以实现的是类似邻接表的结构
add:先判断vertices中有没有这个点,如果没有就new一个vertex加进去。
set:仍然是分那几种情况考虑,区别是在更改边时要通过更改点的属性,而不是在图里操作。
remove:遍历vertices中的每个点,如果当前点是要删的v,把他从vertices删掉,如果不是,遍历当前点的边,如果有跟v相关的点都要删去。
vertices:遍历vertices把所有点放在一个集合。
targets:这个很好写,因为我们设计Vertex类时就是这么做的,首先遍历vertices找到目标点然后把他的edges属性返回
sources:正好跟我们设计Vertex类时的想法相反,所以比较麻烦。需要遍历vertices,对于每一个点都要遍历他的edges属性,寻找目标点v,如找到就把当前点和weight放到map。

3.1.4 Problem 3: Implement generic Graph
前两个具体实现类基于String类型具体实现,无法通用,只有使用范型才可以。

3.1.4.1 Make the implementations generic
接之前,Graph是用String来存储的,具有一定局限性,我们想用各种类做图的顶点、边就能在任何地方使用。所以使用泛型L,根据之前的进行一点修改就可以了。所以就是把声明里的String改成L

3.1.4.2 Implement Graph.empty()
实现Graph中的静态方法empty()方法,创建一个空的Graph,由于无法创建接口,只得创建实现类,所以只需要选择一个Graph的实现类,实例化之后返回即可。

3.1.5 Problem 4: Poetic walks
使用以上实现的图结构,根据现有的语料库构建图模型,对输入的文本进行润色。详细说就是把一句诗看成由词语构成的图,诗歌中出现的词语就是点,两个词挨在一起就是一条边,词语出现的次数就是权重

3.1.5.1 Test GraphPoet
先写test,对于constructor,编写一个测试文档,看是否能生成一个正确的graphPoet即可。但要强一点,增加一些特殊情况,比如某边多次出现。出现了环,出现了回退边等等。
对于poem,要检测,他是否能根据某一输入得到正确的诗句。测试样例应包括,可以添词,不可以添词,大小写,多种添词可能,等几种情况。

3.1.5.2 Implement GraphPoet
实现GraphPoet类,主要需要实现两个方法,一个是GraphPoet类的构造方法,构造方法参数为一个File,代表了语料库文件,构造方法用于通过语料库中的语句构建一个图结构,存储语料库中的单词关系,忽略大小写。
poem方法是根据已生成的语料库,把你的输入丰富变成一首诗。插入单词的原则是,对于输入,A B,寻找是否存在点C,使得AC,CB两条边都存在,如果存在多个C,则选择一个AC和CB权重之和最大的。

3.1.5.3 Graph poetry slam
该问题要求修改main()方法,使用不同的输入对程序进行测试,也可以自定义语料库。

3.2 Re-implement the Social Network in Lab1
和lab1的那个使用图结构表示社交网络关系的问题有关系,这个问题是之前那个的重新实现,复用即可。

3.2.1 FriendshipGraph类
给出你的设计和实现思路/过程/结果。FriendshipGraph类是描述社会关系的图结构,多数方法可以在ConcreteGra类有对应的接口。
坑点:实现getDistance()方法,需要使用更加合适的储存方法。

3.2.2 Person类
和原来的基本一样,添加了一个静态的ArrayList用于存储name,这样即可判断是否有name相同的Person。

3.2.3 客户端main()
Main()使用之前的示例代码

3.2.4 测试用例
还是之前的测试用例主要新加入了测试getDistance()的方法

3.3 Playing Chess
3.3.1 ADT设计/实现方案
设计了哪些ADT(接口、类),各自的rep和实现,各自的mutability/ immutability说明、AF、RI、safety from rep exposure。
必要时请使用UML class diagram(请自学)描述你设计的各ADT间的关系。

  1. Action类
    方法:checkMovePiece、checkEatPiece
    checkMovePiece:
    调用Position的checkPosition来检查是否越界,调用Board的getBoardOccupation函数来检查position是否以及被谁占用。
    合法条件:原来坐标由该选手占有,且移动位置无人,不越界。
    CheckEatPiece:
    调用Position的checkPosition来查看是否越界,调用Board的getBoardOccupation来检查position是否,以及被谁占用。
    合法条件:原来坐标由该选手占有,且移动位置被对手占有,不越界

  2. Board类
    属性:
    goBoard1 Boolean,用于储存棋盘的占用情况,true占用,false没被占用
    goBoard2 Boolean,用于储存棋手的占用情况,true占用,false没被占用
    chessBoard1 Boolean,用于储存棋盘的占用情况,true占用,false没被占用
    chessBoard2Boolean,用于储存棋手的占用情况,true占用,false没被占用
    方法:
    Board:初始化数组
    setGoBoard:在围棋棋盘上下棋
    deleteChessBoardPiece:把棋子从棋盘上删除
    addChessBoardPiece:把棋子的坐标表示到棋盘上
    getOccupation:对于给定坐标进行判断是否被占用
    getOccupationPlayer:对于给定坐标判断被谁占用
    checkOccupation:检查某位置的占用情况

  3. Game类
    属性:
    Map<String, String> map用于输出棋盘时,将英文名字转化为中文名
    Board goBoard = new Board(2)围棋棋盘
    Board chessBoard = new Board(1)象棋棋盘
    Player player1选手 1
    Player player2选手 2
    List allPieces1 = new ArrayList<>()玩家一所有棋子
    List allPieces2 = new ArrayList<>()玩家二所有棋子
    String player1History = ""玩家一的游戏历史
    String player2History = “” 玩家二的游戏历史
    方法:
    public Game(int gameTye):如果是象棋,则添加出初始的 32 个棋子
    showGoMenu:输出围棋菜单选项
    showChessMenu:输出象棋菜单选项
    placePiece:在围棋棋盘上落子
    checkPlacePiece:检查待落子坐标是否合法
    extractPiece:在围棋棋盘上提子
    checkExtractPiece:检查待提子位置坐标是否合法
    movePiece:在象棋棋盘上移子
    eatPiece:在象棋棋盘上吃子
    showHistory:输出玩家游戏历史
    setPlayer1/setPlayer2:设置玩家一/玩家二
    getPlayer1/getPlayer2:得到玩家一/玩家二
    getBoard:得到棋盘情况
    getPiecesSize:得到棋子数目
    getPieceByPosition:根据 Position 得到 Piece
    changeHistory:改变玩家历史记录
    printBoard:打印输出象棋或者围棋棋盘

  4. MyChessAndGoGame类
    整体使用switch语句,根据输入的数字进行功能的实现,象棋和围棋的有所不同,在3.3.2有详细说明。

  5. Piece类

属性:
Position piecePosition = new Position()棋子的坐标
String pieceName = new String()棋子的类别
Boolean player棋子的拥有者:true 表示为棋手 1

方法:
Piece:初始化一颗棋子
setPiecePosition:设置棋子的坐标
setPlayer:设置棋子的拥有者
getPiecePosition:得到坐标
getPlayer:得到棋子的拥有者
getPieceName:得到棋子的名字
setPieceName:设置棋子的名字

  1. Player类
    属性:
    String playName玩家的姓名
    方法:
    Player:设置玩家姓名
    getPlayerName:返回玩家的姓名

  2. Position类

属性:
int px = -1横坐标
int py = -1纵坐标
方法:
setPosition:设置坐标属性
getPx:得到横坐标
getPy:得到纵坐标
positionEqual:判断
position:和当前位置是否重合
(override)toString:重写
toString checkPosition:检查坐标是否越界,不在棋盘范围内

3.3.2 主程序MyChessAndGoGame设计/实现方案
辅之以执行过程的截图,介绍主程序的设计和实现方案,特别是如何将用户在命令行输入的指令映射到各ADT的具体方法的执行。

  1. 读入游戏类型(象棋或者围棋):chess or go
  2. 读入玩家名称:玩家1以及玩家2
  3. 读入输入指令
    象棋:1移动2吃3跳过4结束5查看棋盘6历史7查询占用8查询棋子总数
    围棋:1落子2提子3跳过4结束5查看棋盘6历史7调查占用8查询棋子总数
  4. 实现玩家进行游戏:通过的输入的奇偶数确定玩家
  5. 输出棋盘:实现相应的指令后可以输出棋盘进行查看
  6. 读取坐标:先读取横坐标,然后读取纵坐标

3.3.3 ADT和主程序的测试方案
介绍针对各ADT的各方法的测试方案和testing strategy。
介绍你如何对该应用进行测试用例的设计,以及具体的测试过程。
Game类测试如下
Test strategy for Game.checkPlacePiece
坐标越界+不越界
坐标位置已被占用+未被占用

Test strategy for Game.checkExtractPiece
坐标越界+不越界
坐标位置已被对手占用+未被对手占用

Test strategy for Game.movePiece
坐标越界+不越界
坐标位置已被对手占用+未被对手占用
目标位置已被占用+未被占用

Test strategy for Game.eatPiece
坐标越界+不越界
起始棋子非己方+是己方
目标棋子非敌方+是敌方

Board测试:

Test strategy for deleteChessBoardPiece
删除后棋盘上显示为未被占用

Test strategy for deleteChessBoardPiece
添加后后棋盘上显示为被占用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值