软件构造lab2问题3ADT设计总结

这里直接开始实验三吧,题目要求蛮长的,简单的说完成ADT设计,最终实现能够进行国际象棋和围棋的游戏。

先提纲挈领,ADT设计为了防止表示暴漏,不能将内部属性暴漏出去,故获取或改变都只能通过该类的方法去实现。因此我们需要先考虑你要实现的各层ADT分别能实现怎样的功能。

这里我完成实验后最大的经验教训就是,底层的ADT设计确实要考虑最终的功能,但是主要还是要考虑本身的应有的功能,否则会出现底层ADT将上层功能提早实现,而一些基础的功能却没有,虽然对于这道题而言没什么,但是这样的ADT可复用性会很差,对今后的修改和添加新功能都十分不利。

以下就是我设计的ADT了,就是board类中把Action和game中要实现的功能都实现了,但是其实board只要实现增删改查就够了,而更复杂的功能用基础功能组合就能实现,使得代码更有层次感

1 ADT设计/实现方案
一、Position类
在这里插入图片描述
方法:
1.int getx() 返回横坐标
2. int gety() 返回纵坐标
3. void set(int x,int y) 改变横纵坐标

二、Piece类
在这里插入图片描述
方法:

  1. Position getposition() 获取棋子坐标
  2. boolean getflag() 获取棋子是否在场上的信息
  3. String getplayer() 获取棋子所属玩家的名称
  4. String gettype() 获取棋子种类
  5. setposition(int x,int y) 改变棋子位置
  6. void remove() 使得棋子下场
  7. void add() 使得棋子上场

三、Player类
在这里插入图片描述
方法:

  1. String getname() 获取玩家名称
  2. List gethistory() 获取走棋历史
  3. Set getpieces() 获取玩家所有棋子
  4. void addStep(String step) 添加走棋历史
  5. void removepiece(Piece p) 使玩家失去一枚棋子
  6. addpiece(Piece p) 使玩家获得一枚棋子

四、Board类
在这里插入图片描述
方法:
1.Piece getpiece(int x,int y) 获取一个坐标上的棋子,若坐标超过棋盘或者该坐标没有棋子,均返回空
2. int getNumofPiece(String playername) 获取一位玩家的棋子数
3. boolean add(String player,Piece piece,int x,int y) 玩家在棋盘上的指定位置上添加一枚棋子,玩家只能添加自己的棋子,添加位置须在棋盘上且该位置为空,被添加的棋子不能已经在场上
4. boolean remove(String player,int x,int y) 玩家移除指定位置上的棋子,玩家只能移除对方棋子,指定位置不能超出棋盘,指定位置必须有棋子
5. boolean move(String player,int x1,int y1,int x2,int y2) 玩家移动将指定坐标上的棋子移动到指定坐标,初始坐标和目标坐标都需要在棋盘上,初始坐标上必须有子,并且必须为这名玩家的棋子,目标坐标必须空闲
6. boolean eat(String player,int x1,int y1,int x2,int y2) 玩家用指定坐标上的棋子吃掉指定位置上的棋子,两个指定坐标不能在地图外且必须有子,吃子的棋子必须为这名玩家的,而被吃的子为对方的

五、Action接口
在这里插入图片描述
方法:
1.Player createPlayer1(String playerName1) 创建玩家1
2. Player createPlayer2(String playerName2) 创建玩家2
3. Board board() 创建棋盘
4. void initialize() 游戏初始化
5. boolean placePiece(Player player,Piece piece,int x,int y) 玩家放置棋子到指定坐标
6. boolean movePiece(Player player,int x1,int y1,int x2,int y2) 玩家移动一个坐标上的棋子到另一坐标
7. boolean removePiece(Player player,int x,int y) 玩家移除一个坐边上的棋子
8. eatPiece(Player player,int x1,int y1,int x2,int y2) 玩家用指定坐标上的棋子吃掉另一指定坐标上的棋子

goAction类
在这里插入图片描述
方法:
Player createPlayer1(String playerName1)

玩家2创建同理
其余方法依照Action中的规约实现即可。(注:move和eat直接返回false即可,且在place和remove操作成功时,添加进历史记录)

chessAction类
在这里插入图片描述
方法:
void initialize() 初始化,创建32枚棋子,把他们放到棋盘上
其余方法依照Action中的规约实现即可。(注:place和remove直接返回false即可,且在move和eat操作成功时,添加进历史记录)

六、Game类
在这里插入图片描述
在这里插入图片描述
方法:

  1. String getgameName() 获取游戏名称
  2. String getplayer1name() 获取玩家1名称
    3.String getplayer2name() 获取玩家2名称
  3. boolean placePiece(String playerName,int x,int y) 玩家在指定坐标放置棋子
  4. boolean movePiece(String playerName,int x1,int y1,int x2,int y2) 玩家移动指定坐标棋子找指定坐标
  5. boolean removePiece(String playerName,int x,int y) 玩家移除指定坐标的棋子
  6. boolean eatPiece(String playerName,int x1,int y1,int x2,int y2) 玩家用指定坐标的棋子吃掉另一指定坐标上的棋子
  7. String checkBoardPlaced(int x,int y) 查看棋盘是指定坐标上的棋子,若为空返回free!
  8. int getNuberOfPiece(String playerName) 获取棋盘上玩家的棋子数,若玩家姓名输错,返回-1
  9. String getHistorySteps(String playerName) 获取玩家下棋的历史记录

最后看一下最终的成果:
先是围棋:
在这里插入图片描述
在这里插入图片描述
然后是国际象棋:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值