软件构造第二次实验报告——2

3.3Playing Chess

 

​​​​​​​3.3.1ADT设计/实现方案

设计了哪些ADT(接口、类),各自的rep和实现,各自的mutability/ immutability说明、AF、RI、safety from rep exposure。

必要时请使用UML class diagram(请自学)描述你设计的各ADT间的关系。

​​​​​​​3.3.1.1Piece

 定义一个棋子,包括棋子所属的游戏类型(围棋/象棋),棋子类型(黑白/将相车卒等),棋子状态(未放置,待放置,已移除);

软件构造第二次实验报告——2

Filed:

软件构造第二次实验报告——2

Function:

Constructor:

软件构造第二次实验报告——2

软件构造第二次实验报告——2

软件构造第二次实验报告——2

软件构造第二次实验报告——2

​​​​​​​3.3.1.2 Position

软件构造第二次实验报告——2

Filed: 软件构造第二次实验报告——2

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

软件构造第二次实验报告——2

玩家类,包括玩家的基本信息,以及玩家所拥有的棋子信息

Filed:

final private String name;

玩家的名字,不可更改

private Set<Piece> pieces=new HashSet<Piece>();

存储玩家拥有的所有棋子

private List<String> historyList=new LinkedList<String>();

顺序保存玩家在一局游戏里的走棋历史

Constructor:

软件构造第二次实验报告——2

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

定义一个名为“棋盘”的类,在这个类里定义了棋盘的规格

软件构造第二次实验报告——2

软件构造第二次实验报告——2

Function:

软件构造第二次实验报告——2

Board,判断输入的string,生成相应的大小的棋盘,生成成功,返回真

Addpiece 在相应的点加入棋子,加入成功返回真值。

Getboard 返回棋盘二维数组

Gettype 返回相应的棋盘种类

Place_weather:判断相应的点有没有棋子

Removepiece:在输入的点移除棋子

​​​​​​​3.3.1.5Action

Action类会解析game类的调用之后调用board执行具体操作。

软件构造第二次实验报告——2

Constructor:

软件构造第二次实验报告——2

Function:

软件构造第二次实验报告——2

public boolean eatpiece(Player player,int x1,int y1,int x2,int y2)

 给定“棋手、两个位置横纵坐标”,将第一个位置上的棋子移动至第二个位置,第二个位置上原有的对手棋子从棋盘上移除。

需要处理异常情况,例如:

指定的位置超出棋盘的范围、第一个位置上无棋子、第二个位置上无棋子、两个位置相同、第一个位置上的棋子不是自己的棋子、第二个位置上的棋子不是对方棋子、等.

返回false。

否则,返回true。

软件构造第二次实验报告——2

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

这是一个游戏类,用来创建一个棋盘游戏,并提供所有可能使用的功能

软件构造第二次实验报告——2

Rep: 软件构造第二次实验报告——2

软件构造第二次实验报告——2

有关constructor有几个比较重要的步骤:一是象棋的构建

软件构造第二次实验报告——2

二是围棋的构建:

软件构造第二次实验报告——2

其他的函数:

软件构造第二次实验报告——2getter,以及四个动作:提子吃子落子移子都是通过action实现。

Printboard是打印棋盘

 

​​​​​​​3.3.2.主程序MyChessAndGoGame设计/实现方案

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

主函数:

软件构造第二次实验报告——2

软件构造第二次实验报告——2 通过键入读取

软件构造第二次实验报告——2

选择游戏类型

执行:软件构造第二次实验报告——2

软件构造第二次实验报告——2

输入玩家姓名

执行:软件构造第二次实验报告——2

轮到玩家一号选择,由于输入的是go,我们选择围棋行为

 

软件构造第二次实验报告——2

利用定义的count去实现控制权的转移 提供功能 1-8.

软件构造第二次实验报告——2

8表示end 1表示落子,2表示提子 3表查看棋子数量 可以选择查看用户1或者用户2 4 查看历史轨迹 5 返回棋盘 6查看某点 7交换控制权

软件构造第二次实验报告——2

之后在选择别的功能测试

软件构造第二次实验报告——2

可以看出当前棋盘上确实有两个玩家一的棋子,表达正确

软件构造第二次实验报告——2

可以看到确实满足历史

 

 

​​​​​​​3.3.1ADT和主程序的测试方案

介绍针对各ADT的各方法的测试方案和testing strategy。

介绍你如何对该应用进行测试用例的设计,以及具体的测试过程。

​​​​​​​3.3.1.1PieceTest

 软件构造第二次实验报告——2 测试相等

软件构造第二次实验报告——2 测试set和get

软件构造第二次实验报告——2 测试是否越界

测试结果:

​​​​​​​3.3.1.2Player

软件构造第二次实验报告——2 测试姓名

软件构造第二次实验报告——2 添加点以及移除

软件构造第二次实验报告——2 测试历史

测试结果为

软件构造第二次实验报告——2

​​​​​​​3.3.1.3BoardTest

软件构造第二次实验报告——2 添加以及移除点

软件构造第二次实验报告——2 返回种类

测试结果:

​​​​​​​​​​​​​​3.3.1.4ActionTest

其他基本域的获取以及修改方法已经在之前进行了测试,所以我们在这里只真的action的四个动作进行测试

软件构造第二次实验报告——2 测试落子以及提子

软件构造第二次实验报告——2 测试移子以及吃子

测试结果:软件构造第二次实验报告——2软件构造第二次实验报告——2