本帖最后由 MsYqgzt 于 2016-4-16 18:28 编辑

相关链接:【TCP】[1.8多人原版小游戏]顺手牵羊—Sheep Quest        
大家好,今天我来讲解顺手牵羊的游戏运行原理。

目录:
1、计分板系统
2、牵羊系统
3、胜利队伍判定

计分板系统:

    相信看过帖子的同学都想知道,如何原版做出这样的计分板效果

这里引用乙烯大大的教程进行说明:
【乙烯】关于侧边栏的应用小技巧


像这样的倒计时系统不能通过一般的数据指令来改变假名的数据,只有通过枚举的方法实现,于是我的指令系统中出现了这样的结构

图中的所有命令方块全部为计分板系统【其实压缩得也不够充分】。
    举个例子,假设我需要一个循环的3秒倒计时。步骤如下:

  1. /scoreboard objectives add score dummy Timer
复制代码
创建一个名为score,显示名为Timer的自变量计分板

  1. /scoreboard players set Time: score -2
复制代码
创建一个名为Time:的假名,将目标分数设置为-2。

  这样倒计时系统的准备工作就做完成了。


接下来是让计时的数据以计分板目标名字的形式变化,且位置要在Time:的下面,只有将假名分数设置为-3即可,然后进行枚举:



  1. /scoreboard players set 3_Second score -3
复制代码
设置一个假名为3_Second的目标分数设置为-3.

然后中继器设置延迟,同时触发两道指令:
  1. /scoreboard players set 2_Second score -3
复制代码
  1. /scoreboard players reset 3_Second score
复制代码
设置假名2_Second的目标分数为-3,同时移除名为3_Second的Score计分板数据,以此类推,直到


  1. /scoreboard players reset 1_Second score
复制代码
  1. /scoreboard players set 0_Second score -3
复制代码

将1_Second的数据在score计分板移除且将0_Second积分版数据设置为-3,
然后就可以接上其他的效果指令来完成计分板计时效果的衔接,也就是说只要你不怕烦的话,1000秒计时也是可以的,因为假名是没有限制的

然后有人问了,这个游戏里的重复计时怎么办?
如果单靠这个系统进行循环的话,会出现这种情况:




如果出现这种情况也非常的简单,只要在开头加一道指令:
  1. /scoreboard players reset 0_Second score
复制代码
移除0_Second在计分板score的数据。
下一页为牵羊系统

牵羊系统:

在这个游戏中,如何牵羊是这里唯一的难点,难就难在区分自己队伍中的羊不能再跟着你,而其他羊能跟着你,并且你可以选择移动自己的羊。
牵羊系统全部需要超频来实现,系统如下图【也混杂了其他指令】:

牵羊其实就是TP的过程,要实现以上功能,要先通过计分板判定是否符合TP条件。这里以红队【red】为例子,玩家也在红队
  1. /scoreboard objectives add sheep dummy sheep
复制代码

创建一个名为sheep的dummy计分板
  1. /entitydata @e[type=Sheep,x=-661,y=61,z=-749,dx=5,dy=-1,dz=2] {Color:14b}
复制代码

  1. /scoreboard teams join red @e[type=Sheep,x=-661,y=61,z=-749,dx=4,dy=-1,dz=1] {Color:14b}
复制代码
先设置一个羊圈的范围,将进入红队羊圈的其他颜色的羊改变为红色,并且让其加入红队。


接下来是重点,讲解可能很绕口。。:


  1. /execute @a[team=red,m=2] ~ ~ ~ tp @e[r=2,team=!red,type=Sheep] @p[r=2,m=2,team=red]
复制代码
以所有红队玩家为中心的半径2范围内,将队伍不是红队的羊tp至最近的红队玩家【即牵羊的人】
游戏中有这么一个规则:牵羊的玩家会获得减速的效果,这个可以通过加分实现


  1. /execute @e[type=Sheep,team=!red] ~ ~ ~ scoreboard players set @a[r=2,team=red,m=2] sheep 3
复制代码
以不是红队的所有羊为中心半径2的范围内,将所有队伍为红队的玩家的sheep计分板变量设置为3

  1. /effect @a[m=2,score_sheep=3,score_sheep_min=3] minecraft:slowness 1 0 true
复制代码
给予所有sheep变量为3的玩家缓慢的效果



  1. /execute @e[type=Sheep,team=red] ~ ~ ~ scoreboard players set @a[r=2,m=2,team=red] sheep 0
复制代码
以不是红队的所有羊为中心半径2的范围以外,将所有队伍为红队的玩家的sheep计分板变量设置为0
这样就可避免离开羊后一直减速的问题。

同样的难点就是有时候需要移动自己的羊群,却不能移动。于是这里加入了一个道具<赶羊棍>,持有后可以移动自己的羊群。

  1. /scoreboard objectives add team dummy team
复制代码
创建一个名为team的dummy计分板


同样高频,红队为例:
  1. /scoreboard players set @a team 0
复制代码
不断将玩家的team积分设置为0

  1. /scoreboard players set @a team 5 {SelectedItem:{id:"minecraft:stick",tag:{display:{Name:"赶羊棍",Lore:["能引导自己的羊群","<持有后可移动本队颜色的羊>"]},ench:[]}}}
复制代码
将持有赶羊棍的玩家的team积分设置为5.

  1. /execute @a[m=2,team=red,score_team=5,score_team_min=5] ~ ~ ~ tp @e[r=2,team=red,type=Sheep] @p[r=2,team=red,score_team=5,score_team_min=5]
复制代码
以team积分为5的红队玩家为中心半径为2的范围内,将所有红队的羊tp至自己。


牵羊系统至此基本结束
下一页讲解分数判定队伍胜利条件

胜利判定:

队伍的胜利,需要判定队伍拥有羊群最多的队伍,即队伍分数最高的那一队。
所以需要通过计分板的加减法来进行运算,将同一个队伍分别减去其他3个队伍的分数,若全部结果都为正数,即判定这个队伍获胜。所以我做成了这样的一个结构:

每一条代表一个队伍,运算后若为正数,则在对应地方放置一个石头,若全部为正数,则触发后面的一系列效果。

但计分板有个特性,每次运算,计分板的数值会立刻改变,所以我们需要备份计分板数据 , 每次运算过后将备份的数据提取,再次运算,再提取……也是枚举的一部分。



再次以红队为例子。
在运算之前,创建一个备用计分板
  1. /scoreboard objectives add score1 dummy score1
复制代码
创建名为score1的dummy计分板

并且在这个计分板创建一个相同的假名。
  1. /scoreboard players set Red score1 0
复制代码

接下来就是进行计分板赋值操作
重点

  1. /scoreboard players operation Red score1 = Red score
复制代码
使score1的Red计分板数值等于score计分板的Red数值,即数据备份。

然后进行 运算 和 反向赋值 的切换执行。


按顺序执行:
  1. /scoreboard players operation Red score -= Blue score
复制代码
将红队分数减去蓝队分数,

然后同时按顺序触发两道指令:
  1. /scoreboard players test Red score 1 17
复制代码
探测Red计分板数据是否在正数范围内

以及
  1. /scoreboard players operation Red score = Red score1
复制代码
将已改变的变量还原为之前原有的数值。并且进行下一轮触发(即红队减去绿队之类)

若在正数范围内,则比较器触发,放置方块,反之,比较器熄灭,将方块替换为空气。以此类推,最后只会有一条队伍的电路会被触发,提示队伍胜利。


===============End===================
@乙烯_中国 @1jomin1























[groupid=1009]The Command's Power[/groupid]