先说明一下,本篇教程基于1.8版本。至于为什么不用高版本的mc呢?因为这是去年做的东西,作者犯懒癌不想在高版本重做了,请各位见谅。高本版制作请自行转换指令格式,并把比较器换成连锁命令方块。
先放一个图:
正如图中所见,空中有一个时钟,每过一分钟末位就会+1,到了60会自动进一小时。
其实时间是三个计分板(作者懒,可以做成一个计分板,为了更加好区分,这里用三个计分板)分别是s(秒)min(分钟)h(小时)
那么这个时钟只显示小时和分钟,所以只把小时和分钟两个积分转换到方块就可以了。
那么重点来了,如何把积分转换成方块呢
当然是clone,我们需要一个被clone的区域:
这是十个已经摆好的数字(0到9),到时候需要哪一个,就clone哪一个
下面说说如何把一个积分拆解开
假如我有一个五位数的积分,这个五位数从00000到99999都有可能,那么想要表示所有的数字,需要穷举100000次才能做到,显然这个工作量是不允许的。
但是如果能把五位数拆成五个数,比如把12345拆成1、2、3、4、5,无个数字位,那么每个数字位需要穷举10次,五个数字位只要50次就可以了,减少了很大工作量。
如果一个分数是abcde,(abcde各代表一个数字)那么将abcde/10=abcd······e(得数是abcd,余数是e)这样就得到了个位数e,再将得数abcd/10=abc······d,这样就得到了十位数d,依次除以10四次,就能得到全部五个位数。再将每个位数穷举10次,就能完成分数到方块的转化了。
下面来具体说一下时钟所用的指令(此时钟有个缺陷,由于命令方块不能把电脑时间调进来,所以每次重新进入存档需要调表,只有一直开着存档或者服务器才能维持时钟一直运转)
首先想要时钟精确运转,就需要精确的计算一秒钟,可以运用fill高频,让加分指令每秒运行20次,每加20分加一秒
(计分板等自行创建,在此只说原理)
/scoreboard players add @e[type=ArmorStand,r=3,name=js] FX 1
/execute @e[name=js,type=ArmorStand,score_FX_min=20,score_FX=20] ~ ~ ~ /setblock ~ ~ ~-5 redstone_block
/scoreboard players set @e[type=ArmorStand,r=3,name=js,score_FX_min=20,score_FX=20] FX 0
我们暂且吧这个红石块连接的电路称为每秒执行一次的命令区A
即为每过一秒,就在图示位置放置一个红石块,之后连接命令方块清除红石块(/setblock ~-2 ~ ~ air)
之后召唤一个名为BJSJ的盔甲架来存时间:
<div class="blockcode"><blockquote>/summon ArmorStand ~ ~ ~ {CustomName:"BJSJ",CustomNameVisible:1b,NoGravity:0,Invisible:1}
同时在每秒执行一次的命令区A连接下列四个命令方块
/scoreboard players add @e[type=ArmorStand,name=BJSJ] s 1
/execute @e[score_s_min=60,type=ArmorStand,name=BJSJ] ~ ~ ~ /scoreboard players set @e[type=ArmorStand,name=BJSJ] s 0
/execute @e[score_min_min=60,type=ArmorStand,name=BJSJ] ~ ~ ~ /scoreboard players set @e[type=ArmorStand,name=BJSJ] min 0
/execute @e[score_min_min=60,type=ArmorStand,name=BJSJ] ~ ~ ~ /scoreboard players add @e[type=ArmorStand,name=BJSJ] hour 1
这样就完成了在BJSJ盔甲架上的计时,但是此时在此盔甲架上有三个积分:两位数的hour,两位数的min,两位数的s,抛去s不用转换为方块,我们需要把min和hour两个积分分别转换为两个个位数。
在每秒执行一次的命令区A另外防止一个命令方块:
/execute @e[name=BJSJ,type=ArmorStand,score_s_min=1,score_s=1] ~ ~ ~ /setblock 96 3 91 redstone_block
此setblock放置的红石块每分钟才会放置一次,我们暂且把这个红石块连接的电路,称作每分钟执行一次的命令区B
此时需要再次召唤四个盔甲架,分别来存储hour的个位,十位、min的个位,十位。
/summon ArmorStand ~ ~ ~ {CustomName:"BJSJM",CustomNameVisible:1b,NoGravity:0,Invisible:1}
/summon ArmorStand ~ ~ ~ {CustomName:"BJSJM1",CustomNameVisible:1b,NoGravity:0,Invisible:1}
/summon ArmorStand ~ ~ ~ {CustomName:"BJSJH",CustomNameVisible:1b,NoGravity:0,Invisible:1}
/summon ArmorStand ~ ~ ~ {CustomName:"BJSJH1",CustomNameVisible:1b,NoGravity:0,Invisible:1}
在命令区B首先把BJSJ在min和hour上的分数存到刚刚创建的四个盔甲架上方便后续运算:
/scoreboard players operation @e[type=ArmorStand,name=BJSJH] hour = @e[type=ArmorStand,name=BJSJ] hour
/scoreboard players operation @e[type=ArmorStand,name=BJSJM] min = @e[type=ArmorStand,name=BJSJ] min
/scoreboard players operation @e[type=ArmorStand,name=BJSJH1] hour = @e[type=ArmorStand,name=BJSJ] hour
/scoreboard players operation @e[type=ArmorStand,name=BJSJM1] min = @e[type=ArmorStand,name=BJSJ] min
创建一个名为10的盔甲架,并把它在FX记分板上的分数设定为10,用来当除数
/summon ArmorStand ~ ~ ~ {CustomName:"10",CustomNameVisible:1b,NoGravity:0,Invisible:1}
/scoreboard players set @e[type=ArmorStand,name=10] FX 10
之后连接另外四个命令方块分别计算出小时和分钟的个位十位
/scoreboard players operation @e[type=ArmorStand,name=BJSJH] hour /= @e[type=ArmorStand,name=10] FX
/scoreboard players operation @e[type=ArmorStand,name=BJSJM] min /= @e[type=ArmorStand,name=10] FX
/scoreboard players operation @e[type=ArmorStand,name=BJSJH1] hour %= @e[type=ArmorStand,name=10] FX
/scoreboard players operation @e[type=ArmorStand,name=BJSJM1] min %= @e[type=ArmorStand,name=10] FX
为了新手能看懂,在此稍作讲解/scoreboard players operation <选择器一> <记分板一> <运算方式> <选择器二> <记分板二> 该指令能对两个积分进行运算,运算结果最终会存到选择器一上,即选择器一在记分板上的分数会变为此指令运算的结果,/=为除法求得数,%=为除法求余数。
到此我们就得出了时钟上的四个数字,只要把每一位穷举10次即可
穷举举例如下:
/testfor @e[type=ArmorStand,name=BJSJM,score_min_min=1,score_min=1]
连接比较器
/clone x y z x1 y1 z1 x2 y2 z2
即为检测在分钟个位上数字是否为一,如果是,则执行后续指令clone数字1到指定位置
如此重复40次(整理一下坐标复制粘贴很快的)
最终效果如下:
想要调整时间直接调整BJSJ的相应分数即可
/scoreboard players set @e[type=ArmorStand,name=BJSJ] s 00
/scoreboard players set @e[type=ArmorStand,name=BJSJ] min 00
/scoreboard players set @e[type=ArmorStand,name=BJSJ] hour 00
这样一个时钟就大功告成啦~\(≧▽≦)/~