Lab2的博客为什么放一天来写呢,其实大家都知道之前课程的进度和实验进度脱节。所以我的实验也是在最后一周再做的。
这次说说P3吧,讨论一下围棋和象棋游戏中几个操作的关键逻辑。
我看到有些大佬是写了GUI的,奈何小弟不才,只能写控制台了…
给出我的程序流程图:
接下来讨论一下象棋和围棋关于移动棋子的逻辑的相同和不同,这关系到你如何去写,因为相比其它的什么跳过操作,这部分是核心。
1.移动棋子:
象棋:象棋中的移动棋子操作,我将它抽象为集合A,有这样一个集合B,它是A的子集,我将它映射到实际中的吃子操作,想想为什么?然后A-B是什么?A-B将包括:
1)棋子移动到己方另外棋子的位置,当然这是非法的
2)棋子移动到棋盘外,同样非法
3)棋子移动到可行位置,但不包括吃子的位置(对方棋子所在地)
补充:这里我们暂且抛去不同种类棋子行动的限制,认为它可以随便走(这也是实验比较荒诞的地方)。当然,其实要实现这些限制也并不难。
围棋:围棋的逻辑在我看来实际上要比象棋复杂。这里的移动棋子,我们认为是落子。
因为围棋开局的时候场上没有棋子(除非你下的是珍珑棋局(滑稽))。
就落子而言,它的限制要比象棋少:
1)不能在棋盘外
2)不能下载已经有棋子的地方
2.提子
为什么单独把围棋的提子拿出来呢?
因为在编程的过程中,我发现围棋棋面之所以千遍万幻,正是因为这个神奇的规则。
之前没有学过围棋,简单了解了一下规则,发现提子我们可以认为是“吃子”,当一个棋子的气被全部封住的时候,这个棋子称为死子,对手可以提出。
有这样一些限制:
1)提子的对象必须为对手棋子
2)棋子可简单的分为三类,但并没有覆盖到剩下的各种可能
A)棋盘上四个角的位置,单子来看,杀死它需要2个子
B)棋盘边缘,但是不是四角的位置,杀死它需要3个子
C)其余位置,需要四个子。
这里给出(A)的例子:
上图中坐标为(1,1)的子显然是可以提取的,提取后如图:
补充说明一下我查到的气: 棋子紧邻的直线,也就是说只有最多四个方向,东南西北。
但是问题来了,我们常常在各种小说中看主角装X,和人下围棋,屠龙。
在我的理解中,出现一整片的棋子是你的的时候,但是全部被围住了,这时候上面的三种情形不适用了,我将它归结为第四类-“连气”,这也是围棋有趣的地方,因之千变万化。
给出一个简单的例子:
黑子实际上已经为死子,但是在我们之前的三种逻辑中并不包含这种多子“连气 ”的情况,此时我们按之前的逻辑提取(1,1)棋子。出现失败。
我想围棋作为国粹,长盛不衰,可能也和这个有关系吧。
软件构造Lab2漫谈(3)
最新推荐文章于 2022-05-31 16:01:42 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)