我在Minecraft教育版中使用代码构建者尝试计算圆周率

首先

除了Bedrock Edition(BE)和Java Edition(JE)之外,Minecraft(Minecraft)还有针对教育的功能扩展版Education Edition(EE)。通过使用EE的代码生成器功能,您可以使用MakeCode这个可视化编程工具,以及JavaScript、Python等编程语言,在超越世界(Minecraft的世界)中运行程序。
本次我们将在超越世界中使用方块来绘制圆形的程序,并尝试从圆的直径与面积比例中计算出圆周率。

思维方式

在Minecraft中,通过三轴坐标$x,y,z$来表示Overworld内的位置。其中,$x$和$z$是水平方向的坐标,$y$是垂直方向的坐标。利用这些坐标,可以计算出任意两个坐标$P_1(x_1,y_1,z_1)$和$P_2(x_2,y_2,z_2)$之间的距离$d_{12}$。

d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} 

可以通过以下方法来获取1。

这次为了简单起见,我们假设在水平方向上画圆,忽略垂直方向的坐标。以圆心坐标$P_c$和半径$r$构建一个圆,这个圆与以中心为起点,在$±r$的位置画正方形相切。以$r=10$为例进行示意的图形如图1所示。

図.png

因此,如果能够判断出以中心为起点,距离不超过半径$r$的方块(图1中的菱形方块)作为搜索区域内部,就能够绘制出一个圆形。而半径为$r$的圆所使用的方块数量$N_r$就等于圆的面积,因此半径为$r$的圆的圆周率$\pi_r$就是

\pi_r=N_r / r^2

可以用计算得出2。

编写代码

MakeCode_startup.png
スクリーンショット (32).png

前文提到的思维方式已经通过MakeCode编码实现,并且在图4中展示出示例程序。该程序以半径$r$、中心的$x$座标、中心的$z$座标作为参数,在生成的平坦世界地表上绘制一个圆。※默认情况下可设置的参数最多为3个。本来我希望能够设定中心的$Y$座标(高度)作为参数,但本次示例中我们使用了固定值-60,该值对应着平坦世界地表的高度。

スクリーンショット 2023-11-29 011038.png

MakeCode的代码块可以相互转换为JavaScript,因此也提供了转换为JavaScript的代码。

let y中心座標 = 0
let x開始座標 = 0
let z開始座標 = 0
let x変位 = 0
let ブロック数 = 0
let z変位 = 0
let 距離の二乗 = 0
let 円周率 = 0
player.onChat("circle", function (半径, x中心座標, z中心座標) {
    y中心座標 = -60
    x開始座標 = x中心座標 - 半径
    z開始座標 = z中心座標 - 半径
    x変位 = 0 - 半径
    ブロック数 = 0
    while (x変位 <= 半径) {
        z変位 = 0 - 半径
        while (z変位 <= 半径) {
            距離の二乗 = x変位 ** 2 + z変位 ** 2
            if (距離の二乗 <= 半径 ** 2) {
                ブロック数 += 1
                blocks.place(DIAMOND_BLOCK, world(x中心座標 + x変位, y中心座標, z中心座標 + z変位))
            }
            z変位 += 1
        }
        x変位 += 1
    }
    円周率 = ブロック数 / 半径 ** 2
    player.say("面積:" + ブロック数)
    player.say("円周率:" + 円周率)
})

执行代码 (zhí mǎ)

那么,我们使用这段代码,在实际的游戏世界中画一个圆,并计算圆周率。

r=1,2 可以简化为 r等于1或2。

用$r=1$和$r=2$绘制的是图5和图6。在这个尺寸下,单位块的大小误差对圆形的影响非常大,所以看起来并不圆。

r001.png
r002.png

r=4、8、16

从$r$超过4开始,形状逐渐变得接近一个圆。
如果按照精确度为约3作为圆周率的标准,这样大小的圆看起来就够了。
但是,我是曾经学过圆周率是3.14的一代人,所以我希望至少扩大到那个程度。

r004.png
r008.png
r016.png

r=32、64、128

如果将它扩大到这个程度,它看起来就像是经过精心绘制的圆形。当$r=128$时,它接近于Minecraft: Education Edition中可以设定的视野限制。当站在圆形上时,看起来就像是站在钻石方块的平地上一样。

r032.png
r064.png
r128.png
r128-horizon.png

在Minecraft EE中,只能进行与方块放置等运算的范围是以自身所在的坐标为中心最多可以达到8个区块(128个方块)的距离,所以似乎无法画出更大的圆形。

总结

下表是根据之前的计算所得到的结果整理而成的。

半径面積円周率1552133.2581973.0781167973.11333232093.133864128533.1379128514333.1392

随着$r$的增大,可以看出它逐渐接近真实的圆周率。我们将进一步分析这一趋势。图1是将半径表示在横轴上,将与真实圆周率之间的差表示在纵轴上所绘制的图表。由于图表是在对数坐标轴上绘制的直线,可以看出差异以$r$的指数递减的趋势收敛。

グラフ1.png

为了画出一个圆,我们开发的程序优先考虑直观易懂性,并且为了完全搜索与圆外接的正方形区域,计算量成比例地增加了$r$的平方。为了更快地画出圆,我们可以改进程序,使计算量与$r$成比例。我们计划在12月20日的圣诞日历上发布这个程序的改进。

赠品

同心円.png
严格来讲,Minecraft的坐标并不代表一个点,而是表示一个立方体的长度单位范围,因此,将坐标视为点进行计算会产生偏差。但是,在距离长度单位足够大的情况下,这个偏差是可以忽略的。实际上,并不需要在正方形区域内进行全面搜索,存在一种更高效的方法来确定在距离r范围内的区域。然而,有关这种搜索方法的改进将在另一篇文章中进行总结。
广告
将在 10 秒后关闭
bannerAds