minecraft吧 关注:1,800,855贴子:29,184,323
  • 17回复贴,共1

[17-03-25]【CB交流】浅谈实体连线检测

只看楼主收藏回复

相信各位CBer在制作连线消除类的游戏时都会涉及到一个东西: 实体的连线,效果如图:


那么如何用最简便的方法完成呢?


回复
1楼2017-03-25 11:14
    提示: 在阅读本贴之前,建议先对scb(即记分板)逻辑以及/execute逻辑进行了解,以下是一些推荐的网站\教程:
    [scb中文wiki页面] http://minecraft-zh.gamepedia.com/记分板
    [scb英文wiki页面] http://minecraft.gamepedia.com/Scoreboard
    [execute基础(新人手册)] https://pca006132.neocities.org/tutorials/logic/execute.html
    (更多教程请参阅新人手册 https://pca006132.neocities.org/)


    回复
    2楼2017-03-25 11:21
      终于发了?


      收起回复
      来自iPhone客户端3楼2017-03-25 11:25
        心疼大触没人理


        回复
        来自Android客户端4楼2017-03-25 11:32
          检测实体连线,那么我们先把所有的"线"列出来,其实也无非就是四种:
          横(+X至-X)
          竖(+Z至-Z)
          斜(+X+Z至-X-Z 或 +X-Z至-X+Z)
          所以我们只需要搞懂一个方向的逻辑,就能把剩下的都解决掉
          //因为大部分棋盘都只用到一个面,所以本贴不赘述立体棋盘的情况,其实也无非是多穷举几次嘛
          -
          以as(armor_stand,盔甲架)为例,这便是一种较普遍的情况: 右边三个as靠在一起,而左边的一个as周围1格内没有任何as相邻:

          而我们的目标是做到给它们像这样标识:


          情况和目标都摆出来了,所以怎么实现呢?


          回复
          5楼2017-03-25 11:33
            先来看思路:
            首先我们根据目标所要求的可以知道,每一个as身上所"被标识"的数字和它当前处于的连线数量是挂钩的.简单点说,就是你这条线有几个as,这些as上面就是什么数字,因此就可以把这些标识用分数表示:
            -
            我们先默认这些as身上的分数都为1

            然后让所有as把自己的分数加到"下一个as"身上


            现在我们已经得到了一个按照1-n排列的队伍


            最后我们反过来做一遍,让as们把分数覆盖到"上一个as"上


            那么这便是最终的结果


            回复
            6楼2017-03-25 11:49
              以上便是大体的思路,那么现在我们放进mc来实现吧
              首先创建名为scb的记分板
              -
              /scoreboard objectives add scb dummy
              -
              之后我们给当前所有as加上1分
              //为了方便,下面所有的as均默认带有"as"这个tag,选择器可以根据自己的情况自由更改

              -
              /scoreboard players set @e[tag=as] scb 1
              -
              然后关键来了,如思路里提到的,让每一个as将自己的分数加给"下一个as"

              但是as们并不知道它的下一个到底是谁啊,所以我们必须借助一个额外的marker,即图中的"+X"和"-X",这两个marker即起到了决定执行顺序的作用,因此我们便可以在+X处执行这条命令
              //operation第一个选择器选到的会是-X方向的下一个as
              -
              /execute @e[name=+X] ~ ~ ~ execute @e[tag=as] ~ ~ ~ scoreboard players operation @e[tag=as,dx=-1,rm=0,c=-1] scb += @e[r=0,c=1] scb
              -
              效果如图:


              然后我们再倒回来做一遍,这次就是从最后的as开始往回覆盖分数
              -
              /execute @e[name=-X] ~ ~ ~ execute @e[tag=as] ~ ~ ~ scoreboard players operation @e[tag=as,dx=1,rm=0,c=-1] scb = @e[r=0,c=1] scb
              -
              效果如图:


              回复
              7楼2017-03-25 11:59
                666


                收起回复
                来自Android客户端8楼2017-03-25 13:07
                  因此,Z轴也是一样的
                  而且as的分数和自己所在的连线数一定是挂钩的


                  -
                  至于斜线(+X+Z至-X-Z 或 +X-Z至-X+Z)的处理,只是需要稍微修改一下选择器:
                  @e[tag=as,dx=1(-1),dz=1(-z),rm=0,c=-1]
                  这样就能选到斜线里的相邻下一个(上一个)实体了
                  -
                  此外,如果需要把四条线的检测放在一块的话,就需要4个分数以及4次处理,当然你还得考虑特殊情况(例如一个as处于多条合法连线的交点上)和优先处理等问题,这些就各位自己调整吧


                  回复
                  9楼2017-03-25 16:09
                    后话:
                    嘛,也是很久没有碰贴吧了,这个贴子也是因为最近的一个断断续续填着的小作品延伸出来的教程.一开始是我去找@pca006132 问连线检测的改进方法,当时我用的是一种比较麻烦的半穷举法,结果pca第一眼就给我打回去了233然后他也是花了两个晚上给我解释了一大堆我才搞明白233
                    //其实这个逻辑不难,也许是我理解能力有问题
                    大概国内还没有正式开贴提过这个逻辑,或者是pca也没看到,结果东西就落在我手上了hhh
                    算了,我也没写过啥教程,就当作是练练手吧,如果有建议欢迎提出来~


                    收起回复
                    10楼2017-03-25 16:14
                      脑洞dalao


                      收起回复
                      来自Android客户端11楼2017-03-29 17:32

                        扫二维码下载贴吧客户端

                        下载贴吧APP
                        看高清直播、视频!