(软件构造)lab2遇到的问题以及相应的解决

Playing Chess

P1和P2都没啥说的,按要求做就行,注意避免空指针。

设计ADT

中国大学MOOC上浙江大学java语言课程的授课老师翁恺说过,设计一个ADT要考虑该ADT所包含的“状态”和“行为”,这句话非常有用,尤其是设计Playing Chess这个“小游戏”的时候。
我总共设计了7个类:
在这里插入图片描述
其实这7个类完全可以压缩成6个类,因为Game类里几乎啥也没有,但是实验说明还要求要有Game类和ChessGame类,所以我的ChessGame类相当于一个“Main.java”,整个程序在这个类的main方法里运行,而Game类仅仅输出一些游戏开始和游戏结束的信息。

1. Game类

考虑该类的状态行为:没有状态,只有输出游戏开始和游戏结束的提示信息的行为,完全可以省略。

2. Player类

考虑该类的状态行为
两个状态:
private final String name;
private final int mark;
其中name表示两个骑手各自的名字,mark表示玩家标号(玩家1还是玩家2)。
行为:
出于防御性考虑,把name和mark都设置成了private final,所以每个field都应该有一个get方法来返回Player的状态:
public String getName();
public int getMark();

3. Position类

考虑该类的状态行为
状态:
private final int row;
private final int column;
private final String type;
其中,row和column分别表示一个棋子所在的棋盘的行号和列号
type表示游戏类型:围棋/国际象棋

行为:
相应的get方法。

4. Piece类

考虑该类的状态行为
状态:
public Position position;
private final int mark;
private final char member;
其中position不言自明;
mark表示棋子的所属(玩家1还是玩家1),因此mark只能取1或2;
member只用于国际象棋,代表国际象棋中棋子的名字。

因此该类需要两个构造方法,国际象棋和围棋各一个:
在这里插入图片描述
行为:
mark和member相应的get方法。

5. Board类

考虑该类的状态行为
状态:
private int sizeOfBoard;
public char[][] concreteBoard = new char[20][20];
private final String type;
看名字就知道三个成员变量什么意思。concreteBoard直接分配为20*20的二维数组,尺寸<20的话,没用到的空间就暂时浪费掉。

行为:
构造方法:传参type,根据type的不同判定是构造围棋棋盘还是国际象棋棋盘;
相应的get方法;
public void addPiece(Piece new_piece);
public void removePiece(Piece old_piece);
添加棋子和移走棋子这两个方法是Action类中的分解动作,暂时写到Board类里。
public void printBoard();让棋盘可视化,在控制台输出;
public boolean checkAvailable(int x, int y);判定点(x, y)是否空闲;
public void calculateNumberOfPieces(String type);计算已经下的棋子总数(实验要求);

6. Action类

考虑该类的状态行为
状态:无
行为:
实验说明上要求的各种行为。
注:在进行任何操作之前,一定要判定操作的合法性。

7. ChessGame类

输出提示信息,让玩家输入各自的姓名,开始游戏。每进行一次操作就打印一次棋盘。
只需要注意一个问题:比赛轮次。
比如,玩家1下了一个棋子,合法,那么该轮到玩家2下棋了。如果玩家1下了一个棋子,不合法,那么还应该轮到玩家1,重新下这个棋子。
那么需要管理一个变量(我用的是int count = 0;)每进行一次操作,count = ~count(按位取反)。每次输出提示信息前判断count是否为0,如果为0就让玩家1下,如果不为0就让玩家2下。
如果一方下的棋子不合法,仍然对count按位取反,这样就又取回来了,也就达到了重新让这个下的目的。

当然,事后我觉得不用这么麻烦,这个标记完全可以设置为一个boolean类型的变量,每次取非就可以了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值