这部分,主要说一下P3的设计和测试。
除了MyChessAndGoGame是主程序入口之外,其余均为辅助类。
思路是自底向上的:
首先游戏要有两个玩家,所以设计了Player类。这个也是最简单的,因为游戏的核心在于操作,而不是玩家本身的属性,当然如果你将操作作为玩家的方法,那另当别论。
此外游戏肯定要有一个棋盘,所以设计一个board类,那么棋盘有哪些属性呢。这里我认为应该把棋子归到棋盘,而不是轨道Player,尽管是玩家在下棋。
如果归到Player的话通用性将降低。
此外棋盘上的坐标也该设置,毋庸置疑,包装成Position类,现在考虑的是应该把Position放到Piece(棋子)类中还是board类中。因为两者都有理由将其作为属性,我的选择是将它作为棋子属性
这样一来,为了方便游戏逻辑中各个操作的实现,在Board类中我设置以下方法和属性
由此一来,底部已经搭好,现在明确目的是实现象棋和围棋,将二者归到游戏类Game。它将有以下属性方法
因为是两种游戏,所以使用布尔类型的 type来决定玩什么。
这里采用自顶向下的思维设计play()方法,也就是游戏框架,它应该按什么流程走。
这部分的叙述中将顺便说到需要实现的游戏逻辑方法。
在该实验中,需要实现:
1.象棋移动/围棋落子
2.围棋提子
3.查询场上棋子数目
4.查询某位置是否有棋子
5跳过
6.结束游戏
游戏是回合制,玩家可从上述操作列表中选择一种。
对于象棋,每回合结束后应该检查是否达成一方胜利的条件:场上只有一方的棋子。
对于围棋:若简化操作,提高实验难度,可以将提子,设置为自动提子,即每回合结束后自动检查并提取可提取的对方棋子。关于这部分的逻辑在漫谈(3)中作出了讨论。
因为是回合制游戏,所以play整体的框架应当是两个玩家依次轮换,然后输入操作选项,再显示结果。
需要注意的是对于非法输入的检查,如果可以,正则表达式应当合理使用,这在Lab1中我已经说明。
下面给出游戏逻辑方法的代码样例(来源于本人实验代码):
1.象棋移动
仅仅对非法部分作出代码示例:
2.围棋落子
3.围棋提子
剩余部分简单,不作说明。
此外这里可能有人注意到我的输入存在风险,我的要求是按空格分割,这对于检查其实如果仅使用if或者spilt来操作是有些困难的,而且不一定规避大部分的非法输入。
因此,使用正则表达式匹配的方法:
程序中,关于坐标位置的输入有两种格式
pattern1=Pattern.compile("(\\d|\\d{2})\\s+(\\d|\\d{2})"+"\\s+(\\d|\\d{2})\\s+(\\d|\\d{2})");
pattern2=Pattern.compile("(\\d|\\d{2})\\s+(\\d|\\d{2})");
关于操作选项只有一种:
Pattern pattern=Pattern.compile("\\d{1}");
正则表达式也比较易学,推荐采用匹配方法来规避非法输入。
具体的使用:
第二处红框也说明了,匹配正确时的分割方法。
嗯,大概就这些了,一方面时设计的思路,一方面是非法输入如何处理。