minecraft吧 关注:2,540,925贴子:31,776,495

[指令进阶日记]渐入佳境

只看楼主收藏回复

一楼喂度娘


IP属地:湖北1楼2020-01-30 17:27回复
    二楼做目录,此层禁止回复
    建议开启只看楼主模式


    IP属地:湖北2楼2020-01-30 17:28
    收起回复
      三楼备用


      IP属地:湖北3楼2020-01-30 17:28
      回复
        1、基本逻辑结构与逻辑门


        IP属地:湖北4楼2020-01-30 17:29
        回复
          在原版mc地图、原版模组的设计中,小到一个技能的设计,大到规划整个小游戏地图的设计,都离不开各种命令。而这些命令的多种多样的组合,也不是完全没有规律的生搬硬套,而是有着一定的逻辑规律。
          在介绍这些逻辑规律之前,我建议大家了解一下流程图,流程图是常用的表示逻辑结构的方法,也是最直观地表现算法的方法。
          一般流程图使用圆角矩形来表示开始与结束,使用矩形来表示操作,使用平行四边形来表示输入与输出,使用菱形来表示判断,最后使用箭头来表示工作流方向。
          如下图使用流程图来表示三种基本的逻辑结构


          IP属地:湖北5楼2020-01-30 17:47
          回复
            接下来说三种基本逻辑结构。
            顺序结构:在顺序结构中,所有步骤按照一定的顺序依次进行。
            选择结构:根据输入的条件的不同,执行不同的操作。
            循环结构:循环结构中,流程里的某个步骤可能会被多次执行,这些被多次执行的部分称为“循环体”。循环的方式有很多种,如在上述的流程图中,循环体会被至少执行1次。


            IP属地:湖北6楼2020-01-30 17:54
            回复
              那么如何在游戏里体现这些逻辑结构呢?
              顺序结构最简单,放几个连锁命令方块,就是顺序结构。或者用函数,函数中的命令也是按照顺序执行的,这也是一个顺序结构。
              选择结构也简单,游戏中直接给了我们这些命令,即 execute 的 if/unless 子命令。使用方法如下:
              ————————————————————
              execute if <条件> run <命令1>
              execute unless <条件> run <命令2>
              ————————————————————
              这就是一个简单的选择结构了。
              循环结构较难,因为使用原版cb写出循环结构的唯一方法是function递归(function中嵌套使用自身,称为“递归”)。
              如使用如下名为fun的函数进行递归操作:
              ————————————————————
              <命令1>
              execute if <条件> run function fun
              <命令2>
              ————————————————————
              那么这个函数的递归流程应该是这样的

              这样命令就会在递归条件满足时反复执行命令1,条件不满足时执行相应次数的命令2。当然,一般情况下不会写命令2,到 execute if 那一行往后就不会再写别的命令了,这样这个递归函数就会反复执行命令1,直到条件不通过。


              IP属地:湖北7楼2020-01-30 18:07
              回复
                好帖支持。
                收藏了。


                IP属地:浙江来自Android客户端8楼2020-01-30 18:15
                回复
                  那么在作品中具体如何应用流程图来表示具体的创作思路呢?
                  以我的一个简单数据包作品《选择性死亡不掉落》 v1.1.1 为例(链接放本层的回复里,怕吞),其用流程图表示如下

                  建议对照该作品的源码配合使用,可以在mcbbs上直接看到源码(含注释),下载下来的数据包不含注释。
                  这个数据包的主体基本就是一个循环结构了。细心的人可能会发现,这个循环结构和上面我给出的示例图中的循环结构有一处不同,也就是这里的循环体可以一次都不执行,而上面的循环体至少执行一次。这个在别的函数中调用递归函数时加一个 execute if/unless <条件> 即可。如果调用递归函数时有这个条件,那么就是可能不执行,而在调用递归函数时没有这个判断,就是至少执行一次。


                  IP属地:湖北9楼2020-01-30 18:22
                  收起回复
                    了解了这些逻辑结构后,我们来看看逻辑门。
                    什么是逻辑门?逻辑门是指通过对“真”、“假”进行逻辑运算,并得出逻辑值的组件。基本的逻辑门有三种, “与”门(“且”门), “或”门, “非”门。
                    “与”门(“且”门)的含义是,当两个逻辑值均为“真”时,输出为“真”,其他情况输出为“假”。
                    “或”门的含义是,当两个逻辑值至少有一个为“真”时,输出为“真”,其他情况输出为“假”。
                    “非”门的含义是,当一个逻辑值为“真”时,输出为“假”,当一个逻辑值为“假”时,输出为“真”。
                    其他常用逻辑门均能够以这三个基本的逻辑门为基础,进行建立。如“同或”门,当两者同为“真”或同为“假”时,输出为“真”,反之输出为“假”。这个“同或”门就可以看做(A且B)或(非A且非B)


                    IP属地:湖北10楼2020-01-30 18:56
                    回复
                      逻辑门在哪里又有体现呢?
                      逻辑门在游戏中的体现,一个是目标选择器,一个是 execute if/unless 。
                      在目标选择器中,我们写入的目标选择器参数之间的关系即为“且”,同时允许参数使用“非”门。如以下选择器
                      @e[type=item,tag=A,tag=!B]
                      含义是所有物品实体,且拥有标签A,且没有标签B(即:非(拥有标签B))。
                      但是目标选择器里好像少一个“或”门啊!!!!
                      既然没有“或”门,那么我们只好自己写一个“或”门了
                      如,我要选择有标签A或有标签B的实体,有两种解决方法
                      ①字面上理解“或”门,我把有标签A和标签B的实体都加一个全新的标签C,然后选择有标签C的实体即可
                      ————————————————————
                      tag @e[tag=A] add C
                      tag @e[tag=B] add C
                      say @e[tag=C]
                      tag @e[tag=C] remove C
                      ————————————————————
                      ②非(非A且非B)==>A或B
                      ————————————————————
                      tag @e[tag=!A,tag=!B] add C
                      say @e[tag=!C]
                      tag @e[tag=C] remove C
                      ————————————————————
                      从上面的操作大家可以体会到,目标选择器上的逻辑门多通过标签进行实现。实际上,用标签确实是一个很方便的进行逻辑运算的操作。


                      IP属地:湖北11楼2020-01-30 19:11
                      回复
                        为什么总是被说是广告不让发


                        IP属地:湖北12楼2020-01-30 19:48
                        回复


                          IP属地:湖北13楼2020-01-30 19:50
                          回复

                            度娘你给我出来说说哪有广告


                            IP属地:湖北14楼2020-01-30 19:51
                            收起回复
                              我哪层楼都没看懂。。。。。我还是好好的当我的红石大佬吧


                              IP属地:江苏来自Android客户端15楼2020-01-30 19:53
                              收起回复