本帖最后由 银龙斩月 于 2019-3-21 04:20 编辑
想做个地图,一个类似于魔塔的rpg地图
战斗方式和游戏本身的战斗系统没有关系
而是基于一个变量
比如我想给玩家赋值攻防体,然后让玩家触碰到由方块组成的怪物身上的按钮,按钮触动怪物里的命令方块,触发远处由命令方块组成的计算系统
怪物也是有攻防体的三项数值,但是这三项数值该怎么去记,记完之后又该怎么去算
我定义的公式很简单,是回合制,
首先是玩家攻减怪物防得到变量A(怪物所收到的一次性伤害)
然后是怪物攻减玩家防得到变量B(玩家所受到的一次性伤害)
然后是怪物血除以变量A得变量C(回合数)
最后是玩家血减回合数乘以变量B的结果直接返回玩家后的剩余体力(目前我已经知道怎么给玩家自己增加计分项目)
但是我不知道怎么去计算
而且怎么记录怪物的积分项也是个问题,虽然我知道给盔甲架等实体的命名方式
但是实体上限的事情要怎么解决,而且实体过多是否会卡顿,又要怎么解决实体可能自己消失的问题(我遇到过被命名的溺尸在没开启和平模式连续消失两次的情况。)
我也想过先记录在某木板或什么奇怪的东西上,然后通过某命令去读取,但我wiki翻了好久都没翻到个能用到的命令
总之
预计怪物数量是240个最多
每次战斗需要用到的变量有
怪物攻击、怪物防御、怪物体力、和上述公式的ABC变量
而且玩家攻防体我想以包裹中红石、青金石的方法去计算,也就是说最好还要有个准确检测包裹中物品的命令
0-0全部的金粒都在这了,坐等神仙来解答
下图是关于战斗公式的三套计算方案,用于验证此公式的可行性,因为计算这种事不能让别人一边开着计算器一边在游戏里玩吧,影响体验。
想做个地图,一个类似于魔塔的rpg地图
战斗方式和游戏本身的战斗系统没有关系
而是基于一个变量
比如我想给玩家赋值攻防体,然后让玩家触碰到由方块组成的怪物身上的按钮,按钮触动怪物里的命令方块,触发远处由命令方块组成的计算系统
怪物也是有攻防体的三项数值,但是这三项数值该怎么去记,记完之后又该怎么去算
我定义的公式很简单,是回合制,
首先是玩家攻减怪物防得到变量A(怪物所收到的一次性伤害)
然后是怪物攻减玩家防得到变量B(玩家所受到的一次性伤害)
然后是怪物血除以变量A得变量C(回合数)
最后是玩家血减回合数乘以变量B的结果直接返回玩家后的剩余体力(目前我已经知道怎么给玩家自己增加计分项目)
但是我不知道怎么去计算
而且怎么记录怪物的积分项也是个问题,虽然我知道给盔甲架等实体的命名方式
但是实体上限的事情要怎么解决,而且实体过多是否会卡顿,又要怎么解决实体可能自己消失的问题(我遇到过被命名的溺尸在没开启和平模式连续消失两次的情况。)
我也想过先记录在某木板或什么奇怪的东西上,然后通过某命令去读取,但我wiki翻了好久都没翻到个能用到的命令
总之
预计怪物数量是240个最多
每次战斗需要用到的变量有
怪物攻击、怪物防御、怪物体力、和上述公式的ABC变量
而且玩家攻防体我想以包裹中红石、青金石的方法去计算,也就是说最好还要有个准确检测包裹中物品的命令
0-0全部的金粒都在这了,坐等神仙来解答
下图是关于战斗公式的三套计算方案,用于验证此公式的可行性,因为计算这种事不能让别人一边开着计算器一边在游戏里玩吧,影响体验。
本帖最后由 CHElover_C60 于 2019-3-21 07:17 编辑
java版可以做到
可以借助计分板,将怪物的攻防血都记录在里面,然后利用计分板进行计算。
红石和青金石的数量判断可以使用stats配合clear 0(1.12及之前)或者execute store配合clear 0(1.13)来记录。
具体命令可能需要你给出具体版本后我才能写出来
我看到溺尸了,正在试写
java版可以做到
可以借助计分板,将怪物的攻防血都记录在里面,然后利用计分板进行计算。
红石和青金石的数量判断可以使用stats配合clear 0(1.12及之前)或者execute store配合clear 0(1.13)来记录。
我看到溺尸了,正在试写
CHElover_C60 发表于 2019-3-21 07:13
java版可以做到
可以借助计分板,将怪物的攻防血都记录在里面,然后利用计分板进行计算。
红石和青金石的数 ...
嗯对就是1.13.2的java版本
本帖最后由 CHElover_C60 于 2019-3-23 11:18 编辑
复制代码
设置3个计分板,用于保存玩家与怪物的三个属性。同时health也可以保存玩家的血量。
设置多个盔甲架,用于保存怪物的属性值,并添加对应的标签。示例:
设置一个盔甲架,添加标签fighting,用于获取正在战斗的怪物的属性
然后按顺序执行以下命令(已添加注释,考虑文本较长,已折叠)
对涉及到的一些命令语法做出一些解释
除了第一个命令方块以外,其他的命令方块均使用连锁需要条件保持激活,并确保每一个命令方块都指向下一个命令方块。
已知此系统的一个bug,当怪物的生命值能够被数值A整除时,怪物会在实际上多攻击一回合。比如怪物血量是50,玩家每回合能够对怪物造成10伤害,那么怪物应该只能攻击4回合,但实际上怪物攻击了5回合。解决此问题的方法是将怪物的health分数设定为设定值减1的值,比如此处可以设定怪物的health为49
- /scoreboard objectives add attack dummy
- /scoreboard objectives add defense dummy
- /scoreboard objectives add health dummy
设置3个计分板,用于保存玩家与怪物的三个属性。同时health也可以保存玩家的血量。
设置多个盔甲架,用于保存怪物的属性值,并添加对应的标签。示例:
设置一个盔甲架,添加标签fighting,用于获取正在战斗的怪物的属性
然后按顺序执行以下命令(已添加注释,考虑文本较长,已折叠)
对涉及到的一些命令语法做出一些解释
除了第一个命令方块以外,其他的命令方块均使用连锁需要条件保持激活,并确保每一个命令方块都指向下一个命令方块。
已知此系统的一个bug,当怪物的生命值能够被数值A整除时,怪物会在实际上多攻击一回合。比如怪物血量是50,玩家每回合能够对怪物造成10伤害,那么怪物应该只能攻击4回合,但实际上怪物攻击了5回合。解决此问题的方法是将怪物的health分数设定为设定值减1的值,比如此处可以设定怪物的health为49
本帖最后由 银龙斩月 于 2019-3-21 10:37 编辑
啊谢谢QWQ晚上试试w不过我最初的构想中是不用到实体,本来就是用方块搭成怪物
比如这样就是蝙蝠(虽然这个蝙蝠看起来非常奇怪但是和魔塔中的蝙蝠非常接近)













