2048游戏在我的世界实现教程 在游戏中玩游戏
2048游戏在我的世界实现教程 在游戏中玩游戏。那下面给大家分享的则是我的世界中事项2048小游戏的教程哦~那不知道怎么在command_block下的思路与实现中制作2048的玩家不妨进来看看下面的教程吧!希望对大家有所帮助。
游戏园我的世界官方群:325049520 或 256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!
玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!
如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:点我进入
如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~
链接:
密码:hegn
2048在command_block下的思路与实现
<说明>
建议版本:1.9.4以上
开发版本:1.9.4
本作品只完成了2048一个方向的移动合并,其余三个方向均未动工,但是其余三个方向的移动合并方式与已完成的一个方向完全相同,如果有谁再问为什么没有做完的直接打脸(* ̄︶ ̄)y,本作品旨在演示原理。
<基本操作方法>
棕色羊毛的踏板开始新一轮游戏
四边上的踏板代表向四个方向移动数字(虽然只完成了一个方向)
2048游戏在我的世界实现教程 在游戏中玩游戏。那下面给大家分享的则是我的世界中事项2048小游戏的教程哦~那不知道怎么在command_block下的思路与实现中制作2048的玩家不妨进来看看下面的教程吧!希望对大家有所帮助。
游戏园我的世界官方群:325049520 或 256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!
玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!
如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:点我进入
如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~
链接:
密码:hegn
2048在command_block下的思路与实现
<说明>
建议版本:1.9.4以上
开发版本:1.9.4
本作品只完成了2048一个方向的移动合并,其余三个方向均未动工,但是其余三个方向的移动合并方式与已完成的一个方向完全相同,如果有谁再问为什么没有做完的直接打脸(* ̄︶ ̄)y,本作品旨在演示原理。
<基本操作方法>
棕色羊毛的踏板开始新一轮游戏
四边上的踏板代表向四个方向移动数字(虽然只完成了一个方向)
<实现原理>
【首先谨记:Never Give Up! (重做过一边的人含着泪说????(?Д`)????】
【使用的记分板:2048(记录Shulker的分数),test(用于等值检测模块判断Shulker的分数是否相等)】
实现的过程大致分为两个步骤:
1) 开局
2) 移动合并
接下来将会对这两个步骤分别讲解
1、开局
-开局:
首先这是我们的2048界面, Shulker(潜隐贝)是我们的数字:
开始后会在4×4的数字板(暂且这么称呼)上的随机两个格子放两个Shulker,具体的实现方法就是先在一个特定的位置summon两个名字为“2”的Shulker,并将他们的2048分数设置为2,再将它们打散到数字板中,命令如下:
//清除原来的Shulker
/kill @e[type=Shulker]
//生成shulker×2
/summon Shulker X Y Z {NoAI:1,CustomName:"2",CustomNameVisible:1,Invulnerable:1b}
/summon Shulker X Y Z {NoAI:1,CustomName:"2",CustomNameVisible:1,Invulnerable:1b}
//给生成的shulker设置2048的分数
/scoreboard players set @e[type=Shulker,name=2] 2048 2
//把生成的Shulker打散到数字板中,使用spreadplayers指令
//-1462 1013是数字板的中心xz坐标,没有y值,2 3是打散距离
/spreadplayers -1462 1013 2 3 false @e[name=2,type=Shulker]
然后开局完毕
2、移动合并
然后来讲讲如何判断
这个步骤就是2048的核心步骤,而我实现这个步骤的主体思路是:“分情况处理”,有些类似于数学中的分类讨论,在此我们先不看四行,只看单一的一行,从上往下分别标号1、2、3、4:
因为其它四行的样式与这一行一样,对这一行的处理就可以类比推导到其他行
我们再撇开Shulker的分数不同的问题,只关注这四个格子上是否存在Shulker,那么就会出现这些情况(1代表有Shulker,0代表没有Shulker):
0000;0001;0010;0100;1000;
0011;0101;1001;0110;1010;1100;
1110;1101;1011;0111
1111
在此,0000这种情况不会有任何动作,所以我们把这种情况排掉,所以就剩下15种:
0001;0010;0100;1000;
0011;0101;1001;0110;1010;1100;
1110;1101;1011;0111
1111
然后我们再分情况处理,而要做到分情况处理,testfor探测相对位置的Shulker即可,至于怎么探测相对位置的Shulker,我们在后面会讲到,具体指令如下:
/execute @e[type=ArmorStand,name=yellow] ~6 ~~ testfor @e[r=0,type=Shulker] {CustomNameVisible:1b}
这就完成了对1000这一种情况的鉴别(前头的execute用于相对位置的确定,我们之后再说,现在的重点是testfor指令鉴别情况),但是这也就衍生出来一个问题那就是,这里只是检测1号位是否有shulker,而1号位有shulker的情况不止这一种,比如说1100、1010、1001等,这就会使我们情况判断不准确引起处理错误。
为了解决这个问题,我们只要用一些叫null的Invisible的as来占掉空位,在检测时连带检测空位即可,举个例子,1000与1001虽然1号位都有shulker,但是4号位不一样,因为有占位机制,所以1000的4号位是null,而1001的4号位是shulker。
所以判断1000的真正指令是这样:
//检测4号位是否是null
/execute @e[type=ArmorStand,name=yellow] ~ ~ ~testfor @e[r=0,type=ArmorStand,name=null]
//检测3号位是否是null
/execute @e[type=ArmorStand,name=yellow] ~2 ~~ testfor @e[r=0,type=ArmorStand,name=null]
//检测2号位是否是null
/execute @e[type=ArmorStand,name=yellow] ~4 ~~ testfor @e[r=0,type=ArmorStand,name=null]
//检测1号位是否是Shulker
/execute @e[type=ArmorStand,name=yellow] ~6 ~~ testfor @e[r=0,type=Shulker] {CustomNameVisible:1b}
而我们的占位模块就在这里:
就数字板的旁边每一个icb翻转对应一个格子(别问我为什么是翻转对应,当我把占位模块做完之后我才发现做反了,然后我也懒得改了╮( ̄▽ ̄")╭),这是一个占位单元:
icb用来检测其对应位置是否有shulker,如果有,就把那个位置原有的null清除掉,如果没有,就在其对应位置生成null,指令如下:
//rcb
/testfor @e[x=X,y=Y,z=Z,r=0,type=Shulker]
//然后比较器输出,连接cb
/kill@e[x=-1463,y=56,z=1010,r=0,type=ArmorStand,name=null]
//连接非门(就是那个火把)
/summon ArmorStand -1463 56 1010 {CustomName:"null",Invisible:1b,NoGravity:1b}
所以真实的数字板应该是这样的(gm 3):
判断完了情况,然后就是处理了,这里就要用到相对位置这个概念,至于相对位置在这里是什么,怎么实现,往下看就知道了。
[很晕对吧,这就对了,,]
现在我们来讲讲我们之前提到的相对位置的确定,相对位置这个概念的引入帮助我减少了3/4的工程量,而且之后的判断相加合并等操作也与之密不可分,可见其作用巨大(想偷懒就直说(╬ ̄皿 ̄)凸)
相对位置在这里类似于汇编中的偏移地址(byte[es:0x01]),我们在从右往左的第一行的4号位有一个叫yellow的Invisible的as(你可以看到第四行的4号位的as颜色比较深,那是应为那里有null和yellow两个as),通过依次将这个as传送到第三、第二、第一、第四行的4号位并在每次传送后进行情况判断处理,我们就可以实现一个方向的移动合并
当我们踩下黄色羊毛的踏板是,会在(-1462 56 978),就是我们的黄色处理cb群的起始位置,放置一个redstone_block,然后就会启动这一个装置:
四条cb链的底部的cb会依次传送yellow,而上面的四个icb就是将当前要判断处理的shulker的分数映射到寄存模块中(下面两个ccb就别管了~一个是weather clear,一个是激活上面四个ccb),指令如下:
/scoreboard players operation@e[type=ArmorStand,r=0,x=-1449,y=57,z=1016] 2048 =@e[type=Shulker,x=-1463,y=56,z=1014,r=0] 2048
/scoreboard players operation @e[type=ArmorStand,r=0,x=-1447,y=57,z=1016]2048 = @e[type=Shulker,x=-1461,y=56,z=1014,r=0] 2048
/scoreboard players operation@e[type=ArmorStand,r=0,x=-1445,y=57,z=1016] 2048 =@e[type=Shulker,x=-1459,y=56,z=1014,r=0] 2048
/scoreboard players operation @e[type=ArmorStand,r=0,x=-1451,y=57,z=1016]2048 = @e[type=Shulker,x=-1465,y=56,z=1014,r=0] 2048
然后再启动判断处理机制就可以了。
Well,这里蹦出来了一个新东东:寄存模块,我来解释一下
寄存模块的作用就是将当前要处理的shulker的分数暂时储存,这样当判断模块(之后会讲)判断的时候就可以直接调用寄存模块的分数,而不用麻烦的从数字板那里调用分数,而当我们要相加的时候,也可以直接调用寄存模块的分数,说白了,寄存模块就像编程语言里面的变量一样。
而寄存模块的构成十分简单。。。就是四个as,分别叫a1,a2,a3,a4,分别对应1号位,2号位,3号位,4号位。每次处理一行之前只要对应映射到寄存模块就可以了。
好吧到这里相对位置也讲完了。。。(? ˙з˙)?
然后就是判断处理了啊~
判断方法我已经在上面讲过了,这里就不再多说,每一次传送之后都会激活这一竖行的ccb,ccb后面跟着的就是判断机制:
我们先讲:【1000,0100,0010,0001】这四种情况的处理,非常简单,只要把他们tp到1号位即可,我们用0100举例:
/execute @e[type=ArmorStand,name=yellow] ~4 ~~ tp @e[type=Shulker,r=0] ~-4 ~ ~
然后再讲这6种情况:【0011;0101;1001;0110;1010;1100】由于出现了2个shulker在一行的情况,我们有必要判断两个shulker的2048分数是否相等,如果相等,就把分数加起来,清除掉一个后再移动;如果不相等,就把两个一起移动。
那么这里,就要用到“等值检测模块”,简称“等测模块”(等厕( ̄y▽ ̄)╭):
等测模块所使用的记分板是test,防止与2048记分板混淆,其成员有:【Checker1;Checker2;CheckResult;Bool】,初始值为:[Checker1.test=1;Checker2.test=0;CheckResult.test=0;Bool.test=0;]
Checker1、2用于存放要对比的两个shulker的分数
CheckResult用于存放Checker1、2的处理结果
Bool用于存放两个分数是否相等(0>不等,1>相等)
等测模块的实现方法就是先把Checker1、2的分数想减,结果存放于CheckResult,然后检测如果CheckResult的test=0,则相等,Bool的test改为1
如果CheckResult的test≠0,则不相等,Bool的test不变,为0
实现指令如下,指令与指令之间用icb连接(chain-condition-always active):
/scoreboard players operation@e[name=CheckResult,type=ArmorStand] test = @e[name=Checker1,type=ArmorStand]test
/scoreboard players operation@e[name=CheckResult,type=ArmorStand] test -= @e[name=Checker2,type=ArmorStand]test
/testfor @e[name=CheckResult,type=ArmorStand,score_test_min=0,score_test=0]
/scoreboard players set@e[name=Bool,type=ArmorStand] test 1
可以通过在特定左边放红石块一次性激活这些指令,也可以手动摆放4个cb激活。而我就是后者,前者因为时序的原因无法正常判断。
这样,【0011;0101;1001;0110;1010;1100】这6种情况就好判断了,将寄存模块中对应的as的2048值赋到Checker1、2中,启动等测模块即可。
然后再检测Bool的值,如果等于1:
//加分
/execute @e[type=ArmorStand,name=yellow] ~2 ~~ scoreboard players operation @e[type=Shulker,r=0] 2048 +=@e[type=ArmorStand,name=a2] 2048
//清除没用Shulker
/execute @e[type=ArmorStand,name=yellow] ~2 ~~ tp @e[type=Shulker,r=0] ~-2 ~ ~
//把已加分的shulker传送到特定的位置
/execute @e[type=ArmorStand,name=yellow] ~4 ~~ kill @e[type=Shulker,r=0]
//清空寄存模块和等测模块,供下一次使用,这里我是把清空指令串到一起,再一键激活
/setblock -1477 56 969minecraft:redstone_block
/setblock -1448 57 1015 minecraft:redstone_block
而对于:【1110;1101;1011;0111】,则先判断后两个是否相等,如果相等,相加移动;如果不是,判断前两个是否相等,如果相等,相加移动,但是这里要注意,检测bool的test=0的ccb之后要用红石块配合icb才可以继续接下去,就像这样:
/testfor@e[type=ArmorStand,name=Bool,score_test=0,score_test_min=0]
/setblock ~-1 ~ ~ minecraft:redstone_block
//这里空一个方块
/setblock ~1 ~ ~ air
应为icb有可能会互相影响。
对于:【1111】的话方法可以从【1110;1101;1011;0111】推导,只是多判断几次,在此不过多论述。
判断相加之后就是新的shulker(数字2)的生成,这里就又要用到映射的概念,在地图中有一个这样的地方:
这就是映射处了,每一行分别对应数字板的边框,还记得之前的占位模块吧,它还有一个作用,对于边框来说,如果边框部位的格子上没有shulker,它不仅仅会在那里生成null,也会在映射处将其对应的地方放上海晶灯,反之则放水。当一个方向的移动合并完成之后,就会在这里生成2个shulker并打散到对应的海晶灯上在对应传送,由于有shulker的边框格子在这里被置换为了水,所以随机生成的shulker不会与原有的在边框上的shulker重合
PS:在此非常感谢我的世界玩家Mine268的分享。
以上就是2048游戏在我的世界实现教程 在游戏中玩游戏。更多精彩尽在游戏园我的世界专区。
相关攻略推荐:
相关下载
相关文章
更多+热门搜索
手游排行榜
- 最新排行
- 最热排行
- 评分最高
-
动作塔防 大小:450.99M
-
其他游戏 大小:30mb
-
模拟经营 大小:40.46M
-
应用软件 大小:25.25MB
-
飞行射击 大小:107.5M