《我的世界》扫雷制作图文教程 扫雷怎么制作

单机攻略      更新:2016-12-14

《我的世界》中有些玩家做出了扫雷这个windows经典小游戏了,然而很多玩家想要学在我的世界中做扫雷小游戏,下面小编就为大家带来我的世界扫雷制作图文教程,告诉大家扫雷怎么做,希望对各位玩家有所帮助。

下载地址:点击进入

一、整理思路

扫雷,一个风靡全球的小游戏,简单的规则,然而却能够吸引很多的玩家挑战。那么我们现在来分析一下扫雷的规则:

每个被翻开的格子,如果其不是雷,则会写出其周围8个格子所包含的雷数,如果是0则会翻开周围8个格子。翻开的是雷则游戏结束。

2. 翻开的第一个格子永远不会是雷。

好的,那么现在我们确定了一个目标,制作扫雷,那么我们就可以根据规则列出一张扫雷的游戏流程表。(由于在初期计划阶段,我们大概画画就好。)

Ok,那么现在我们有了一个初始的计划图,现在,由于我们是要在mc里制作这样一个游戏,那我们现在开始就要将其模块化条理化并添加mc元素进去。容我们来梳理一下思路:

开局:由于我们要保证第一步翻开的格子肯定不是雷,那么显而易见,我们需要在开局,即翻开第一个格子的时候,生成整个棋局,才能完全保证我们所翻的格子不是雷。而我们也要保证生成完棋局的时候确实那个格子是被翻开的。同时呢,计时器也要开始工作。

游戏中:这个地方很简单,我们需要检测玩家的类左键操作和类右键操作。同时对其进行处理,而我们还需要统计场上出现的旗帜数。最后,我们还需要进行胜利判定。

胜利/失败:这个重点不多,我们只需要将地图剩余未标记的雷和标记错误的格子进行反馈。或者计算出玩家的时间是否能够开启修改英雄榜的方法。

重新开局:这个地方也是非常简单的。直接就可以重置地图,统计,还有时间。

英雄榜:将现有玩家的分数打印出来,同时给予玩家打印自己名字的权限。简单的说就是个打字机。

让我们简洁的整理下思路:

开局:生成雷局,开始计时器。

游戏中:检测输入,统计旗帜,检测胜利。

胜利:检查时间是否低于最优记录。

失败:反馈未正确标记的格子。

重新开局:重置雷局,重置计时器。

仔细看看其实我们要做的也不是特别多嘛,压力还是不大的。那么我们现在可以再将整理过的思路进行填充,增加实现方法。在开工各个部分之前,我们需要定一个整体的规划,这样就可以使我们建造出来的各个模块能够协同工作,可以理解为是某种协议。

首先,扫雷需要是哪种显示方法?当然有很多选择,但是我这里使用的是展示框配合地图的显示方法,因为展示框不是方块,是一个实体,那么就可以很方便的用选择器来进行选择及操作,它可以响应左键右键和中键,而其和地图的联动让其的显示效果丝毫不亚于方块。而操作方法也就在这时候定下来了,单纯的左键右键以及中键。

其次我们现在可以考虑模块之间有哪几种交流。生成雷局的时候,由于我定的规模是初级扫雷,那么就会有十个格子被标记为雷,而这个会在游戏中和失败两个模块里用到。计时器会在胜利模块中用到。旗帜会在失败模块里用到。


二、开工

那么现在我们可以开工了。由于我们选择的是展示框显示屏,所以我们只能通过高频检测的情况来进行正常游戏。

这里我将我的电路截图进行说明,有图为证,整个扫雷的电路的确是模块化的产品:

制作开始。

这里是将地图进行预加载的地方,然而由于失误,我漏掉了没有雷的格子。

注:文中指令方块部分使用了绝对坐标,具体制作中请参考具体地图位置。

开局

这是我的棋局的剖面图,这里我的开局使用的是石质按钮开局,原因是我不希望高频一直启动着,这里选择用按钮是在效果和性能之间的折中选择。

每个按钮都可以激活前两层的命令方块,共计六个,第一层可以放置互相干扰也没问题的命令方块第一层的指令为:

setblock 16 3 -15 redstone_block

该指令的作用为开启生成棋局的命令方块阵列第二层的指令为:

setblock ~ ~ ~2 air

该指令的作用为对这个格子进行一个标记,使生成雷局的时候不会在这个格子生成雷(其实这种处理方式没必要这么麻烦,然而我懒的找按下的按钮的数据值)。

   开局模块:

其中中继器末尾就是上文红石块的放置位置,再配合这个命令就可以输出一个脉冲:

setblock ~ ~-1 ~ air

另外一个命令方块是上文标记系统的第二部分,指令如下:

/execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] ~ ~ ~ detect ~ ~ ~ air 0 /scoreboard players set @e[c=1,type=ItemFrame] kill 1

这条指令的作用是给棋局内部按钮被消去的格子里的展示框的kill计分板分数+1。

中继器之后接的命令是如下几条:

这条指令没什么必要,提供一个按下的格子变成禁止符号的标记,纯粹的视觉效果:

