原本是我的友人在问指令怎么用,就教一点,然后再问,再教一点,最后时不时要我调试,我就干脆发成文给他看。反正要发文了,就干脆发在版上分享,如版上已有类似的文章就抱歉了。
我相信很多人都会这样:里面的英文,明明都看得懂,但照着打出来,放在指令方块上就是红字(BUG),然后调试常常就是打错字,少逗号,括号放错…。
首先,本文不是教你怎么用指令,而是教Json(声明对象),如果只是要知道指令用法,请到官方WIKI查文档。然后要告诉你的是:
Json
不是程序!
不是程序!
不是程序!
所以不要怕学程序,因为这篇压根儿就没有…
先来看Summon这个指令:
/summon minecraft:villager ~ ~ ~ {VillagerData:{type:desert,profession:farmer,level:2},CustomName:'”Steve”‘}
其中的「~ ~ ~」指的是座标的「x、y、z」,「~」的意思是当前座标。
这里恐怕已经有人觉得指令很长了,所以本人开宗明义要先跟各位讲,不要怕,长的部份只是Json。如果把Json的部份去掉,就会长成这样:
/summon minecraft:villager ~ ~ ~
你必需要知道的是,去掉Json的这一段,才是系统真正的指令。
这是Json的基本格式:{name:steve}
Json(JavaScript Object Notation),中文叫做「JavaScript的对象格式」,是用来声明JavaScript对象用的,白话文:告诉电脑这个东西长什么样子、叫什么名字、有多长有多短……等等。
至于对象是什么,程序中有个概念叫「面向对象」,也就是把程序当作对象来设计,这里不提,你只需要知道:「对象 = 物品 = 东西 = 项目」。村民是一个对象、终界龙也是一个对象、泥土是对象、腐肉是对象、苹果、骨头、木棒…都是对象。
所以Json只是一种数据呈现方式,就跟「.txt」文档一样,Json的文档叫做「.json」。如果把文本写成段落,每段空两格,依照起承转合的方式写文,这种格式叫做作文;写成七个字,分四段,有押韵,这种格式叫做七言绝句。同理,文本写成{key:value}的格式,就叫做Json。
Json那个大括号可不可以去掉?……不可以!
以纯文本表示一个村民:
这个村民叫Steve、类型沙漠、职业农夫、等级学徒。
上述的村民以Json规范表示:
{VillagerData:{type:desert,profession:farmer,level:2},CustomName:'”Steve”‘}
你必需要知道的是,没有老师能教整堂课的Json,因为Json根本讲不了什么东西…
key是键、或称属性,属性不能改,属性是固定的,属性由开发者决定,当然属性名称也是,这个属性如果叫做「name」,那么你就不能打「Name」,因为他们是不同东西。其实一开始声明对象最花时间的地方就在找属性,因为不知道官方设了哪些属性,名称是什么,所以只能蒙打瞎猜。要想知道对象属性,得去官方查文档。
value是数值、或称变量。变量听起来很程序,那是因为你没听过,变量的反义词叫做「常数」,常数永远不会变。然后我们来学一下数学:「x + y = 3」,x 是多少?这下懂了吗!因为 x 不固定,所以他才叫变量。数学公式,就是由一堆变量组成的。
你必需要知道的是,程序也是由变量组成,写程序如同写公式,但本文没有…
既然属性不能改,那么能动的只剩value。值:可以有数值、字符串、布尔、数组以及对象。
说明一下符号,跟作文一样,作文有标点符号,Json也有,但Json比较少:
大括号({}):用来表示对象
中括号([]):用来表示数组
冒号(:)用来指定给值
逗号(,):分隔符号
单引号(‘):用来表示字符串(纯文本)
双引号(“):用来表示属性
反斜线(\):跳脱字符符号
身为程序员,都应该用使用标准写法,而标准写法的Json格式应该长这样,有一堆双引号:
数值(Json格式):{“name”:123}
字符串(Json格式):{“name”:’123′}
布尔(Json格式):{“name”:true}
数组(Json格式):{“name”:[1,2,3,4,5]}
对象(Json格式):{“name”:{“name2”:123}}
身为一个玩家,Json格式可以长这样,这样更短更好读,也更好调试:
数值(Json格式):{name:123}
字符串(Json格式):{name:'”123″‘}
布尔(Json格式):{name:true}
数组(Json格式):{nume:[1,2,3,4,5]}
对象(Json格式):{nume:{name2:123}}
你必需要知道的是,这两种格式都是对的,因为Json原本就允许这么写。
跳脱字符是什么?
假设我有一个字符串「123\456\789」。
套用Json格式:{name:'”123\456\789″‘}
不能运行,因为Json把他当成路𠇹了!
Json是白痴,你要告诉他「\」是文本。那要怎么做呢?请再加上一个「\」跳脱字符。
正确格式:{name:'”123\\456\\789“‘}
来看一下刚才声明的属性:{CustomName:'”Steve”‘}
「”」用来表示属性,注意双引号的外面还有一层单引号。
Json是白痴,你要告诉他「”」是文本,所以这段的外面加了单引号,告诉Json这是纯文本。
同样的写法,也可以用跳脱字符表示:{CustomName:”\”Steve\””}
两段是一样意思。这里看不懂,请跳过,因为不重要!
注意了!对象中可以放对象,如同一个箱子。既然箱子可以放东西,那箱子中再放一个箱子也可以吧,没道理箱子只能放东西啊!
介绍一下布尔(Boolean):为什么叫这名字?因为发明他的人叫「Boole」。那这是用来干麻的呢?用来表示真与假,所以他只有两个值「True、False」。布尔也可以用数字表示:「1、0」。再来说比较特别的--数组,数组才是造成指令超超超级长的主因。
你必需要知道的是,数值与字符串不同:
数值处理数字,是数字相加:「1 + 2 = 3」
字符串处理数字,是文本相连:「1 + 2 = 12」
Json是声明对象的格式,对象中可以放对象,数组里面又有多个值,而这些值也可以是对象,所以就会变成:对象包很多个数组,然后数组放更多的对象,你包我、我包你……然后整段指令你就看不懂了。
不懂没关系,看实例:
生成村民,名字Steve、类型沙漠、职业农夫、等级学徒。以40个绿宝石贩售钻石剑,附魔:锋利5、横扫之刃3、击退2,每日交易上限3次;以30个绿宝石贩售弓,附魔:强力5、冲击2,每日交易上限3次。
/summon minecraft:villager ~ ~ ~ {VillagerData:{type:desert,profession:farmer,level:2},CustomName:'”Steve”‘,Offers:{Recipes:[{maxUses:3,buy:{id:emerald,Count:40},sell:{id:diamond_sword,Count:1,tag:{Enchantments:[{id:sharpness,lvl:5},{id:sweeping,lvl:3},{id:knockback,lvl:2}]}}},{maxUses:3,buy:{id:emerald,Count:30},sell:{id:bow,Count:1,tag:{Enchantments:[{id:power,lvl:5},{id:punch,lvl:2}]}}}]}}
指令很长,我知道,故意的。
把指令的地方挑掉,只留Json:
{VillagerData:{type:desert,profession:farmer,level:2},CustomName:'”Steve”‘,Offers:{Recipes:[{maxUses:3,buy:{id:emerald,Count:40},sell:{id:diamond_sword,Count:1,tag:{Enchantments:[{id:sharpness,lvl:5},{id:sweeping,lvl:3},{id:knockback,lvl:2}]}}},{maxUses:3,buy:{id:emerald,Count:30},sell:{id:bow,Count:1,tag:{Enchantments:[{id:power,lvl:5},{id:punch,lvl:2}]}}}]}}
看不懂,没关系,我也看不懂,因为没排版。来排版一下:
{
VillagerData:{
type:desert,
profession:farmer,
level:2
},
CustomName:'”Steve”‘,
Offers:{
Recipes:[
{
maxUses:3,
buy:{id:emerald,Count:40},
sell:{
id:diamond_sword,
Count:1,
tag:{
Enchantments:[
{id:sharpness,lvl:5},
{id:sweeping,lvl:3},
{id:knockback,lvl:2}
]
}
}
},
{
maxUses:3,
buy:{id:emerald,Count:30},
sell:{
id:bow,
Count:1,
tag:{
Enchantments:[
{id:power,lvl:5},
{id:punch,lvl:2}
]
}
}
}
]
}
}
我们一段一段处理。把对象展开,像数学公式一样…
对象是节点的概念,可以用二分法来表示。二分法、或称二叉树、或称二元树。要叫生命树也行(虽然没人这么叫),不过这颗树只有树根,只能往下长。
根节点:
第二层节点:
第三层节点:
树根第四、五层节点:
左树根第六、七层节点:
右树根第四、五、六、七层节点:
那么怎么写成Json呢?每个节点都是一个对象,必需写成{key:value}才符合规范,然后你发现上面的树根,啊啦不可思议,每个节点刚好都符合规范呢。那么可以动手了!拼图拼过吧,接起来就是了,怎么接,用「,」一个一个拼回去。然后你会发现,Json你学完了!
你必需要知道的是,程序员通常也用二分法的方式处理Json,因为更容易调试。任何一个节点都能够单独处理,也就是说:可以将一个超大型对象,分给10个人写,最后将Json拼在一起而不出错。
你必需要知道的是,Json只是文本档,没有任何功能,可以用记事本写,写完存成「.json」,他就是Json档。
你必需要知道的是,Minecraft文件中存在很多Json档,你可以发现很多秘密。设计师常常把东西藏在Json中,你要做的,就只是把他调用出来。
你必需要知道的是,Minecraft指令其实有生成器可以用,他会自动帮你打好指令…好吧,我应该是要放在开头的,但是我忘了…