新棋吧 关注:6,581贴子:270,237

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