entitydata @e[score_kill=1,score_kill_min=1] {Item:{id:"minecraft:barrier",Count:1b,Damage:0s}}

这条指令是用来清除所有的石质按钮。因为石质按钮只是在开局时使用的。

fill 19 17 23 27 25 23 air 0

这条指令为激活左边的命令阵列

setblock ~ ~1 ~1 redstone_block

该阵列由复制十次的模块组成

   模块讲解:

每个模块都有

setblock~ ~-1 ~ air

setblock ~ ~1 ~1 redstone_block

两条指令,这两条指令的作用就是复位本个模块并往下一个模块输出信号。

每个模块又包含生成雷局的核心指令:

scoreboard players set @r[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_kill_min=0,score_kill=0,score_high=0,score_high_min=0] high 1

@r自带随机功能,而选择器内选择kill分数为0而且high分数也为0的展示框,使其high计分板的分数为1(high计分板就是标记这个格子是否有雷的计分板)。

其作用翻译成人话就是:除去刚按下的那个,然后随便找一个没标记的展示框标记一下。

这条指令会被激活十次,所以雷局里会有十个雷。

命令阵列执行到最后,会往远处那个中继器里输出信号,

后面接着的五个命令方块是用来给每个格子写入数字,即我们在玩扫雷时看到的数字,指令如下:

execute @e[type=ItemFrame,score_high=1,score_high_min=1] ~ ~ ~ /scoreboard players remove @e[r=1,type=ItemFrame] mine 1

execute @e[type=ItemFrame,score_high=1,score_high_min=1] ~ ~ ~ /scoreboard players add @e[dx=1,dy=1,type=ItemFrame] mine 1

execute @e[type=ItemFrame,score_high=1,score_high_min=1] ~ ~ ~ /scoreboard players add @e[dx=1,dy=-1,type=ItemFrame] mine 1

execute @e[type=ItemFrame,score_high=1,score_high_min=1] ~ ~ ~ /scoreboard players add @e[dx=-1,dy=1,type=ItemFrame] mine 1

execute @e[type=ItemFrame,score_high=1,score_high_min=1] ~ ~ ~ /scoreboard players add @e[dx=-1,dy=-1,type=ItemFrame] mine 1

非常相似的指令,总的来说就是给每个雷周围8个展示框里的数字+1。

   最后一条指令,开启“游戏中”模块:

setblock -3 4 -15 redstone_block


游戏中

指针所指之处为fill高频。上面的红石块将放置在此处。

由于该模块的核心为fill高频。所以电路结构非常简单,就是很多命令方块围着一根红石块棒子,我就不上截图了。

然而其中的时序是非常严谨的。由于fill高频是有一个更新顺序,这个顺序是由坐标决定,站里也有人研究,因此在这里不详细说明了。

下面我将按照时序介绍指令而不是逻辑顺序。

   ①这个命令是将所有问号格子的旗帜标记取消。即取消标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] flag 0 {ItemRotation:0b,Item:{id:"minecraft:filled_map",Count:1b,Damage:106s}}

   ②高频产生:

fill ~-1 ~-1 ~ ~15 ~-1 ~ redstone_block

fill ~-1 ~1 ~ ~15 ~1 ~ air

给予所有的格子左键标志:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] l 1

将所有被旋转过一次的未翻开格子给予右键标志:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark=0,score_mark_min=0] r 1 {ItemRotation:1b,Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

   ③将上方状态栏的展示框拨正:

entitydata @e[18,27,22,dx=10,dy=3,dz=1] {ItemRotation:0b}

取消所有未旋转的展示框的右键标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark=0,score_mark_min=0] r 0 {ItemRotation:0b}

取消所有有装地图的展示框的左键标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] l 0 {Item:{id:"minecraft:filled_map"}}

将所有被插旗的格子的内容变为旗帜:

entitydata @e[type=ItemFrame,score_flag=1,score_flag_min=1] {Item:{id:"minecraft:filled_map",Count:1b,Damage:105s}}

此四条不重时序,将空白格子的周围格子翻开:

execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark_min=2,score_mark=2] ~ ~ ~ scoreboard players set @e[dx=1,dy=1,dz=1,type=ItemFrame,score_flag=0,score_flag_min=0,score_high=0,score_high_min=0] l 1 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark_min=2,score_mark=2] ~ ~ ~ /scoreboard players set @e[dx=1,dy=-1,dz=1,type=ItemFrame,score_flag=0,score_flag_min=0,score_high=0,score_high_min=0] l 1 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark_min=2,score_mark=2] ~ ~ ~ /scoreboard players set @e[dx=-1,dy=1,dz=1,type=ItemFrame,score_flag=0,score_flag_min=0,score_high=0,score_high_min=0] l 1 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark_min=2,score_mark=2] ~ ~ ~ /scoreboard players set @e[dx=-1,dy=-1,dz=1,type=ItemFrame,score_flag=0,score_flag_min=0,score_high=0,score_high_min=0] l 1 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

将所有被旋转的旗帜格子进行右键标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark=0,score_mark_min=0] r 2 {ItemRotation:1b,Item:{id:"minecraft:filled_map",Count:1b,Damage:105s}}

