黑洞

数学不好不会写,请dalao多多体谅

本题目出自CBL前新手群(现技术摸鱼交流群)问答比赛。

题目:

32*32的场地有一个确定的中点,范围内玩家均会受到值为每秒0.5格,方向对准这个中心点的速度分量。

目前已经有船黑科技,然而船黑科技比较难以控制速度(一层=0.2米,不可能0.5米),所以我们还是需要用别的方法的。

而我们选择的方法就是穷举。

穷举

我们首先要解决的问题就是,如何得知中心在哪个角度。

我们可以穷举不同坐标,穷举出每个坐标分别在中心的哪个方位,然后穷举传送的值。
然而这方法的精度不足(一个方块里也能有不同位置),我们不会使用这个方法。

我们可以在中心四周(圆形)放一大堆marker实体,每个代表一个相应角度,让玩家选择最近的那个。很难解释直接上图算了。

绿色代表黑洞中心。黑色圆形外框代表我们穷举生成的marker,注意marker的位置必须精准测量,间隔相同以及距离中心的位置相同。
ABCD这四点代表不同的玩家位置。红色的点代表玩家选择到最接近他们的marker。
可以看到玩家选择的离他们最近的marker,就代表他们的角度是θ。(解释啥的已经懒得写了)

我们要得知玩家当前角度的方法十分简单:把角度分数放进marker记分板里,然后赋值就行了。于是我们穷举的工作有这几个部分:

  1. 每个角度:
    1. 指定坐标(根据角度和中心位置进行计算)生成marker
    2. 给新生成的marker一个角度分数
  2. tp指定分数(角度)的玩家一定距离(水平距离为0.5米)
    由于我们是向着圆心传送的,因此我们的角度是 180°-θ。然而为了方便,我们直接把marker和圆心的距离设为0.5,然后tp的坐标就是 -marker和圆心的相对坐标 就行了。

穷举部分(直接上js代码,没人会手算。辣鸡代码请dalao手下留情):

点击显示命令(代码和下方JS一样)
//初始化的命令,在中心的位置执行
var init = [];
//main的命令
var main = ["execute @a ~ ~ ~ scoreboard players operation @s angle = @e[c=1,tag=circle] angle"];

//i为角度
for (var i = 0; i < 360; i+=3) {
    //x偏移
    var x = 0.5 * Math.cos(i / 180 * Math.PI); //角度转rad
    var z = 0.5 * Math.sin(i / 180 * Math.PI);

    init.push('summon area_effect_cloud ~' + x.toFixed(3) + ' ~ ~' + z.toFixed(3) + ' {Duration:2147483647,Tags:[circle,new]}');
    init.push('scoreboard players set @e[tag=new] angle ' + i);
    init.push('scoreboard players tag @e[tag=new] remove new');
    main.push('tp @a[score_angle_min=' + i + ',score_angle=' + i + '] ~' + (-x).toFixed(3) + ' ~ ~' + (-z).toFixed(3));
}

results matching ""

    No results matching ""