然后命令方块藏在地下或者什么看不见的地方,然后用一个按钮或者压力坂或者绊线钩触发命令方块指向连锁计算的地点
也就是说我该怎么让负责计算的那坨


知道这个怪物是什么数据…还是说为每个怪物都设立不同的变量?那可能需要预设接近七百个变量…
CHElover_C60 发表于 2019-3-21 08:46
设置3个计分板,用于保存玩家与怪物的三个属性。同时health也可以保存玩家的血量
战斗时,给正在战斗的怪 ...
啊谢谢QWQ晚上试试w不过我最初的构想中是不用到实体,本来就是用方块搭成怪物
比如这样就是蝙蝠(虽然这个蝙蝠看起来非常奇怪但是和魔塔中的蝙蝠非常接近)

然后命令方块藏在地下或者什么看不见的地方,然后用一个按钮或者压力坂或者绊线钩触发命令方块指向连锁计算的地点
也就是说我该怎么让负责计算的那坨



知道这个怪物是什么数据…还是说为每个怪物都设立不同的变量?那可能需要预设接近七百个变量…银龙斩月 发表于 2019-3-21 10:29
啊谢谢QWQ晚上试试w不过我最初的构想中是不用到实体,本来就是用方块搭成怪物
比如这样就是蝙蝠(虽然这个 ...
我觉得可以在触发战斗时,先生成一个实体,然后为这个实体添加分数,再进行计算。
如果你会做数据包,这个用函数会很方便
CHElover_C60 发表于 2019-3-21 10:49
我觉得可以在触发战斗时,先生成一个实体,然后为这个实体添加分数,再进行计算。
如果你会做数据包,这 ...
xwx对于命令我只会一些基本的。。比如give和kill
生成实体后如何给这个实体添加分数?
如果所有怪物的数值都可以用这个rbq来计算那倒是方便很多,但是这个分数肯定不能现场给,得是先放在什么地方让命令方块去读取的…
本帖最后由 CHElover_C60 于 2019-3-21 11:27 编辑
然而我的想法就是现场给
添加分数的语法是复制代码比如/scoreboard players set @e[tag=fighting] attack 10 将怪物的attack分数设置为10
或者在别的地方设置一个盔甲架,事先编辑好分数,在战斗时使用scoreboard players option 的赋值功能,直接带入数据。赋值的符号是“=”,语法我已经在前面介绍了
另外建议了解一下数据包,如果感觉太复杂,可以只看数据包结构和函数部分,可以很好解决大量重复性的命令。
做好函数以后可以直接在游戏中使用/funtion <函数名> 来运行函数,这样会方便很多
私信吧,不要被当成版聊了
银龙斩月 发表于 2019-3-21 10:53
xwx对于命令我只会一些基本的。。比如give和kill
生成实体后如何给这个实体添加分数?
然而我的想法就是现场给
添加分数的语法是
- /scoreboard players set <实体> <计分板id> <分数>
或者在别的地方设置一个盔甲架,事先编辑好分数,在战斗时使用scoreboard players option 的赋值功能,直接带入数据。赋值的符号是“=”,语法我已经在前面介绍了
另外建议了解一下数据包,如果感觉太复杂,可以只看数据包结构和函数部分,可以很好解决大量重复性的命令。
做好函数以后可以直接在游戏中使用/funtion <函数名> 来运行函数,这样会方便很多
私信吧,不要被当成版聊了
CHElover_C60 发表于 2019-3-21 11:17
然而我的想法就是现场给
添加分数的语法是比如/scoreboard players set @e[tag=fighting] atta ...
所以我在想盔甲架的实体上限和会不会过多造成卡顿的问题……我去看看数据包是啥_(:з」∠)_
本帖最后由 银龙斩月 于 2019-3-23 03:24 编辑
这就麻烦了- -为什么有上限的
CHElover_C60 发表于 2019-3-21 11:17
然而我的想法就是现场给
添加分数的语法是比如/scoreboard players set @e[tag=fighting] atta ...
本帖最后由 银龙斩月 于 2019-3-21 12:01 编辑
楼上截图,我没法发私聊了
然后我这个用户组还没有加好友权限_(:з」∠)_
我还是等晚上自己去试试吧。编辑的话你应该是没法看见消息提醒
CHElover_C60 发表于 2019-3-21 11:17
然而我的想法就是现场给
添加分数的语法是比如/scoreboard players set @e[tag=fighting] attac ...
楼上截图,我没法发私聊了
我还是等晚上自己去试试吧。编辑的话你应该是没法看见消息提醒
本帖最后由 银龙斩月 于 2019-3-22 04:35 编辑
ok..摸到电脑了
创造计分板变量最后那个dummy是什么,我在百度上查的结果是仿制品…
然后
那个ex什么什么什么的最后为什么有个0,这个0是什么?
----
私聊中的这个命令出现了错误
我尝试着以能够被读取的格式重写了一遍命令,得到的结果是没找到实体
当我删除tag=!后命令正常
----
至于这个多攻击一回合的bug……
你可能没玩过魔塔,之所以用青金石和红石表示攻防就是因为过程中需要获得红宝石蓝宝石增强攻防,过程中还有商店……解决了怪物生命值的问题但是玩家会选择如何加攻防是个问题
所以还有必要判断下结果是否能够整除【】
----
然后,攻防体以下全部以A/D/H代替,玩家和怪物则是P和M
计分板的规律我大概是看懂了点,那么是不是需要六个计分板,分别是P的ADH和战斗时变量的ABC,如果战斗时不能直接应用盔甲架数据的话就得是九个…
我感觉今晚我提的问题能让你看好半天了xwx
以及计分板里记录的东西该怎么查看,因为我需要在过程中不断的调试,排除错误,但是有些命令的执行过程并不会给予任何的返回,或是说找到了x个物品,但是没有说是否计入变量..
先这样吧,等你回答,没法看见输出结果的话就没法测试了
CHElover_C60 发表于 2019-3-21 08:46
设置3个计分板,用于保存玩家与怪物的三个属性。同时health也可以保存玩家的血量
战斗时,给正在战斗的怪 ...
ok..摸到电脑了
创造计分板变量最后那个dummy是什么,我在百度上查的结果是仿制品…
然后
那个ex什么什么什么的最后为什么有个0,这个0是什么?
----
私聊中的这个命令出现了错误
我尝试着以能够被读取的格式重写了一遍命令,得到的结果是没找到实体
当我删除tag=!后命令正常
----
至于这个多攻击一回合的bug……
你可能没玩过魔塔,之所以用青金石和红石表示攻防就是因为过程中需要获得红宝石蓝宝石增强攻防,过程中还有商店……解决了怪物生命值的问题但是玩家会选择如何加攻防是个问题
所以还有必要判断下结果是否能够整除【】
----
然后,攻防体以下全部以A/D/H代替,玩家和怪物则是P和M
计分板的规律我大概是看懂了点,那么是不是需要六个计分板,分别是P的ADH和战斗时变量的ABC,如果战斗时不能直接应用盔甲架数据的话就得是九个…
我感觉今晚我提的问题能让你看好半天了xwx
以及计分板里记录的东西该怎么查看,因为我需要在过程中不断的调试,排除错误,但是有些命令的执行过程并不会给予任何的返回,或是说找到了x个物品,但是没有说是否计入变量..
先这样吧,等你回答,没法看见输出结果的话就没法测试了
本帖最后由 CHElover_C60 于 2019-3-22 07:38 编辑
我玩过魔塔,知道战斗机制
dummy表示虚拟型变量,不会被任何因素影响,只能被命令修改
tag的格式有问题是我的失误,抱歉
至于你说的那个0的问题,那个0是在clear的语法中的,/clear [玩家] [物品] [最大数量],当数量为0时可以检测玩家的物品数量
那个tag=!的参数表示的是选择没有任何标签的实体,找不到实体的原因可能是因为场上已经没有无任何标签的实体了
不需要很多计分板,3个足够了。可以借助一个盔甲架,用作战斗的判定,战斗时直接把怪物的攻防血赋值给它,然后用这个计分板进行计算。由于计算结果会覆盖原本的分数,因此你说的变量ABC都会保存在这个指定的盔甲架上,详情看我之前的回答
今天下午空闲比较多,我亲自去试试
银龙斩月 发表于 2019-3-22 02:37
ok..摸到电脑了
创造计分板变量最后那个dummy是什么,我在百度上查的结果是仿制品…
我玩过魔塔,知道战斗机制
dummy表示虚拟型变量,不会被任何因素影响,只能被命令修改
tag的格式有问题是我的失误,抱歉
至于你说的那个0的问题,那个0是在clear的语法中的,/clear [玩家] [物品] [最大数量],当数量为0时可以检测玩家的物品数量
那个tag=!的参数表示的是选择没有任何标签的实体,找不到实体的原因可能是因为场上已经没有无任何标签的实体了
不需要很多计分板,3个足够了。可以借助一个盔甲架,用作战斗的判定,战斗时直接把怪物的攻防血赋值给它,然后用这个计分板进行计算。由于计算结果会覆盖原本的分数,因此你说的变量ABC都会保存在这个指定的盔甲架上,详情看我之前的回答
今天下午空闲比较多,我亲自去试试
本帖最后由 银龙斩月 于 2019-3-22 08:15 编辑
嗯…那我要怎么查看已经施加到盔甲架上的变量?不能查看到这些数值我就感觉容易出错…
CHElover_C60 发表于 2019-3-22 07:22
我玩过魔塔,知道战斗机制
dummy表示虚拟型变量,不会被任何因素影响,只能被命令修改
tag的格式有问题是 ...
嗯…那我要怎么查看已经施加到盔甲架上的变量?不能查看到这些数值我就感觉容易出错…
本帖最后由 CHElover_C60 于 2019-3-22 12:11 编辑
抱歉漏掉了
/scoreboard players list [实体] 获取实体的所有分数
/scoreboard players get <实体> <计分项> 获取实体的在某个计分项(计分板id)上的分数
抱歉私信里的tag参数使用失误,不应该是tag=!,这表示拥有任意标签的实体。没有任何标签的表示方法应该是tag= 后面什么都不加
复制代码
想了想其实没必要当场生成盔甲架,事先生成然后加上fighting标签就可以了,战斗时把数据搬过去即可。示例
复制代码
然后配合之前的命令即可做好这整个系统
已经测试完毕,无误
银龙斩月 发表于 2019-3-22 08:08
嗯…那我要怎么查看已经施加到盔甲架上的变量?不能查看到这些数值我就感觉容易出错… ...
抱歉漏掉了
/scoreboard players list [实体] 获取实体的所有分数
/scoreboard players get <实体> <计分项> 获取实体的在某个计分项(计分板id)上的分数
抱歉私信里的tag参数使用失误,不应该是tag=!,这表示拥有任意标签的实体。没有任何标签的表示方法应该是tag= 后面什么都不加
- /tag @e[type=armor_stand,limit=1,tag=] add bianfu
想了想其实没必要当场生成盔甲架,事先生成然后加上fighting标签就可以了,战斗时把数据搬过去即可。示例
- /scoreboard players operation @e[tag=fighting] attack = @e[tag=bianfu] attack
- /scoreboard players operation @e[tag=fighting] defense = @e[tag=bianfu] defense
- /scoreboard players operation @e[tag=fighting] health = @e[tag=bianfu] health
然后配合之前的命令即可做好这整个系统
已经测试完毕,无误
本帖最后由 银龙斩月 于 2019-3-23 06:39 编辑
新问题…
输入/scoreboard players list @s[type=!minecraft:armor_stand,tag=bianfu]的时候提示未找到实体,@e[tag=bianfu]的时候提示目标选择器允许提供多个实体
这个问题自行解决了,list后面只要不加任何东西就行…
但以后设立了几百个盔甲架后该怎么准确查找?自行解决,加入limit后就行了=-=
我希望这个limit的定位真的很准,而不会因为附近有多个盔甲架会导致定位出错的情况
CHElover_C60 发表于 2019-3-22 08:57
抱歉漏掉了
/scoreboard players list [实体] 获取实体的所有分数
/scoreboard players get 获取实体 ...
输入/scoreboard players list @s[type=!minecraft:armor_stand,tag=bianfu]的时候提示未找到实体,@e[tag=bianfu]的时候提示目标选择器允许提供多个实体
我希望这个limit的定位真的很准,而不会因为附近有多个盔甲架会导致定位出错的情况
本帖最后由 银龙斩月 于 2019-3-23 09:02 编辑
而我在给另一个盔甲架设记分项的时候得到这么一串奇怪的东西
eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19
而我输入/scoreboard players list eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19 的时候可以正常获取到盔甲架的记分项
所以这么一串的东西有什么更好的获取方式么,还是说只能在加入记分项的时候才能获取到
没注意到点到的是回复而不是编辑_(:з」∠)_感觉这样下去早晚被当版聊
然后…
如上图所示的6900b7d-5a3b-4001-91c0-e71b4cca4e9a
这个实体名字是我通过命令得到的,但是在试图获取其分数的时候显示没有任何的记分项,但是我此前明明给标签为bianfu的盔甲架设立了三个记分项,于是我在怀疑6900b7d-5a3b-4001-91c0-e71b4cca4e9a所指的到底是不是标签为bianfu的盔甲架
然后
/kill 6900b7d-5a3b-4001-91c0-e71b4cca4e9a
已清除 bianfu
草。
然后…
/execute if score EnderDragon A > @e[tag=fighting,limit=1] defense run scoreboard players operation EnderDragon attack -= @e[tag=fighting] defense
用limit定位真的好么…我感觉用上面那个字符串进行精确定位比较好
而且得到的变量A为什么是保存在玩家的attack中…
我对这段指令稍作修改后发现是错误的命令
@p我给改成了自己的ID,即EnderDragon,attack是A,Defense是D,此外没有修改
然后我把命令的run后面的东西单独作为一个命令
于是我自己的攻击力就从8变成了5
哇这蝙蝠好牛X,能减玩家攻击力也许可以在战斗结束后重新定义一下攻击力
所以这个命令理论上没有错但是放到run后面就不太行好像我知道问题出在什么地方了…你在4楼的代码中 @e[tag=fighting]里并没有加入limiti,导致被认为是选择器的错误(只能选定一个但是允许选择多个)
加入limiti后这段代码可以正常执行---
目前基本可以正常的完成一套战斗测试了,你把下面的内容复制到2或者4楼,然后我就给你设为最佳(因为我不应该选择一个有误或不完整的答案)
虽然你的答案有些许失误,但没有你的话这个问题我不可能解决,甚至不会有丝毫进展
后续有什么问题我大概会私信和你说,我现在已经四级了,应该有更多的私信上限复制代码
另外我想去除一个多余的带有记分项的奇怪的东西就是Enderdragon
因为手滑把D打成了小写,并且还造成了命令和公式都没有错误的情况下
已将Enderdragon的记分项设为-1
已将Enderdragon的记分项设为-2
已将Enderdragon的记分项设为-3
已将Enderdragon的记分项设为-4
……然后
/scoreboard players remove Enderdragon被视为未知的命令
我无法删掉这个多出来的东西
然后回到魔塔相关的计算,就是你前面提到的bug
这个我一直都没想到有效的解决方案,设为生命值-1的话我也说过了,有时候会因为玩家不同的加点方式导致不生效
然后在测试中我发现Minecraft内部的计算不会算入小数...
也就是说要在计算结果中判断玩家造成的伤害
所以纠结小数干嘛,根本不需要用到小数,只要判断玩家的总伤害是否大于怪物的生命值就行了,如果大于,那不管,反之,变量C-1,或者在计算怪物伤害的时候减少回合数1
你看我1楼的图片
备注那一栏
我最初最初的公式里是
血-伤×回合-1=余
因为我想出这个计算的时候没有考虑到魔塔游戏里的计算方式
所以我认为这个公式是错误的
但事实上我把正确的公式给改错了,要应用在mc里,那这个-1就必须要有,而且要加入判断。
然后我要说一个真真正正的bug...
/scoreboard players list
这后面必须输入那一串字符串的实体名称,输入目标选择器没有用,游戏内部会把目标选择器的指令认为是实体名称
比如
无法找到名为@e[tag=bianfu,milit=1]的实体
然后,在一个已经开始的战斗中怪物是否能对玩家造成伤害根本不重要,要么计算结果完全是0,要么就是大于0,这不影响到其他改变,所以我打算在这里加入一个玩家总伤害是否大于怪物生命值的计算,基于你的指令上修改,应该能成功
其实我感觉已经可以按照几年前的首个计划来执行,完成模拟魔塔自身的战斗系统……这样的话根本就不会有这个bug
干脆建立两个战斗系统吧,这个我应该可以自己写
银龙斩月 发表于 2019-3-23 05:19
新问题…
输入/scoreboard players list @s[type=!minecraft:armor_stand,tag=bianfu]的时候提示未找到实 ...
而我在给另一个盔甲架设记分项的时候得到这么一串奇怪的东西
eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19
而我输入/scoreboard players list eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19 的时候可以正常获取到盔甲架的记分项
所以这么一串的东西有什么更好的获取方式么,还是说只能在加入记分项的时候才能获取到
没注意到点到的是回复而不是编辑_(:з」∠)_感觉这样下去早晚被当版聊
然后…
如上图所示的6900b7d-5a3b-4001-91c0-e71b4cca4e9a
这个实体名字是我通过命令得到的,但是在试图获取其分数的时候显示没有任何的记分项,但是我此前明明给标签为bianfu的盔甲架设立了三个记分项,于是我在怀疑6900b7d-5a3b-4001-91c0-e71b4cca4e9a所指的到底是不是标签为bianfu的盔甲架
然后
/kill 6900b7d-5a3b-4001-91c0-e71b4cca4e9a
已清除 bianfu
草。
然后…
/execute if score EnderDragon A > @e[tag=fighting,limit=1] defense run scoreboard players operation EnderDragon attack -= @e[tag=fighting] defense
用limit定位真的好么…我感觉用上面那个字符串进行精确定位比较好
而且得到的变量A为什么是保存在玩家的attack中…
我对这段指令稍作修改后发现是错误的命令
@p我给改成了自己的ID,即EnderDragon,attack是A,Defense是D,此外没有修改
然后我把命令的run后面的东西单独作为一个命令
于是我自己的攻击力就从8变成了5
加入limiti后这段代码可以正常执行---
目前基本可以正常的完成一套战斗测试了,你把下面的内容复制到2或者4楼,然后我就给你设为最佳(因为我不应该选择一个有误或不完整的答案)
虽然你的答案有些许失误,但没有你的话这个问题我不可能解决,甚至不会有丝毫进展
后续有什么问题我大概会私信和你说,我现在已经四级了,应该有更多的私信上限
- /scoreboard objectives add A dummy
- 增加记分项-A(攻击)
- /scoreboard objectives add D dummy
- 增加记分项-D(防御)
- /scoreboard objectives add H dummy
- 增加记分项-H(体力)
- /execute store result score EnderDragon A run clear EnderDragon redstone 0
- 根据玩家手持红石的数量决定攻击力
- /execute store result score EnderDragon D run clear EnderDragon lapis_lazuli 0
- 根据玩家手持青金石的数量决定防御力
- /execute store result score EnderDragon H run clear EnderDragon apple 0
- 根据玩家手持的苹果数量决定生命值
- /tag @e[type=armor_stand,limit=1,tag=] add bianfu
- 为目标盔甲架新增标签
- /scoreboard players list 20f0d218-a83d-407a-aaa3-3bd4b163b674
- 查看记分项
- /scoreboard players set @e[tag=fighting,limit=1] A 10
- 为目标实体设立A计分板中的记分项
- /scoreboard players operation @e[tag=fighting,limit=1] A = @e[tag=bianfu,limit=1] A
- 将一个盔甲架的记分项转移到另一个盔甲架上
- /execute if score EnderDragon A > @e[tag=fighting,limit=1] D run scoreboard players operation EnderDragon A -= @e[tag=fighting,limit=1] D
- 判断,如果玩家攻击力大于怪物防御力则获取玩家每回合造成的伤害,返回的变量A保存在玩家的攻击力中
- /scoreboard players operation @e[tag=fighting,limit=1] A -= EnderDragon D
- 获取怪物每回合对玩家造成的伤害
- /scoreboard players operation @e[tag=fighting,limit=1] H /= EnderDragon A
- 用怪物的血除以玩家每回合的伤害得到回合数
- /execute if score @e[tag=fighting,limit=1] A matches 1.. run scoreboard players operation @e[tag=fighting] H *= @e[tag=fighting,limit=1] A
- 如果怪物的攻击力大于玩家的防御力,计算怪物的总伤害
- /scoreboard players operation EnderDragon H -= @e[tag=fighting,limit=1] H
- 玩家掉血,战斗结束
- /execute store result score EnderDragon A run clear EnderDragon redstone 0
- 重新检测红石数量修正玩家攻击力
另外我想去除一个多余的带有记分项的奇怪的东西就是Enderdragon
因为手滑把D打成了小写,并且还造成了命令和公式都没有错误的情况下
已将Enderdragon的记分项设为-1
已将Enderdragon的记分项设为-2
已将Enderdragon的记分项设为-3
已将Enderdragon的记分项设为-4
……然后
/scoreboard players remove Enderdragon被视为未知的命令
我无法删掉这个多出来的东西
这个我一直都没想到有效的解决方案,设为生命值-1的话我也说过了,有时候会因为玩家不同的加点方式导致不生效
然后在测试中我发现Minecraft内部的计算不会算入小数...
也就是说要在计算结果中判断玩家造成的伤害
所以纠结小数干嘛,根本不需要用到小数,只要判断玩家的总伤害是否大于怪物的生命值就行了,如果大于,那不管,反之,变量C-1,或者在计算怪物伤害的时候减少回合数1
你看我1楼的图片
备注那一栏
我最初最初的公式里是
血-伤×回合-1=余
因为我想出这个计算的时候没有考虑到魔塔游戏里的计算方式
所以我认为这个公式是错误的
但事实上我把正确的公式给改错了,要应用在mc里,那这个-1就必须要有,而且要加入判断。
然后我要说一个真真正正的bug...
/scoreboard players list
这后面必须输入那一串字符串的实体名称,输入目标选择器没有用,游戏内部会把目标选择器的指令认为是实体名称
比如
无法找到名为@e[tag=bianfu,milit=1]的实体
然后,在一个已经开始的战斗中怪物是否能对玩家造成伤害根本不重要,要么计算结果完全是0,要么就是大于0,这不影响到其他改变,所以我打算在这里加入一个玩家总伤害是否大于怪物生命值的计算,基于你的指令上修改,应该能成功
其实我感觉已经可以按照几年前的首个计划来执行,完成模拟魔塔自身的战斗系统……这样的话根本就不会有这个bug
干脆建立两个战斗系统吧,这个我应该可以自己写
本帖最后由 CHElover_C60 于 2019-3-23 11:41 编辑
完善了一下4楼内容,修改了错误。回答一些你的疑问
关于你说的那一串奇怪的东西
这是这个盔甲架的UUID,可以使用复制代码然后将鼠标放到显示的实体名字上看到
关于limit=1,只要你能确保只有这一个盔甲架拥有bianfu标签,你添加limit=1和tag=bianfu就能够确保选择的一定是这个盔甲架
没有必要在战斗后重新设置攻击力,因为在战斗前已经有过设置攻防的命令了。并且玩家在游戏中可能会捡到红石、青金石等物品,因此战斗前必须获取玩家的攻防,因此战斗以后就没有必要重新获取攻击力
重置分数使用的是reset,remove表示的意思是减小分数。你想要的命令应该是复制代码
可以使用目标选择器,可能是你的命令写错了吧
银龙斩月 发表于 2019-3-23 05:23
而我在给另一个盔甲架设记分项的时候得到这么一串奇怪的东西
eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19
而我输 ...
完善了一下4楼内容,修改了错误。回答一些你的疑问
关于你说的那一串奇怪的东西
eb3c8f02-dfa8-41ad-8ab2-8ba32da7e19
这是这个盔甲架的UUID,可以使用
- /say @e[tag=bianfu]
关于limit=1,只要你能确保只有这一个盔甲架拥有bianfu标签,你添加limit=1和tag=bianfu就能够确保选择的一定是这个盔甲架
没有必要在战斗后重新设置攻击力,因为在战斗前已经有过设置攻防的命令了。并且玩家在游戏中可能会捡到红石、青金石等物品,因此战斗前必须获取玩家的攻防,因此战斗以后就没有必要重新获取攻击力
/scoreboard players remove Enderdragon
重置分数使用的是reset,remove表示的意思是减小分数。你想要的命令应该是
- /scoreboard players reset Enderdragon
/scoreboard players list [实体]
CHElover_C60 发表于 2019-3-23 11:37
完善了一下4楼内容,修改了错误。回答一些你的疑问
关于你说的那一串奇怪的东西
这是这个盔甲架的UUID,可 ...
不行啊……say是把反馈的数据以文本形式发送吧,复制这条指令进去就变成了我自己说出盔甲架这三个字,然后就没有然后了…
本帖最后由 CHElover_C60 于 2019-3-23 12:08 编辑
把鼠标放到显示的盔甲架文本上,显示的文本最下面一行就是UUID
银龙斩月 发表于 2019-3-23 11:50
不行啊……say是把反馈的数据以文本形式发送吧,复制这条指令进去就变成了我自己说出盔甲架这三个字,然 ...
把鼠标放到显示的盔甲架文本上,显示的文本最下面一行就是UUID
本帖最后由 银龙斩月 于 2019-3-23 13:45 编辑
哦原来是F3的那个x
知道了
顺便新的问题…
首先既然你玩过魔塔,那应该知道布局,假设1楼3个蝙蝠,2楼5个蝙蝠,3楼9个蝙蝠
我不可能为每个蝙蝠都弄个盔甲架,肯定是在远处某个位置放一堆怪物图鉴
所以我该怎么…
所以我该怎么说。
我该怎么让负责计算的那一块区域明白我在和什么怪物作战
因为在计算完成后还必须返回一个指令让指定位置处的命令方块触发fill清空组成怪物的方块,而且我需要用第四个计分板记录怪物的血量,以便该变量被覆盖掉后能够计算该数值会不会被玩家伤害整除(是否等于总伤害)
因为比较的时候只能用以得出的变量而不能用公式
我反复的算了一下
真的必须要用到第四个计分板
首先,在获取到总伤害变量之前,只能用怪物血是否能被玩家伤害整除,但exe什么什么的指令只能比较不能计算那么另一个算法就是算玩家总伤害是否等于怪物体力
而在这之后,H的变量已经被改成回合数了
这看似是个二选一,实际上只有第二种算法作为唯一选项,因为第一种已经因为比较时不能计算而不可行了然后我发现了第三种算法就是……
用第四个计分板(R)保留的怪物血量除以玩家的单次伤害
昙花一现,没什么卵用,因为是整除,怎么算都是可以整除的。
【头条】某辣鸡游戏因服务器bug导致怪物永远少打一回合,官方:不知道怎么修复
大概就是这样,
复制代码前面的基础上加上这些就是玩家的R(玩家总伤害)是否等于怪物R(怪物体力)
真的很谢谢你,已经让我有了自己解决这类问题的能力,你给我的不只是答案
CHElover_C60 发表于 2019-3-23 12:05
把鼠标放到显示的盔甲架文本上,显示的文本最下面一行就是UUID
哦原来是F3的那个x
知道了
顺便新的问题…
首先既然你玩过魔塔,那应该知道布局,假设1楼3个蝙蝠,2楼5个蝙蝠,3楼9个蝙蝠
我不可能为每个蝙蝠都弄个盔甲架,肯定是在远处某个位置放一堆怪物图鉴
所以我该怎么…
所以我该怎么说。
我该怎么让负责计算的那一块区域明白我在和什么怪物作战
因为在计算完成后还必须返回一个指令让指定位置处的命令方块触发fill清空组成怪物的方块,而且我需要用第四个计分板记录怪物的血量,以便该变量被覆盖掉后能够计算该数值会不会被玩家伤害整除(是否等于总伤害)
因为比较的时候只能用以得出的变量而不能用公式
我反复的算了一下
真的必须要用到第四个计分板
首先,在获取到总伤害变量之前,只能用怪物血是否能被玩家伤害整除,但exe什么什么的指令只能比较不能计算那么另一个算法就是算玩家总伤害是否等于怪物体力
而在这之后,H的变量已经被改成回合数了
昙花一现,没什么卵用,因为是整除,怎么算都是可以整除的。
【头条】某辣鸡游戏因服务器bug导致怪物永远少打一回合,官方:不知道怎么修复
大概就是这样,
- <div>/scoreboard players operation EnderDragon R = EnderDragon A</div><div>/execute if score EnderDragon R = @e[tag=fighting,limit=1] R</div>
真的很谢谢你,已经让我有了自己解决这类问题的能力,你给我的不只是答案
本帖最后由 CHElover_C60 于 2019-3-23 14:03 编辑
那个bug我还是觉得单纯的把怪物的血量减少1就可以完美地解决。。。
关于对战斗的判定,我开始的想法是在战斗的地点加载怪物属性,然后激活远处的命令方块,在远处加载玩家的属性并进行战斗。
我刚刚又想到一个方法,需要再增加一个计分板(暂且认为这个计分板的名字是id),用于保存实体id。然后给除了标签为fighting的盔甲架以外的每一个盔甲架都编号,这样在战斗开始前,先在激活处编辑fighting这个盔甲架的id分数,然后激活远处的命令方块,在远处激活以下命令
复制代码含义是检测每一个盔甲架的id值是否与fighting这个盔甲架的id相等,并把id相同的盔甲架的属性搬运到fighting盔甲架上。
execute ... as <实体> ...表示修改命令的执行者,会影响@s
tag=!标签 选择没有某标签的实体
银龙斩月 发表于 2019-3-23 12:51
哦原来是F3的那个x
知道了
顺便新的问题…
那个bug我还是觉得单纯的把怪物的血量减少1就可以完美地解决。。。
关于对战斗的判定,我开始的想法是在战斗的地点加载怪物属性,然后激活远处的命令方块,在远处加载玩家的属性并进行战斗。
我刚刚又想到一个方法,需要再增加一个计分板(暂且认为这个计分板的名字是id),用于保存实体id。然后给除了标签为fighting的盔甲架以外的每一个盔甲架都编号,这样在战斗开始前,先在激活处编辑fighting这个盔甲架的id分数,然后激活远处的命令方块,在远处激活以下命令
- /execute as @e[type=armor_stand,tag=!fighting] if score @s id = @e[tag=fighting,limit=1] id run scoreboard players operation @e[tag=fighting,limit=1] A = @s A
- /execute as @e[type=armor_stand,tag=!fighting] if score @s id = @e[tag=fighting,limit=1] id run scoreboard players operation @e[tag=fighting,limit=1] D = @s D
- /execute as @e[type=armor_stand,tag=!fighting] if score @s id = @e[tag=fighting,limit=1] id run scoreboard players operation @e[tag=fighting,limit=1] H = @s H
execute ... as <实体> ...表示修改命令的执行者,会影响@s
tag=!标签 选择没有某标签的实体
本帖最后由 银龙斩月 于 2019-3-23 14:17 编辑
不不不我需要的是这个,战斗的怪物具体在什么位置而不是类型
因为清除怪物所在方块不是根据怪物类型决定的
这个方法我想过了x
我会在每一个怪物附近藏一个fill指令的命令方块,怎么在成功的战斗后触发这个
这是关键
然后
/scoreboard players operation @e[tag=fighting,limit=1] H -= @e[tag=bianfu,limit=1] R
因为记录非战斗的怪物数据的盔甲架是没有用到R计分板的,所以这个-1就直接套用在蝙蝠的计分板上了.
话说…
execute如果得出的结果不符,还会执行run后面的东西么,这个我想确定一下
CHElover_C60 发表于 2019-3-23 13:50
那个bug我还是觉得单纯的把怪物的血量减少1就可以完美地解决。。。
关于对战斗的判定,我开始的想法是在 ...
不不不我需要的是这个,战斗的怪物具体在什么位置而不是类型
因为清除怪物所在方块不是根据怪物类型决定的
我会在每一个怪物附近藏一个fill指令的命令方块,怎么在成功的战斗后触发这个
这是关键
然后
/scoreboard players operation @e[tag=fighting,limit=1] H -= @e[tag=bianfu,limit=1] R
因为记录非战斗的怪物数据的盔甲架是没有用到R计分板的,所以这个-1就直接套用在蝙蝠的计分板上了.
话说…
execute如果得出的结果不符,还会执行run后面的东西么,这个我想确定一下
本帖最后由 CHElover_C60 于 2019-3-23 14:24 编辑
我提供两个解决方案
第一种是在触发战斗时在那个命令方块前放置一个盔甲架并添加标签复制代码生成一个有fill标签的盔甲架
战斗结束后在这个盔甲架所在位置放置红石块复制代码
exexute ... at <实体> ...修改命令执行地点为实体所在位置
另一种是直接在怪物指定位置上放置盔甲架,然后战斗结束后直接在远处利用execute at来使用fill
对于execute if,如果条件不满足,(对于该实体)后面的内容都不会执行了
银龙斩月 发表于 2019-3-23 14:03
不不不我需要的是这个,战斗的怪物具体在什么位置而不是类型
因为清除怪物所在方块不是根据怪物类型决定的 ...
我提供两个解决方案
第一种是在触发战斗时在那个命令方块前放置一个盔甲架并添加标签
- /summon armor_stand <x> <y> <z> {Tags:["fill"]}
战斗结束后在这个盔甲架所在位置放置红石块
- /execute at @e[tag=fill,limit=1] run setblock ~ ~ ~ redstone_block
exexute ... at <实体> ...修改命令执行地点为实体所在位置
另一种是直接在怪物指定位置上放置盔甲架,然后战斗结束后直接在远处利用execute at来使用fill
对于execute if,如果条件不满足,(对于该实体)后面的内容都不会执行了
本帖最后由 银龙斩月 于 2019-3-23 14:28 编辑
这个主意不错x
然后我上面更新了问题,就是
execute,如果不符合会不会执行run
wiki上是这样写的
如果之前有条件子命令,则只有当条件符合或不符合时执行子命令
符合不符合都执行那判断有个卵用…不过就相信你说的吧0 0
然后关于这个
/execute if score EnderDragon R = @e[tag=fighting,limit=1] R run /scoreboard players operation @e[tag=fighting,limit=1] H -= @e[tag=bianfu,limit=1] R
判断玩家的R(玩家总伤害)是否等于怪物R(怪物体力),如果是,怪物进攻的回合数减少1
真的有必要判断怪物能否打动玩家么
CHElover_C60 发表于 2019-3-23 14:22
我提供两个解决方案
第一种是在触发战斗时在那个命令方块前放置一个盔甲架并添加标签生成一个有fill标签 ...
这个主意不错x
然后我上面更新了问题,就是
execute,如果不符合会不会执行run
wiki上是这样写的
如果之前有条件子命令,则只有当条件符合或不符合时执行子命令
符合不符合都执行那判断有个卵用…不过就相信你说的吧0 0
然后关于这个
/execute if score EnderDragon R = @e[tag=fighting,limit=1] R run /scoreboard players operation @e[tag=fighting,limit=1] H -= @e[tag=bianfu,limit=1] R
判断玩家的R(玩家总伤害)是否等于怪物R(怪物体力),如果是,怪物进攻的回合数减少1
真的有必要判断怪物能否打动玩家么
本帖最后由 CHElover_C60 于 2019-3-23 14:33 编辑
条件子命令有两个,一个是if,一个是unless
if当条件成立时继续执行后续子命令
unless当条件不成立时继续执行后续子命令
如果不判断怪物能否伤害玩家,可能会出现战斗后玩家血量增加的情况
银龙斩月 发表于 2019-3-23 14:24
这个主意不错x
然后我上面更新了问题,就是
execute,如果不符合会不会执行run
条件子命令有两个,一个是if,一个是unless
if当条件成立时继续执行后续子命令
unless当条件不成立时继续执行后续子命令
如果不判断怪物能否伤害玩家,可能会出现战斗后玩家血量增加的情况
本帖最后由 银龙斩月 于 2019-3-24 04:51 编辑
这倒不怕,因为玩家的攻防体是根据手持苹果红石青金石决定的owo,属于内部看不见的临时数据,会在下一次战斗的时候基于玩家物品被修正
那么,既然问题基本上解决了,这个贴大概可以到此为止了,后续有什么需要传图的地方我会以编辑的形式在这层更新,其他的移到私信了
顺便ww这个问题我搞定了
对于一些困难我不喜欢走捷径解决
,如图,可整除则剩余487的血(此时玩家攻击128怪物防64),反之446(玩家攻击128怪物防御65)
此前的基础上加入这些即可
复制代码
CHElover_C60 发表于 2019-3-23 14:32
条件子命令有两个,一个是if,一个是unless
if当条件成立时继续执行后续子命令
unless当条件不成立时继续 ...
这倒不怕,因为玩家的攻防体是根据手持苹果红石青金石决定的owo,属于内部看不见的临时数据,会在下一次战斗的时候基于玩家物品被修正
那么,既然问题基本上解决了,这个贴大概可以到此为止了,后续有什么需要传图的地方我会以编辑的形式在这层更新,其他的移到私信了
顺便ww这个问题我搞定了
对于一些困难我不喜欢走捷径解决
,如图,可整除则剩余487的血(此时玩家攻击128怪物防64),反之446(玩家攻击128怪物防御65)
此前的基础上加入这些即可
- /scoreboard players operation EnderDragon R = EnderDragon A
- 把玩家的每回合伤害存入R变量中
- /scoreboard players operation EnderDragon R *= @e[tag=fighting,limit=1] H
- 计算玩家总伤害,保存在玩家R中
- /execute if score EnderDragon R = @e[tag=fighting,limit=1] R run scoreboard players operation @e[tag=fighting,limit=1] H -= @e[tag=bianfu,limit=1] R
- 判断玩家的R(玩家总伤害)是否等于怪物R(怪物体力),如果是,怪物进攻的回合数减少1