探测是否有被踩中的雷(此条接比较器,往失败模块输出):

testfor @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high_min=1,score_high=1] {Item:{id:"minecraft:filled_map",Count:1b,Damage:108s}}

   ④将所有旗帜格子进行旗帜标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] flag 1 {ItemRotation:0b,Item:{id:"minecraft:filled_map",Count:1b,Damage:105s}}

将所有被标记的格子的数字调整到非法值:

scoreboard players set @r[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high=1,score_high_min=1] mine 9

将旋转的问号格子进行右键标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_mark=0,score_mark_min=0] r 3 {ItemRotation:1b,Item:{id:"minecraft:filled_map",Count:1b,Damage:106s}}

   ⑤将所有没有方块依附的展示框后方放上方块:

/execute @e[type=ItemFrame] ~ ~ ~ detect ~ ~ ~-1 air 0 setblock ~ ~ ~-1 command_block 0 keep {Command:"setblock 16 3 -15 redstone_block"}

将所有拥有右键标记的空白格子内容变为旗帜:

entitydata @e[score_r=1,score_r_min=1,type=ItemFrame] {ItemRotation:0,Item:{id:"filled_map",Damage:105}}

将所有拥有右键标记的旗帜格子内容变为问号:

entitydata @e[score_r=2,score_r_min=2,type=ItemFrame] {ItemRotation:0,Item:{id:"filled_map",Damage:106}}

将所有拥有右键标记的问号格子内容变为空白(这里之所以格式不同是因为留个中键的接口):

execute @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_r=3,score_r_min=3] ~ ~ ~ setblock ~ ~ ~-4 redstone_block

胜利检测,当空白格子、问号格子和旗帜格子之和为10时游戏胜利(输出接胜利模块):

testfor @a[score_s=10,score_s_min=10]

旗帜数目检测(输出接旗帜统计):

testfor @e[score_flag=1,score_flag_min=1,type=ItemFrame]

将所有被踩中的雷进行标记:

scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high_min=1,score_l_min=1,score_l=1] mark2 1

翻开被踩中的空白格子(其余数字也有各自的指令,暂不详述):

entitydata @e[type=ItemFrame,score_l=1,score_l_min=1,score_mine=0,score_mine_min=0] {ItemRotation:0b,Item:{id:"filled_map",Damage:104}}

对满足胜利条件的格子进行标记:

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] mark 3 {Item:{id:"minecraft:filled_map",Count:1b,Damage:105s}}

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] mark 5 {Item:{id:"minecraft:filled_map",Count:1b,Damage:106s}}

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] mark 4 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

   ⑥探测满足胜利条件的格子

testfor @e[score_mark=5,score_mark_min=3,type=ItemFrame]

   ⑦重置所有的标记

/scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame] mark 0

好的…实际上到这里,整个扫雷的主体已经完工,接下来就是一些非常简单的玩意儿。


胜利模块

   进行胜利宣言:

title @a title {text:"YOU WIN!",color:"red",bold:"true"}

   停止游戏中的高频:

setblock -3 6 -15 redstone_block

   你懂得,就是显示游戏胜利戴墨镜的那张脸:

entitydata @e[name=face] {Item:{id:"minecraft:filled_map",Count:1b,Damage:102s}}

   比较此次成绩与最好纪录:

/scoreboard players operation @a timeall -= @a best

testfor @a[score_timeall=0]

   一旦此次成绩更好,则设置此次成绩为最好成绩,同时开启英雄榜:

setblock 27 18 41 redstone_block

/scoreboard players operation @a timeall += @a best

/scoreboard players operation @a best = @a timeall

   重置时间:

scoreboard players set @a time2 0

scoreboard players set @a time1 0

scoreboard players set @a time 0


失败模块

   你懂得,还是那张脸:

entitydata @e[name=face] {Item:{id:"minecraft:filled_map",Count:1b,Damage:103s}}

   停止高频:

setblock -3 6 -15 redstone_block

   将踩中的雷变成红色爆炸的雷。

scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high_min=1,score_high=1] mark2 1 {Item:{id:"minecraft:filled_map",Count:1b,Damage:104s}}

entitydata @e[score_mark2_min=1,score_mark2=1] {ItemRotation:0b,Item:{id:"minecraft:filled_map",Count:1b,Damage:108s}}

   将未标记的雷指出。

scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high_min=1,score_high=1] mark2 2 {Item:{id:"minecraft:filled_map",Count:1b,Damage:1s}}

entitydata @e[score_mark2_min=2,score_mark2=2] {ItemRotation:0b,Item:{id:"minecraft:filled_map",Count:1b,Damage:107s}}

   将错误标记指出

scoreboard players set @e[19,17,22,dx=9,dy=9,dz=1,type=ItemFrame,score_high_min=0,score_high=0,score_flag=1,score_flag_min=1] mark2 3

entitydata @e[score_mark2_min=3,score_mark2=3] {ItemRotation:0b,Item:{id:"minecraft:filled_map",Count:1b,Damage:118s}}

原文地址:http://www.18pk.com/web/wen-258822.html 转载请在文首保留此行。

感兴趣的