新棋吧 关注:5,967贴子:259,722

C/CIF系统中的MBN和FBR系统

只看楼主收藏回复

前言 关于C/CIF
C/CIF官网:http://ccif.sourceforge.net/index.html
这个系统是我目前见过的最强的杀王棋类游戏数据库系统。
本系统是通过XML文档来记录一局棋的类型,时间,胜负积分,棋手,棋谱,棋子的步法,规则等数据。这类文档可以通过Scidb这个专门读取棋类数据文件的软件读取
Scidb官网:http://scidb.sourceforge.net
其中关于棋子的步法需要通过MBN(Modified Betza Notation)(Betza标记法改)系统表示。
此系统的底层原理可以用ANCP(Algebraic Notation of Chess Pieces)(棋子的代数标记)表示但这个系统不是为人设计的,可读性很差。(它很难看懂)
而棋的规则需要靠FBR(Formalized Board Rules)(形式化棋盘规则)系统来表示。
下面就从MBN开始吧。


回复
来自iPhone客户端1楼2017-04-02 13:16
    布撸斯特大学、小双尾怪、花知魅游酱. . . 被楼主禁言,将不能再进行回复
    1.棋子的定义
    在MBN系统中,棋子分成以下两个系统:
    一,名称
    棋子的名称用英文字母表示,最多3个字母。名称之间用冒号包住,如:BM:(Blind Monkey 盲猿的缩写)。首字母必须大写。如果单字母名称不加冒号,则表示一些特定的棋子(像B表示国象象)而且这些棋子可以不加后面的步法说明。若白方和黑方的这个棋子移动方法有区别(前后不对称),则黑方的棋子首字母必须小写。
    二,步法
    在名称后加上等号,等号后的内容是棋子的步法,用MBN标记法进行标记。
    一次可以对多个棋子进行定义
    例1.1:PS=mfWcfF:它的意思是对P和S进行定义,它们的步法都是前行一格(fW)移动(m)斜前行一格(fF)吃子(c)。


    收起回复
    来自iPhone客户端2楼2017-04-02 15:49
      2.棋子的前缀
      + 升变,加号后面的内容是升变前的棋子(大写)。表示具体的升变过程必须使用双等号,双等号后面是具体的升变内容。若使用一个等号,则等号后表示升变后的棋子的步法的定义。(具体的升变区的定义请参考下文的FBR部分)
      例2.1:+P==QRBN:它的意思是国象兵可以升变成后,车,象,马。
      例2.2:+Q=QN:它的意思是在某棋中,后的升变是后加马(即Amazon或大君)
      如果双等号后面使用小写字母,则表示升变后变成对方的棋子。
      例2.3:+Q==q:它的意思是,在某棋中,后的升变是另一个颜色的后。
      若白方和黑方的同一个棋子有不同的升变,则两个升变过程要写在同一行。
      例2.4:+P==Q +p==I:这个表示白兵只能升变成后,但黑兵只能升变成I(此处I的默认定义为BN,即马加象)(关于各个字母所默认代表的棋子,到14章再全部整理)
      同样,也可以将多种兵种的共同升变写在同一个双等号前。
      例2.5:*KLWNCP==X:这个表示左边的这些兵种升变(注*也是一种与+不同的升变符号,具体的升变区同样需要定义)后变成X(默认表示炸弹,类似原子棋吃子的爆破,不能移动。)


      回复
      来自iPhone客户端3楼2017-04-02 18:49
        - 降变,减号后面的内容是降变前的棋子。具体特征与升变相似。
        例2.6:-Q=fQ Q:它的意思是在某棋中,后的降变是只能向前走的后,同时升变后变回原本的后。
        还有#,*,$,%,&这些符号可以通过FBR进行变化定义作为前缀。
        例2.7:Q #Q:它表示#Q直接定义为Q
        ? 条件:在定义一种前缀之后,可以用?加前缀的方式表示成立前缀的条件。
        例2.8
        conversion#
        K #K==Q ?#K=[*]O:它的意思是对#定义conversion函数,成立条件为它自身(O)安全([*]),成立的结果是可以作为后使用。
        ! 撤销:在定义一种前缀之后,可以用!加前缀的方式表示撤销前缀的条件。
        例2.9
        G=K+F02 +G=P !+G/DragonResurrection/
        它表示G作为王加斜两格,而G的升变是兵,撤销升变的条件是出现DragonResurrection的通知(出现该通知后,进入升变区也无法升变)(关于通知的出现,则需要调用FBR的announcement函数)


        回复
        来自iPhone客户端4楼2017-04-02 19:37
          以上前缀在没有定义的情况下两次出现(如##)都表示撤销,但下面这个前缀例外
          ' 顺时针旋转90度:在棋子名称前加上这个前缀,就表示它的步法都顺时针旋转90度。


          回复
          来自iPhone客户端5楼2017-04-02 19:42
            3.棋子的后缀
            后缀有两种,一种是常规后缀,还有一种是事件后缀。
            一,常规后缀
            在名称后面加<n>,n可以是字母,也可以是数字,加上后缀的棋子的定义不影响其他同名棋子的定义。(有不同后缀的同名棋子相互独立)但无后缀棋子的定义会影响所有的以该名称命名的棋子的定义。
            例3.1:R=W0:这个定义对所有R棋子都成立。像R<n>,R<s>之类的棋子。
            例3.2:R<l>=lR:这个定义只对R<l>成立,不对其他R棋子成立。
            二,事件后缀
            此类后缀一般用于选择性升变
            在名称后加上/事件名称/==另一个棋子名称表示当这个事件成立时该棋子变成另一个棋子。
            例3.3:+G +G/DragonResurrection/==+D:它的意思是G的升变是+G,但是在DragonResurrection事件成立的情况下,G的升变是+D。


            回复
            来自iPhone客户端7楼2017-04-03 09:30
              4.升变
              升变的一般格式
              +棋子名称或+棋子名称==棋组
              前者表示该棋子升变可以升变成除皇家棋子(被吃判负的棋子)以外的棋子
              后者表示该棋子升变成棋组内的棋子
              例4.1:+P=={QRBN}:它表示兵的升变可以是后,车,象,马。棋组的花括号可以省略。


              回复
              来自iPhone客户端8楼2017-04-03 09:41
                5.打入
                需要调用pieces函数和minimum函数,用@作为打入符号
                例5.1:
                pieces*<1>{!k}=minimum(1) pieces$<2>{!K}=minimum(1)
                *K==@k $K==@K@w@S
                它的意思是将*作为黑王的条件,至少一个。将$作为白王的条件。
                当黑王被吃时,打入一个黑王。当白王被吃时,打入一个白王,再打入一个黑W,再打入一个白S。


                回复
                来自iPhone客户端9楼2017-04-03 10:01
                  6.基本步法
                  用(m,n)表示往一个方向(上下左右)前进n格再往垂直的方向前进m格的棋子。其中m<n
                  棋子一般有3类。
                  跳跃者(Leaper):从起始格直接移动到终结格的棋子。
                  骑行者(Rider):沿某方向可以无限移动的棋子。
                  滑行者(Slider):类似于骑行者,但移动格数有限制,而且可以改变移动方向。
                  在本系统中,用:m,n:表示(m,n)棋子。
                  一些(m,n)棋子可以用以下棋子表示,这些棋子可以称为基本棋子。
                  OZero :0,0:
                  WWazir :0,1:
                  FFerz :1,1:
                  DDabbaba :0,2:
                  NKnight :1,2:
                  AAlfil :2,2:
                  HThreeleaper:0,3:
                  C或L Camel :1,3:
                  Z或J Zebra :2,3:
                  T或G Tripper:3,3:


                  回复
                  来自iPhone客户端10楼2017-04-03 10:21


                    回复
                    来自iPhone客户端11楼2017-04-03 10:23
                      骑行者
                      在棋子步法部分的最后加上0就表示沿该方向的骑行者。
                      加上正整数表示最多能走多少格的该方向的滑行者
                      例6.1:F0就表示国象象
                      极限骑行者
                      在棋子步法部分的最后加上0*就表示沿该方向的极限骑行者。
                      极限骑行者是必须走到能走的最远处的骑行者。
                      例6.2:B0*表示必须走到最远格的国象象。
                      限定骑行者
                      在棋子步法的最后加上0加上自然数就表示沿该方向的限定骑行者。
                      限定骑行者是只能走某格的骑行者。
                      例6.3:W03表示只能走三格的车。
                      如果加上的是00则这部分步法无效。
                      边缘骑行者
                      在棋子步法的最后加上*就表示边缘骑行者
                      注:步法如果是跳跃者的步法会自动转换成骑行者的步法。
                      边缘骑行者是步法的终点必须在棋盘边缘,而且必须走到尽头。
                      如果路程中有障碍,则不能往此方向前进。
                      例6.3:B*可以表示必须移动到棋盘边缘的国象象,如从c1开始移动,那么只能移动到a3或h6。
                      例6.4:W*可以表示必须移动到棋盘边缘的国象车,如从c1开始移动,那么只能移动到a1或h1或c8。


                      回复
                      来自iPhone客户端12楼2017-04-03 10:52
                        棋组
                        将几个棋子用花括号框起来就算作一个棋组,如{ABC:C:},它表示A,B,C,:C:四个棋子。
                        {^AB} 表示除A和B以外的所有棋子。而{^}表示所有棋子。
                        当棋组作为棋子步法的前缀时,它表示在棋组表示的棋子的攻击范围内时才能走的步法。
                        例6.5:K=K+{C}W2F2:它表示王正常情况下行走王的步法,但被C将军时,它可以走直二格和斜二格。
                        当棋组出线在圆括号(分组符号,之后会讲)前面时,按以下法则进行去括号。
                        例6.6:k{KQ}(K+k{K}N),它与k{KQ}K+k{K}N是等价的。因为前面的K没有对应的限制集合,所以去括号后就取并集。而后面的k{K}N中的限制集合中存在K而括号外面的限制集合是K和Q,所以去括号后就取交集变成k{K}N。
                        例6.7:k{Q}(K+k{K}N),它与k{Q}K+N是等价的。前面的部分与例6.6是完全一样的,而后面的限制集合去掉的原因是因为两个集合的交集是空集。


                        收起回复
                        来自iPhone客户端13楼2017-04-03 15:38
                          棋组的内容前面加上!就表示后面的内容是限定颜色的。与前面一样,大写为白,小写为黑。
                          分组符号()
                          主要用来作为分隔符,在结合和连接过程中起到重要的作用。
                          结合符号+
                          将两个步法结合到一起。
                          例6.8:mPQ = m(P+Q) = mP+mQ:这代表对任意一个修饰前缀m来说以上关系式成立。


                          回复
                          来自iPhone客户端15楼2017-04-04 08:29
                            修饰前缀主要分两种,方位前缀和限制前缀。
                            一,方位前缀
                            f 向前
                            b 向后
                            v 向竖直方向(前后)
                            l 向左
                            r 向右
                            s 向水平方向
                            d 任意方向
                            t 调头
                            z 反射
                            最后三个主要用于复杂棋子的说明。
                            例6.9:fsW与fW+sW是一样的,因为W不能向斜前方走。


                            回复
                            来自iPhone客户端16楼2017-04-04 08:44
                              二,限制前缀
                              a 移动或吃子(主要用于限定棋组)。
                              c 只能吃子,吃子范围可以在后缀棋组进行限定(默认可以吃所有敌方棋子)。
                              cc 只能吃自己的棋子,其它特性同c。
                              cy 只能吃双份的棋子,其它特性同c。
                              g 定义跳跃滑行者,此符号也可以对骑行者使用,使用后可以跳过敌方的棋子,可以用后缀棋组进行限定(默认可以跳过所有敌方棋子)。
                              gg 与g类似,但只能跳过自己的棋子。
                              h 一半,被修饰的步法只能走到距离棋盘边缘一半的格子(向上取整)
                              i 初始步法,第一步可以走的步法。若双写(ii)则该棋子的升变棋子和打入的棋子不适用这个步法。
                              j 跳过,跳过敌方棋子(移动到障碍所在格子,然后向其它方向离开),可以用后缀棋组限定可跳过的棋子(默认是全部敌方棋子)
                              jj 与j类似,但只能跳过自己的棋子
                              jy 与j类似,可以跳过双方的棋子


                              回复
                              17楼2017-04-04 09:21
                                k 该步法不能将军
                                kk 该步法可以将军但不能将杀
                                m 只移动,不吃子
                                n 步法路径内禁止越过棋子
                                p 与j类似,必须跳过一个路径中的障碍,可以用后缀棋组进行限定(默认跳过所有棋子)
                                pp 与p类似,只是不限定跳过的障碍的数目(还是必须跳过)
                                tt 不转弯
                                u 如果步法范围内所有格子都没有障碍,那么才能行走u后面的步法


                                回复
                                来自iPhone客户端18楼2017-04-08 22:51
                                  前面漏讲了一类前缀
                                  三,功能前缀
                                  ce 该步法可以吃过路兵,吃过路兵的意思是对方的兵经过自己的兵的攻击范围,自己可以移动到攻击范围内而敌方的兵被吃掉。后面可以加后缀棋组进行限定(默认只能对同种棋子使用)
                                  cee 与ce相似,但只能吃过路兵。
                                  me 这一步法可以被吃过路兵。(不能吃子)
                                  o 循环棋盘,该前缀修饰的步法经过棋盘边界时可以从穿越到另一侧。可以用范围限定符进行穿越范围限定(以后会讲)
                                  w 与步法范围内的一个敌方棋子交换。可以用后缀棋组进行限定(默认可以与所有敌方棋子交换)。
                                  ww 与w类似,但只能与自己的棋子交换。
                                  wy 与w类似,但可以与所有棋子交换。
                                  x 把步法范围内的一个敌方棋子叛变成自己的棋子。
                                  xx 与x类似,但只能把自己的一个棋子叛变成敌方的棋子。
                                  xy 与y类似,但可以把任意一个棋子叛变成对手的棋子。
                                  z 步法反射
                                  例6.10:F-[(zF)0]:它的意思是,如果向右前方走一格,那么下一步就要向右后方或左前方走一步,如果走右后方,那么再下一步只能走右前方,以此类推。


                                  收起回复
                                  来自iPhone客户端19楼2017-04-08 23:16
                                    若在前缀后面加上?就代表这个前缀可以调整。(可以不执行操作,但需要对可执行对象用棋组做出明确限定)
                                    可以调整的前缀有:c系,j系,m系,p系,w系。(某系表示以某字母开头的前缀)
                                    例6.11:B=pp?{QRNP}B:它表示这个象可以跳过后,车,马,兵,也可以不跳过,但是不能跳过象。


                                    回复
                                    来自iPhone客户端20楼2017-04-08 23:27
                                      下面是一群例子
                                      例6.12:mfW:向前走一步(国象兵的常规移动)
                                      例6.13:W-fF:直行一格,然后斜行或吃子一格(中象马)注:该步法不能用nN表示,因为后者也允许先斜走一格再直行或吃子一格的步法。
                                      例6.14:imefW02:最初的移动可以向前走正好2格(中间无障碍),该步法可以被吃过路兵。
                                      例6.15:cefF:斜前吃一格,可以吃过路兵(国象兵的吃法)
                                      例6.16:wK:与周围一个敌方棋子交换
                                      例6.17:c{L}RB:在吃对方的L时,可以用车或象的步法。
                                      例6.18:ac{^C}p{^C}R:此处需要详细解释此处默认该棋子的名称为C(Cannon),它的意思是以直行无限的步法(R),隔一个棋子(p)移动或吃子(a),但不能吃C(c{^C}),也不能跨过C(p{^C})(此处C指韩包)
                                      例6.19:ce{PS}fF:斜前吃一格,可以吃过路兵,但只能吃P和S
                                      例6.20:ffN:只能向最前方两格马步方向移动或吃子(将棋桂马)
                                      例6.21:WF+iiN,这个棋子正常情况下可以按王的步法移动或吃子,但一局中仅有一次可以以马步移动或吃子。但这个棋子被将军时就再也不能这么走了(前面讲的时候忘记讲了,ii对皇室棋子还有未被将军的限定)


                                      回复
                                      来自iPhone客户端21楼2017-04-11 21:13
                                        例6.22:!c{R}R:以直行无限的步法,射杀对方的车。
                                        例6.23:K[1-5]+!cj{K}Q:以王的步法移动或吃子,但只能在1-5行内移动(以自己的底线为第一行),并且双方的王不能在开放线上照面(抱歉,原文是这样解释的,但我暂时看不懂为什么这样说,等我看懂之后再做解释。)
                                        例6.24:nCZ:做有阻挡的目字和用字步法,但需要将所有可行步法(3步王步法)之内可以到达的路线全部被阻挡才能阻挡这个方向的步法。
                                        例6.25:o[b,g]B:行象的步法,但b列和g列相互连接,可以从g2移动到b3。


                                        回复
                                        来自iPhone客户端22楼2017-04-11 22:06


                                          回复
                                          来自Android客户端24楼2017-04-14 18:28


                                            回复
                                            来自Android客户端25楼2017-04-14 18:28


                                              回复
                                              来自Android客户端26楼2017-04-14 18:29
                                                以上三个是nC的图例。黑线的路径被挡住就不能用这种方法通行。


                                                回复
                                                来自Android客户端27楼2017-04-14 18:30
                                                  区域表示符
                                                  用一组方括号和里面的内容表示一些坐标格。如[a1]表示a1格。
                                                  一些关于区域表示符的例子:
                                                  [] 表示一个空区域集,在一些场合下会需要使用。
                                                  [a-c1] 表示a1到c1这三格。
                                                  [b3-5] 表示b3到b5这三格。
                                                  [f-h6-8] 表示以f6到h8为对角线的正方形区域。
                                                  [a1,c4] 表示a1和c4两格。
                                                  [a-h1-2,a8,h8]表示以a1到h2为对角线的长方形区域。加上a8和h8两格
                                                  [1-4] 表示1到4行的所有格子。
                                                  [1,8] 表示第1行和第8行的格子。
                                                  [#] 表示所有棋盘边缘的格子。
                                                  [.] 表示所有不是棋盘边缘的格子。


                                                  回复
                                                  来自iPhone客户端28楼2017-04-21 22:28
                                                    还有[^]表示棋盘上的所有格子,在^后面加上其他坐标可以表示除那些坐标以外的所有格子。
                                                    如[^a1,a8,h1,h8]表示除a1,a8,h1,h8以外的所有格子。
                                                    [+]表示被对方控制(攻击范围之内)的格子
                                                    [*] 表示未被对方控制的格子
                                                    [:] 表示没有移动的棋子所在的格子
                                                    还可以用递代指示符表示一些格子。
                                                    递代指示符用(+-m,+-n)表示,其中m表示列的变换数量,n表示行的变换数量。+-表示数值增减。如[a2(+-2,+-2)]表示以a2为变换起点,横坐标增减2的倍数,且纵坐标也增减2的倍数的格子。


                                                    回复
                                                    来自iPhone客户端29楼2017-04-21 23:10
                                                      例6.26:[1-4](K+[1]N)和[1-4]K+[1]N是等价的。因为N步法中的[1]行在前面的范围表示符的范围内。但[1-4](K+[5]N)与[1-4]K是等价的,因为[5]不在[1-4]中。所以N的步法为空集。
                                                      范围在步法前面表示该步法的起始限定范围。范围在步法后面表示该步法的终结限定范围。
                                                      例6.27:G=W[d-f1-3]:它表示帅的移动终点限制在九宫内,以国象的坐标计算九宫的位置为[d-f1-3]。
                                                      例6.28:[d-f1-3]pB[d-f1-3]+[d-f8-10]pB[d-f8-10]:它表示韩炮在双方九宫内可以沿斜线移动,吃子,但起点和终点都在九宫内。


                                                      回复
                                                      来自iPhone客户端30楼2017-04-21 23:29
                                                        连接符号
                                                        用-表示连接符号,用于一些复杂步法的表示(需要通过几个简单步法的组合才能表示的步法)
                                                        类似Betza 2.0系统的-符号,它默认承接的步法如果没有方向修饰符,就是按照前面的步法的移动方向移动。连接符号连接的步法一般情况下是必须要移动的。(特殊情况之后会说明。)
                                                        例6.29:国跳兵的吃子移动步法可以这么表示:fcF-mF:前面的fcF表示向斜前方吃子一格(无子可吃不能移动整个步法),后面的mF表示向先前的方向走一格。
                                                        可以沿一个方向最多直行三格,其中任意一格中都可以移动或吃子的棋子可以这么表达
                                                        例6.30:W+(W-fW)+(W-fW-fW)(括号不可省略,但是有更简单的表述)
                                                        这个步法去括号的方法是这样的:
                                                        例6.31:(fF+fcF)-(mF)等价于fF+fcF-mF
                                                        一个用-连接的步法中,不能两次吃同一个棋子,也不能两次与同一个棋子交换。
                                                        在-后面加上用方括号括起来的步法表示方括号内的步法可以省略。
                                                        例6.32:gfF3-[B]:它的意思是沿斜前方走三格(fF3),这三格中有棋子可以跳过(g),然后可以再沿该方向移动或吃子无限格([B])。
                                                        还可以-接用花括号括起来的步法表示可选移动,而且括号内的内容可以重复使用。
                                                        例6.33::CK:=K-{((fr)K)0*}:它的意思是转圈王的步法是先走一步王的步法,然后沿顺时针方向旋转45度(fr)再走一步(K),重复此步法直到遇到障碍或回到旋转起点(0*)(为了防止无限移动)


                                                        回复
                                                        来自iPhone客户端31楼2017-04-22 21:43
                                                          序列符号
                                                          用--表示序列符号(注:2个-)它的基本功能和-是相似的,但有些不同之处
                                                          1.不以先前的方向作为参考方向(方向独立性)
                                                          例6.34:N--N表示必须走2次马的步法的棋子,与N-N不同。
                                                          但这个棋子也可以表示为N-dN,其中后面的N前面的d是指所有方向。
                                                          2.可以成组修饰
                                                          例6.35:f(dK--K)表示先走周围一格,然后向前走一格的步法。
                                                          但f(dK-dK)中,前面的f没有用。
                                                          与-一样,用[]框住的步法可以省略。


                                                          回复
                                                          来自iPhone客户端33楼2017-04-29 12:32
                                                            复杂骑行者
                                                            用括号框住步法然后在括号后面加上数字n表示这个步法可以走n次,若数字为0,则表示无限次,若数字前加0则表示必须走n次。
                                                            例6.36:(pD)3:最多走3次pD,但方向不能改变,遇到障碍或吃子就停止。pD指走直行2格但两格中间必须有棋子。
                                                            例6.37:(paD)03:必须走3次pmD,但方向不能改变,不能吃子。
                                                            若步法前面有d,那么多次行走步法的方向可以改变。
                                                            例6.38:(dcK-mK)0(刚果棋的猴子):吃附近一格的棋子,然后再沿此方向走一格,重复上述动作任意次,方向可以改变。
                                                            若这样的步法后面有用-连接其他部分,只要走任意步数(若重复次数为0n,则不能这么做)就可以走后面的部分了。
                                                            例6.39:F={jy{X}F}0-F:它表示斜行无限步经过X然后再顺向走一步。
                                                            若括号后面接的是0*,那么就必须做最大次数的移动。
                                                            例6.40:B--(dcK)0*:它表示斜行无限步然后吃掉(c)自己周围(dK)所有棋子(0*)。


                                                            回复
                                                            来自iPhone客户端34楼2017-04-29 13:02