2048游戏在我的世界实现教程 在游戏中玩游戏

时间:2017-05-20 来源:88130安卓下载 作者:佚名

  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游戏在我的世界实现教程 在游戏中玩游戏。更多精彩尽在游戏园我的世界专区。

  相关攻略推荐:

  我的世界2048X超清材质包测试版下载

  籽岷1.10多人欢乐小游戏 熊孩子致青春TNT大作战

  籽岷1.8多人服务器PVP小游戏迷你战墙详解

  我的世界熊孩子PVP游戏用TNT致青春(附存档)

热门搜索

手游排行榜

  • 最新排行
  • 最热排行
  • 评分最高