软件构造第二次实验报告——2
3.3.1ADT设计/实现方案
设计了哪些ADT(接口、类),各自的rep和实现,各自的mutability/ immutability说明、AF、RI、safety from rep exposure。
必要时请使用UML class diagram(请自学)描述你设计的各ADT间的关系。
3.3.1.1Piece
定义一个棋子,包括棋子所属的游戏类型(围棋/象棋),棋子类型(黑白/将相车卒等),棋子状态(未放置,待放置,已移除);
Filed:
Function:
Constructor:
3.3.1.2 Position
Filed:
Function:
public void setPosition(int x,int y)
修改横纵坐标
public int getPositionX()
public int getPositionY()
获取横纵坐标
public boolean equals(Position that)
判断两个Position相等
3.3.1.2.Player
玩家类,包括玩家的基本信息,以及玩家所拥有的棋子信息
Filed:
final private String name;
玩家的名字,不可更改
private Set<Piece> pieces=new HashSet<Piece>();
存储玩家拥有的所有棋子
private List<String> historyList=new LinkedList<String>();
顺序保存玩家在一局游戏里的走棋历史
Constructor:
Function:
getter
三个域的getter
public boolean addPiece(Piece newPiece)
添加一枚棋子,已经拥有返回false,否则添加并返回true
public boolean removePiece(Piece removePiece)
移除一枚棋子,不存在返回false,否则移除并返回true
public int getNumberOfPieces()
获取棋盘上属于自己的棋子数,即统计自己的棋子里pieceState为1的棋子数
public void addStep(Piece ex)
向historyList域中添加一个走棋步骤
3.3.1.4.Board
定义一个名为“棋盘”的类,在这个类里定义了棋盘的规格
Function:
Board,判断输入的string,生成相应的大小的棋盘,生成成功,返回真
Addpiece 在相应的点加入棋子,加入成功返回真值。
Getboard 返回棋盘二维数组
Gettype 返回相应的棋盘种类
Place_weather:判断相应的点有没有棋子
Removepiece:在输入的点移除棋子
3.3.1.5Action
Action类会解析game类的调用之后调用board执行具体操作。
Constructor:
Function:
public boolean eatpiece(Player player,int x1,int y1,int x2,int y2)
给定“棋手、两个位置横纵坐标”,将第一个位置上的棋子移动至第二个位置,第二个位置上原有的对手棋子从棋盘上移除。
需要处理异常情况,例如:
指定的位置超出棋盘的范围、第一个位置上无棋子、第二个位置上无棋子、两个位置相同、第一个位置上的棋子不是自己的棋子、第二个位置上的棋子不是对方棋子、等.
返回false。
否则,返回true。
public boolean movepiece(Player player,int x1,int y1,int x2,int y2)
给定“棋手、初始位置和目的位置的横纵坐标”,将处于初始位置的棋子移动到目的位置。
需要考虑处理各种异常情况,例如:
指定的位置超出棋盘的范围、目的地已有其他棋子、初始位置尚无可移动的棋子、两个位置相同、初始位置的棋子并非该棋手所有等,返回false
否则,将处于初始位置的棋子移动到目的位置,返回true。
public boolean putpiece(Player player,Piece piece,int x,int y)
给定“棋手、一颗棋子、指定位置的横坐标、指定位置的纵坐标”作为输入参数,将该棋手的该颗棋子放置在棋盘上
异常情况,例如:该棋子并非属于该棋手、指定的位置超出棋盘的范围、指定位置已有棋子、所指定的棋子已经在棋盘上等,返回false
否则,将棋子落在指定位置,返回true
public boolean removepiece(Player player,int x,int y)
给定“棋手、一个位置的横纵坐标”,将该位置上的对手棋子移除。
需要考虑处理异常情况,例如:该位置超出棋盘的范围、该位置无棋子可提、所提棋子不是对方棋子、等,返回false。
否则,移除棋子并返回true。
3.3.1.6Game
这是一个游戏类,用来创建一个棋盘游戏,并提供所有可能使用的功能
Rep:
有关constructor有几个比较重要的步骤:一是象棋的构建
二是围棋的构建:
其他的函数:
getter,以及四个动作:提子吃子落子移子都是通过action实现。
Printboard是打印棋盘
3.3.2.主程序MyChessAndGoGame设计/实现方案
辅之以执行过程的截图,介绍主程序的设计和实现方案,特别是如何将用户在命令行输入的指令映射到各ADT的具体方法的执行。
主函数:
通过键入读取
选择游戏类型
执行:
输入玩家姓名
执行:
轮到玩家一号选择,由于输入的是go,我们选择围棋行为
利用定义的count去实现控制权的转移 提供功能 1-8.
8表示end 1表示落子,2表示提子 3表查看棋子数量 可以选择查看用户1或者用户2 4 查看历史轨迹 5 返回棋盘 6查看某点 7交换控制权
之后在选择别的功能测试
可以看出当前棋盘上确实有两个玩家一的棋子,表达正确
可以看到确实满足历史
3.3.1ADT和主程序的测试方案
介绍针对各ADT的各方法的测试方案和testing strategy。
介绍你如何对该应用进行测试用例的设计,以及具体的测试过程。
3.3.1.1PieceTest
测试相等
测试set和get
测试是否越界
测试结果:
3.3.1.2Player
测试姓名
添加点以及移除
测试历史
测试结果为
3.3.1.3BoardTest
添加以及移除点
返回种类
测试结果:
3.3.1.4ActionTest
其他基本域的获取以及修改方法已经在之前进行了测试,所以我们在这里只真的action的四个动作进行测试
测试落子以及提子
测试移子以及吃子
测试结果: