我的世界分数智能排序算法解析(附存档)

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

  我的世界分数智能排序算法解析(附存档)。那下面给大家分享的则是在我的世界中将分数由高到低的算法解析哦~那到底要怎么算呢?那下面就一起来看看下面大神玩家关于分数智能排序算法的介绍吧!希望对大家有所帮助。

  游戏园我的世界官方群:325049520(已满) 二群:256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!

  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址点我进入

  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~

  今天带来的是一个偏向算法性的作品——分数智能排序算法。也就是解决一堆分数从高到低排序的问题(这里要说一下,计分板上的排序是给玩家能直观看到的,而能被系统读取的顺序则需要输出到另一个计分板,看图

  比如现在有9个玩家玩游戏,分数分别如上所示,虽然系统已经帮我们排好了先后顺序,但这个顺序计分板并不能读取,那就需要排序到另一个计分板:

  就像这样,分数从高到低从第一名排到第九名(可见,也是可以处理重分的),这样的话我需要对比赛分数并列第4名的玩家执行命令只需要

  /execute @e[score_Order_min=4,score_Order=4] ...

  即可)

  其实排序算法也是很常用的,小游戏制作选出最高分的问题也一直会被问到,而把排序拓展到n位之后,应用的范围就更广泛了。

  使用方法

  我的世界分数智能排序算法解析(附存档)。那下面给大家分享的则是在我的世界中将分数由高到低的算法解析哦~那到底要怎么算呢?那下面就一起来看看下面大神玩家关于分数智能排序算法的介绍吧!希望对大家有所帮助。

  游戏园我的世界官方群:325049520(已满) 二群:256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!

  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址点我进入

  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~

  今天带来的是一个偏向算法性的作品——分数智能排序算法。也就是解决一堆分数从高到低排序的问题(这里要说一下,计分板上的排序是给玩家能直观看到的,而能被系统读取的顺序则需要输出到另一个计分板,看图

  比如现在有9个玩家玩游戏,分数分别如上所示,虽然系统已经帮我们排好了先后顺序,但这个顺序计分板并不能读取,那就需要排序到另一个计分板:

  就像这样,分数从高到低从第一名排到第九名(可见,也是可以处理重分的),这样的话我需要对比赛分数并列第4名的玩家执行命令只需要

  /execute @e[score_Order_min=4,score_Order=4] ...

  即可)

  其实排序算法也是很常用的,小游戏制作选出最高分的问题也一直会被问到,而把排序拓展到n位之后,应用的范围就更广泛了。

  使用方法

  进游戏会看到两排按钮,下面6个,上面3个(最左和最右的按钮在侧面),先用按钮选好分(分数自己随意)之后是这样:

  由于没有排过名,所以只有选中的分数,排序(左边第一个按钮)之后就会多出一排分数:

  这个分数就是你刚刚设定的那个分数的历史排名,因为第一次排序所以当然是1(历史最高)

  这时如果你再选个分,就会有两个分数了。

  这是上面的三个命令方块。中间是重置整个系统,左边是查看你曾经选定过的分数,右边是所有分数的总排名

  原理讲解

  总共30多个命令方块,一起来看看。

  算法计分板:

  1.Count (其中的假名Count用于处理同分)

  2.Score (储存需要排序的分数)

  3.Order (将重新排序后的分数计入这个计分板)

  核心命令:

  /scoreboard players operation @e[name=Holder,type=ArmorStand] Score > @e[tag=Compare2,c=1] Score

  有必要强调一下这个命令的用法:

  scoreboard players operation

  ">" 取较大值: 如果selector的分数比 targetName的分数大,则把targetName的分数设为 selector的分数。

  ------Minecraft Wiki

  简而言之 A>B的意思就是:若B>A,则令B=A 我们可以利用这个做出排出一系列分数的第一名,方法就是刷出一个Marker来和所有分数使用一遍“>”运算,这样,全部比对完以后Marker的分数就是探测范围内的最大分数了,然后将Marker的值与所有分数相减,分数为0的那个(些)就是第一名了。你可以这样理解:一次“>”运算是一个点的运动(一组分数的比对),那么将所有点纵向运动起来(将每组分数比对过去)就构成了一条“线”(一次第一名的探测),也就是所谓的“点动成线”

  那么,如何“线动成面”呢?

  我们可以这样做:将第一次选出的第一名剔除在外,然后在剩余的分数中利用之前的方法选出现在的第一名。那第二次选出的第一名就是第二名了,依次类推,直到每个分数都当过一次第一名之后就意味着每个分数都有自己的“位置”(或者说顺序)了。

  当然,“点动成线,线动成面”意味着我们需要有一个两层的控制系统,告诉电脑接下来该怎么排序。

  主要的思路就是上面这些,我们看看在游戏中的对应关系。

  最开始只执行一次的部分:

  icb:/blockdata ~ ~ ~ {auto:0b}

  /scoreboard players tag @e[type=ArmorStand,name=Test] add Compare1

  /blockdata ~-1 ~ ~ {auto:1b}

  然后就是一层控制(探测是否所有的分数都进行过排序,tag=Compare1就是还没有排序后分数的分数)

  /blockdata ~ ~ ~ {auto:0b}

  /blockdata ~-4 ~ ~ {auto:1b}

  /testfor @e[type=ArmorStand,tag=Compare1]

  cond:/blockdata ~-2 ~ ~ {auto:0b}

  cond:/blockdata ~-2 ~ ~ {auto:1b}

  /blockdata ~-24 ~ ~ {auto:1b}

  如果没有全部都经过排序,就执行下一层,即“第一名”的选择

  这些是在二层中只执行一次的:

  /blockdata ~ ~ ~ {auto:0b}

  /summon ArmorStand ~ ~ ~ {Marker:1b,CustomName:Holder,NoGravity:1b,Invisible:1b}

  /scoreboard players tag @e[type=ArmorStand,name=Test,tag=Compare1] add Compare2

  /blockdata ~-1 ~ ~ {auto:1b}

  下面是二层控制(探测此轮“第一名”是否已经探测完成,即Marker是否对每个待选分数进行过“>”运算,tag=Compare2指的是未运算过的分数):

  /blockdata ~-4 ~ ~ {auto:1b}

  /testfor @e[type=ArmorStand,tag=Compare2]

  cond:/blockdata ~-2 ~ ~ {auto:0b}

  cond:/blockdata ~-11 ~ ~ {auto:1b}

  如果2级运算也没有完成,系统会执行以下命令:

  /blockdata ~ ~ ~ {auto:0b}

  /scoreboard players operation @e[name=Holder,type=ArmorStand] Score > @e[tag=Compare2,c=1] Score

  /scoreboard players tag @e[tag=Compare2,c=1] remove Compare2

  /blockdata ~18 ~ ~ {auto:1b}

  如果完成了,就执行这些(顺序对号入座,当然,理所当然的,加了重分的处理):

  /blockdata ~ ~ ~ {auto:0b}

  /scoreboard players operation @e[type=ArmorStand,name=Test] Score -= @e[type=ArmorStand,name=Holder] Score

  /scoreboard players add Count Count 1

  /scoreboard players operation @e[type=ArmorStand,name=Test,score_Score_min=0,score_Score=0] Order = Count Count

  /scoreboard players tag @e[type=ArmorStand,name=Test,score_Score_min=0,score_Score=0] remove Compare1

  /execute @e[type=ArmorStand,name=Test,score_Score_min=0,score_Score=0] ~ ~ ~ /scoreboard players add Count Count 1

  /scoreboard players remove Count Count 1

  /scoreboard players operation @e[type=ArmorStand,name=Test] Score += @e[type=ArmorStand,name=Holder] Score

  /kill @e[type=ArmorStand,name=Holder]

  /blockdata ~24 ~ ~ {auto:1b}

  现在,让我们回到一级控制处,如果第一层探测不到未排序的分数,那么就算大工告成,每个分数都有自己对应的顺序了,收尾即可:

  /blockdata ~ ~ ~ {auto:0b}

  /scoreboard players reset Count Count

  say ok

  至此,分数排序全部完成。

  链接:

  密码:nftu

  PS:在此非常感谢我的世界玩家乾.坤的分享。

  以上就是我的世界分数智能排序算法解析(附存档)。更多精彩尽在游戏园我的世界专区。

  相关攻略推荐:

  我的世界曲线算法研究 怎么在MC中造曲线

  我的世界大神植物生长算法研究

  我的世界伪随机算法原理解析(附存档)

  随机路线怎么做 我的世界1.9随机路线的算法解析

热门搜索

手游排行榜

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