<
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
由arpruss 跟随
这个 Instructable 展示了如何安装和使用我编写的一个 mod,它可以让你用 python 脚本控制 Minecraft。我将重点介绍 Windows,尽管 OS X 和 Linux 应该也能正常工作。(如果你想要比 python 更简单的东西,
这里是这个项目的 Scratch 版本 。)
我假设您具备在 Windows(或您选择的操作系统)上创建文件夹以及下载、解压缩和复制文件的基本能力。
您可以使用文本编辑器、Python 附带的 IDLE 环境或 Windows 上的 Visual Studio Python 工具为 Minecraft 创建 Python 脚本。最后一个在某些方面实际上是最好的,所以我将有一些关于如何做到这一点的可选步骤。
今年夏天,我计划使用 Minecraft、Raspberry Jam Mod、Python 和 Visual Studio 向有天赋的中学生和高中生教授编码和基本 3D 几何。
添加提示问问题评论下载
第 1 步:为 Minecraft 安装 Forge
Forge 管理 Minecraft 模组,并且是 Raspberry Jam 模组所必需的。
我假设你已经安装了 Minecraft。
您需要运行一次 Minecraft 1.12.2(版本很重要)。为此,启动 Minecraft Launcher,登录后单击“安装”,然后按“新建”按钮创建配置文件。从下拉列表中选择“Release 1.12.2”,保存配置文件(你可以给它起一个像“1.12.2”这样的名字),开始一个世界并确保它能正常工作。 退出 Minecraft 和 Minecraft Launcher。 下载1.12.2 的 Forge 安装程序。 运行 Forge 安装程序。默认设置应该有效。 启动我的世界。您现在将拥有一个新的 Forge 1.12.2 配置文件。
添加提示问问题评论下载
第 2 步:Windows Installer [自动安装]
添加提示问问题评论下载
第三步:安装Python【手动安装】
您需要决定是要 Python 2.7 还是 Python 3.x。Adventures
in Minecraft 这 本书使用的是 2.7,网上流传的大多数脚本都是针对 2.7 的,但我已经为 3.x 转换了很多脚本。
2. 运行安装程序。
3. 单击“自定义 Python”对话框,确保向下滚动到“将 python.exe 添加到路径”,单击它并选择“将安装在本地硬盘上”。如果您不将 Python 添加到路径中,您将无法从 Minecraft 中使用/python启动脚本。
添加提示问问题评论下载
第 4 步:安装 Mod 和脚本
1. 在您的 Minecraft 文件夹中创建一个mods文件夹。(为此,按Windows-R,键入% appdata%\.minecraft,然后按enter。您将在 Minecraft 文件夹中看到所有内容。如果您已经有一个mods子文件夹,则无需执行任何操作。否则,使1. 在 Windows 8 上,单击新建文件夹,然后输入名称mods并按回车键。)
4. 打开下载的 zip 文件(在 Chrome 中,通过在窗口底部单击它)。它有一个mcpipy文件夹。将mcpipy文件夹复制到您的 Minecraft 文件夹中。(为此,请单击zip 文件中的mcpipy文件夹,然后按ctrl-c ,然后按照步骤 1导航到%appdata%\.minecraft文件夹,然后按ctrl-v)。
添加提示问问题评论下载
第 5 步:测试模组
启动 Minecraft,确保使用Forge配置文件。
创建一个新世界(使用 python 脚本很容易搞砸)。我女儿建议我使用 Creative 和 Superflat。
在 Minecraft 中,输入/py donut并按回车键。
如果一切顺利,你周围会画出一个巨大的玻璃甜甜圈,然后里面装满水。
如果您遇到类似于找不到脚本的错误,这可能意味着您没有在%appdata%\.minecraft\mcpipy文件夹中安装示例脚本。
如果您收到“无法运行程序“python””错误,则说明您的系统路径中没有 python 目录。您可能需要手动将其添加到路径中,或者按照我的 python 安装步骤的第 3 步中的说明重新安装 python。
使用/py运行新脚本会停止运行任何较早的脚本(如果您不喜欢这样,请使用/apy而不是/py)。您可以通过不带任何参数键入/py来停止正在运行的脚本。
添加提示问问题评论下载
第 6 步:开始使用 Python 对 Minecraft 进行编程
开始使用 Python 编写 Minecraft 编程的最简单方法是从一个更简单的示例脚本开始。我建议在桌面上为脚本文件夹 ( %appdata%\.minecraft\mcpipy ) 创建一个快捷方式。
您可以将脚本加载到 IDLE 中。一个有趣的修改脚本是我的注水甜甜圈脚本 ( donut.py )。例如,将倒数第二行中的WATER更改为GRASS以制作一个愚蠢的充满草的甜甜圈。您可以使用 Minecraft 中的/py donut运行它,或者只需在 IDLE 中按F5即可。
或者要制作一个简单的新脚本,请在脚本目录中使用您最喜欢的文本编辑器(甚至是记事本)创建一个helloworld.py文件。放在最上面:
从我的进口 *这将导入所需的库代码。它还可以方便地从数学库中导入所有函数以及所有块的名称。通过以下方式连接到 Minecraft:
mc = 我的世界()然后您可以发送“Hello world!” 给用户的消息:
mc.postToChat("Hello world!")如果你想在玩家正下方创建一个钻石块,你也可以这样做:
playerPos = mc.player.getPos()mc.setBlock(playerPos.x,playerPos.y-1,playerPos.z,block.DIAMOND_ORE)setBlock()和getPos()的坐标是从玩家的出生点(因此是 (0,0,0))开始测量的。
(关于除 DIAMOND_ORE 之外的所有方块名称的列表,请参阅脚本文件夹中的mcpi\block.py 。您也可以直接使用 Minecraft 方块编号。)
要运行您的脚本,请保存它并在您的 Minecraft 世界中键入/py helloworld并按enter 键。
有时一次设置整个矩形棱柱块很有用:使用 mc.setBlocks()。例如,我的mengersponge.py脚本的这段摘录在玩家位置绘制了一个 81x81 的立方体(脚本然后递归删除——即,替换为AIR ——subblocks 以形成屏幕截图中的分形图像):
长度 = 3*3*3*3mc.setBlocks(playerPos.x,playerPos.y,playerPos.z, playerPos.x+length-1,playerPos.y+length-1,playerPos.z+length-1,block.WOOL_PURPLE)技术说明:从我的导入 *开始,将大量内容(Minecraft、方块定义、实体定义、数学)导入到我们的命名空间中。这对于专注于初学者的基本知识很方便(请记住,我将使用它来向初学者教授编码)。更高级的用户可能更喜欢通过将命名空间分开并放入标头中来变得更加pythonic:
将 mcpi.minecraft 导入为 minecraft将 mcpi.block 导入为块将 mcpi.entity 作为实体导入导入数学然后从mc = minecraft.Minecraft()甚至mc = minecraft.Minecraft.create()开始。
添加提示问问题评论下载
第 7 步:基于海龟的简单绘图
在 Minecraft 中绘制的一种特别简单的方法是使用基于海龟的系统。我制作了一个非常简单的 Turtle 类(灵感来自 Martin O'Hanlon 的
MinecraftTurtle 类 ),用于向中学生和高中生介绍 Minecraft python 脚本。
以创意模式启动 Minecraft 世界,让您的玩家飞行(双击空格键)。使用以下命令初始化脚本:
从 mineturtle 导入 *t = 海龟()(我将所有 Minecraft 连接代码包装在 Turtle 类中,为了方便起见,它还将数学引入命名空间。)您现在可以执行t.go(15)之类的操作,在向前移动 15 个方块时画一条线,t.right( 45)向右旋转45度,t.down(30)向下旋转30度,从而画出简单的图。
你在乌龟画画时跟着它移动,这很有趣,乌龟从玩家所在的地方开始,水平指向。
例如,您可以绘制一个水平正方形:
t.go(50)t.right(90)t.go(50)t.right(90)t.go(50)t.right(90)t.go(50)你通过做一个 7 边形的星:
t.go(50)t.right(180.-180./7)七次。或者只是循环一次:
对于我在范围内(7): t.go(50) t.right(180.-180./7)您可以使用penblock()更改材料。例如,金色垂直星:
t.penblock(block.GOLD_BLOCK)对于我在范围内(7): t.go(50) t.right(180.-180./7)您可以使用penwidth(x)更改笔宽。例如,这绘制了一个非常简单的玻璃甜甜圈(实际上是一个加厚的 90 边形,但谁能分辨出区别?):
t.penblock(块。玻璃)半径 = 20周长 = 2 * 半径 * pit.笔宽(10)对于我在范围内(90): t.go(周长/90) t.左(360/90)以下是所有可用的方法:
go(x):向前移动 x 个方块(如果笔按下则绘图) back(x):向后移动 x 个方块(如果笔按下则绘图) penup():暂停绘图恢复绘图 left(angle):向左旋转角度(以度为单位) right(angle):向右旋转角度(以度为单位) up(angle):向上旋转一个角度(以度为单位);初学者不应该混合左/右和上/下旋转,否则他们可能会得到意想不到的结果(技术说明:与pitch(angle)相同) down(angle):向下旋转一个角度(以度为单位)(技术说明:与pitch(-angle)相同) pendelay(x):海龟每次移动或旋转都会延迟x秒;默认为 0.05;设置为零以获得更快的绘制速度(玩家仍然会随着绘制的每条线移动,但从头到尾瞬间移动) angle(x):将水平角度设置为 x(顺时针方向;0 = 南,90 = 西,180 = 北,270 = 东);重置滚动角度 verticalangle(x):将垂直角度设置为 x(以度为单位;向上为正;90 = 垂直向上;-90 = 垂直向下);重置滚动角度 angles(compass,vertical,roll):设置罗盘角、垂直角和横滚角;省略的参数被认为是零 penblock(x):设置绘图材质到块x;有关预定义块的列表,请参阅mcpi/block.py goto(x,y,z):将笔位置设置为 (x,y,z);您还可以访问t.position.x、t.position.y和t.position.z的位置 follow():玩家跟随乌龟 nofollow():玩家不跟随乌龟 turtle(x):如果 x 是 PLAYER,则与 follow() 相同,如果 x 是 None,则与 nofollow() 相同。如果您使用的是 Raspberry Jam Mod,您还可以使用除您自己以外的其他实体作为乌龟。例如,turtle(HORSE)生成一匹马用作乌龟(所有可用的实体都列在mcpi/entity.py中,但活着的最好,因为其他人无法漂浮;并且无法控制 Ender Dragon) . 脚本完成后实体仍然存在。要让它消失,请调用 turtle(None) 或 turtle(PLAYER)。 penwidth(x):将笔划宽度设置为 x(默认为 1;较宽的笔划会减慢绘图速度,如果开启跟随模式,您可能最终会陷入笔划中,因此最后您应该调用penup()并退出的绘图) pitch(x) , yaw(x)和roll(x):通过俯仰/偏航/滚动角度旋转乌龟(参见 Instructable 的下一步) startface()和endface():开始和结束绘制一个填充的凸多边形 push()和pop():保存和恢复绘图状态(标题、材料、面状态、厚度;但不是速度或海龟类型);对L 系统 有用 gridalign():将当前位置和乌龟方向与网格对齐(选择最接近乌龟当前方向的)
与我的 Raspberry Jam Mod 不同,mcpiapi mod 不支持设置播放器的方向。这意味着玩家不会面对与乌龟相同的方向。(并且 turtle 脚本还有可能出现其他问题。)
技术说明:如果您已经有一个 Minecraft 对象mc,请使用t = Turtle(mc)进行初始化。如果您在初始化乌龟时省略了 Minecraft 对象,它会为您创建,在任何一种情况下,您都可以通过t.mc访问 Minecraft 对象。
您还可以直接从 Minecraft 聊天窗口使用 python 代码来控制乌龟。
在 Minecraft 中,通过键入以下命令运行turtleconsole.py脚本:/py turtleconsole [enter]。
然后你输入聊天的每一行 python 都会被 python 解释器执行。要在聊天中输入一行,请按T,键入该行并按[enter]。要退出 turtleconsole,只需键入/py [enter]或在聊天中输入quit() [enter] 。
上下文包括一个初始化为 Turtle() 对象的局部变量t,因此您不需要运行任何初始化代码,就像这样:
t.penblock(block.GOLD_BLOCK)t.back(10)还有一个用于完整的非 Turtle API 的控制台:console.py(其中包括一个预初始化的mc局部变量)。(只是不要放入任何 postToChat() 调用,否则它们会使解释器感到困惑。)
添加提示问问题评论下载
第 8 步:基于海龟的高级绘图
对海龟使用left()、right()、up()和down()方法很容易。但对于某些图纸,我们需要更复杂的 3D 控制。例如,您可能想要绘制一个向上倾斜 45 度的甜甜圈。从上一步中获取玻璃甜甜圈脚本,并在循环之前添加:
t.up(45)但这会产生意想不到的结果——见图片。这样做的原因是海龟将一直向上爬,而 d.left() 方法将它绕垂直轴旋转,所以你会得到一个螺旋。
相反,我们需要做的是乌龟的偏航/俯仰/滚动旋转。看看来自 NASA 的图片(美国政府的作品是公共领域)解释了三个角度是如何移动的,然后想象飞机是你的乌龟。(不幸的是,由于 Minecraft 的限制,滚动角度不会影响乌龟的外观或您观看的角度。)我们需要做的是绘制我们的侧面甜甜圈,首先将我们的乌龟滚动 45 度使用t.roll(45),然后在绘制甜甜圈时使用t.yaw(-angle)而不是t.left(angle)。修改后的代码在截图中。
yaw/pitch/roll 旋转的好处在于它们总是相对于乌龟指向的位置,而 left() 和 right() 是相对于 Minecraft 世界的。
最后,这是一个更高级的示例。让我们画一棵树。这涉及制作递归函数。从这个开始,以确保尽可能快地完成绘图
从 mineturtle 导入 *t = 海龟()t.pendelay(0)t.turtle(无)现在我们执行递归树函数。这背后的基本思想是分支只是一棵较小的树。所以我们制作了一个函数,它接受一个计数器和一个分支长度。计数器指定树将进行多少次迭代。例如,counter=1 表示只绘制主干,counter=1 表示主干和一组树枝将被绘制。
def 树(计数器,branchLen): 如果计数器 == 0: 返回 t.go(branchLen) 对于我在范围内(4): t.间距(30) 树(计数器 1,branchLen * 0.75) t.pitch(-30) t.roll(90) t.back(branchLen)首先,代码检查我们的计数器是否已经减到零。如果是这样,我们就没有什么可画的了。然后我们画一个树干。然后我们用一个简单的循环画出四个伸出来的树枝。为了设计这段代码,我只是把自己想象成乌龟,刚刚沿着树干向上移动。为了绘制树枝,我将自己向上倾斜 30 度(即t.pitch(30))并绘制一棵较小尺寸的新树:它的计数器减一,树干长度为 3/4我目前的行李箱。我想把自己向后倾斜 30 度。我将自己旋转 90 度并重复练习。最后,一旦我完成了树枝,我就回到树干上。
最后,我只需要调用这段代码。我将制作一棵计数器为 6 且初始分支长度为 20 的树。为了更好地衡量,我用木头制作它,当然是垂直向上的:
t.penblock(木块)t.verticalangle(90)树(6,20)这棵分形树看起来不太逼真。我们应该让树干变粗,而树枝在向外延伸时变得越来越细(比如,变粗一半,直到它们到达一个方块),我们应该在外出时从WOOD 方块切换到LEAVES方块。但最重要的是,真正的树木并不那么规则。我们需要一些随机性。最简单的随机性形式就是给每个分支一个生长失败的机会,比如 20% 的机会。
我在我的fancytree.py 脚本 中实现了所有这些. 对于由这样一段相对简单的代码生成的东西,生成的树看起来非常逼真。我如何实现它的一个有趣的副作用是有 20% 的机会什么都不会被绘制——也就是说,树有可能无法生长,这也是现实的。每次运行脚本时,您都会得到不同的结果。
turtle 绘图类的另一个有用特性是不仅可以绘制直线,还可以绘制多边形表面。为此,只需执行t.startface(),绘制表面,然后执行t.endface()。进入面模式后,每次绘制一条线时,代码实际上会绘制一个三角形:一个顶点是调用t.startface()时海龟所在的点,线是相对的边。这绘制了一个向一侧倾斜 45 度的五边形:
t.roll(45)t.startface()对于我在范围内(5): t.go(20) t.yaw(360/5)t.端面()
添加提示问问题评论下载
第 9 步:带海龟图形的 L 系统分形
画一个三角形。现在取三角形的每条线并将其替换为上面有三角形凸起的线。重复。就像动画图像(公共领域,基于
维基百科 )一样,您会得到一个
科赫雪花 。
这可以通过一个超级简单的海龟图形程序来建模。想象一下,F是“向前划”的意思,“+”和“-”分别逆时针和顺时针转60度。然后可以通过以下方式绘制初始三角形:
F++F++F即往前走,右转120度,然后往前走,右转120度,往前走。
三角形凸起线可以通过以下方式绘制:
F-F++FF所以这就是我们如何生成雪花。我们拿初始海龟程序F++F++F画一个三角形。其中每个F代表一行。因此,将每个F替换为F-F++FF。如果我们继续前进,我们会生成科赫雪花。
这是 L 系统的一个简单示例。L 系统背后的想法是我们从一串字符开始(在本例中为F++F++F),然后是一堆如何更改字符的规则(在本例中,一个规则要替换F与F-F++FF ) 在每次迭代中。我们多次应用这个,我们得到一个相当复杂的字符串。例如,在雪花案例中经过两次迭代后,我们得到:
F-F++FFF-F++F-F++F-F++FFF-F++F-F++F-F++FFF-F++F-F++F-F++ FFF-F++F-F++F-F++FFF-F++F-F++F-F++FFF-F++FF四点之后,我们得到上图。(要真正 获得分形,线条应该随着每次迭代而缩小,但这在 Minecraft 中不起作用。)
我写了一个非常简单的lsystem.py模块。要实现雪花,请从样板文件开始:
导入 lsystem来自乌龟进口*t = 海龟()t.pendelay(0)t.penblock(block.GOLD_BLOCK)现在我们需要定义规则。我通过 python 字典定义规则:
规则 = { 'F': 'F-F++FF' }接下来我们定义公理或起点:
公理 = 'F++F++F'最后,我们需要告诉系统字符串中每个符号的含义。对于不同的 L 系统,我们将赋予它们不同的含义(例如,旋转不同的角度)。所以我们需要第二个 python 字典来指定对每个符号执行的操作。如果你没有为一个符号指定一个动作,当海龟绘制输出时该符号将被忽略(但它可能对生成很重要)。含义由字典给出,该字典指定为每个符号调用的函数。可以使用lambda运算符指定单行函数。在这种情况下,所有功能都是单行的:
字典 = { 'F': lambda: t.go(2), '+': lambda: t.yaw(60), '-':λ:t.yaw(-60)}最后我们调用 L 系统,指定迭代次数(在本例中为 4):
lsystem.lsystem(公理,规则,字典,4)一些 L 系统有一个特殊的技巧。这些 L 系统是网格对齐的,所有旋转都是 90 度。方曲线 ( squarecurve.py ) 和龙曲线 ( dragoncurve.py ) 是很好的例子。诀窍是在代码开头附近的某个地方调用:
t.gridalign()这会将您的乌龟移动到一个整数网格位置,并将其航向与网格方向对齐。在此之后,海龟将保持完全对齐网格,前提是您仅将其移动整数值(例如,7,而不是 7.1,甚至不是 7. 或 7.0,因为它们在 Python 中是浮点数),并且您仅旋转整数值是 90 度的倍数(例如 -180 或 90,但不是 90.0 或 45)。dragon curve 代码还给出了一个前向函数的例子,它稍微复杂一些——它不只是一条线,而是画了一堵有开口的墙。
实际上,调用gridalign()有时是个好主意,即使并非所有角度都是直角。你可能会在大图像中遇到一些舍入问题,但它仍然可以看起来更好。请参阅空间填充曲线示例(以紫色彩色玻璃呈现!)。
L 系统不必是二维的。您可以包括执行偏航、俯仰和滚动旋转的符号。对于设计树,一个有用的技巧是使用堆栈命令:'[' 将当前绘图状态保存到堆栈,']' 将其恢复。这将使用 turtle 模块的push()和pop()方法。例如,这里有一段用于绘制简单树的代码 (ltree.py):
t.pitch(90)规则 = { 'L':'[^FL]>[^FL]>[^FL]' }公理 = 'FL'字典 = { 'F': lambda: t.go(10), '^': lambda: t.pitch(20), '>':lambda:t.roll(120), '[': lambda: t.push(), ']': lambda: t.pop()}lsystem.lsystem(公理、规则、字典、5)将L想象成一片叶子(虽然这个简单的代码实际上并没有绘制叶子——需要将其添加到字典中)。我们从FL开始,它是树干加叶子。然后我们用[^FL]>[^FL]>[^FL]替换每片叶子。这是一组三个分支,每个分支都从树干倾斜 20 度,相隔 120 度。括号确保在绘制每个新的^FL之后,我们回到之前的位置。如此重复,树枝上的叶子被三重树枝代替,依此类推。
更真实的树可能有更复杂的'['代码。它可以使后续的分支更短更细,并在我们靠近叶子时改变它们的材料(然后在']'上恢复)。
我根据Geeky Blogger 的 规则(经过一些调整)在lsystem.py中包含了这样一棵树作为演示代码。
您还可以进行网格对齐的 3D 操作。例如,hilbert.py有一条 3D 希尔伯特曲线。
最后,您可能想在 L 系统规则中引入一些随机化。到目前为止,我们的规则是确定性的:给出一个替换符号的字符串,例如'F': 'F-F++FF'。但不是简单的替换字符串,而是可以给出一个 Python 对列表(p,string),其中p是一个概率(从 0 到 1),string是使用该概率的字符串。给定源符号的概率加起来最好不要超过 1,但它们加起来可以小于 1——在这种情况下,有可能没有替代品。例如,这里是 geeky.blogger 树的一个稍微随机化的版本:
规则 = {'A': [(0.55,'^f[^^f>>>>>>A]>>>[^^f>>>>>>A]>>>>>[^^f >>>>>>A]'), (0.25,'^f>>[^^f>>>>>>A]>>>[^^f>>>>>>A]')]}该规则有 55% 的几率将 A 替换为三分支结构,并有 25% 的几率将其替换为二分支结构。这不是很 随机——更多的随机性会使事情变得更加逼真。我附上了使用此规则随机生成的相当稀疏的森林的屏幕截图(以及随机放置的树木,受最小距离限制)。
添加提示问问题评论下载
第 10 步:笛卡尔绘图
我还制作了一个简单的类,用于使用笛卡尔坐标进行绘图。你可以初始化:
从绘图导入 *d = 绘图()(这会初始化 Minecraft 连接并将数学和方块名称带入命名空间。)然后你有几个方便的方法:
d.penwidth(x):设置点/线/面的粗细 d.line(x1,x2,x3,y1,y2,y3,block) : 从(x1,x2,x3)到(y1,y2,y3)绘制由块材料 制成的线 d.face(vertexlist,block) : 绘制一个面,顶点列表中的顶点由块材料制成
例如,您可以在生成点的 0 级用玻璃制作一个倾斜 45 度的矩形:
d.face([(0,0,0),(0,10,10),(10,10,10),(10,0,0)])为了好玩,我改编了 Simon Tatham 非常简洁的
多面体生成代码 以使用 Minecraft 绘图类。他的代码从一个球体上的一些随机点开始,然后模拟它们相互排斥,直到它们稳定为通常是规则的配置。然后他有两种巧妙的方法可以用这些点制作多面体,一种是面法,一种是顶点法。我把它放在polyhedron.py中。该脚本采用命令行参数。例如,绘制一个二十面体使用 12 个点和顶点构造。直接来自我的世界:
/py 多面体 12 顶点对于十二面体,将vertex更改为face。您还可以为大小添加一个参数。多面体将由带有石头边缘的玻璃制成,并以玩家为中心。
技术说明:如果您已经有一个 Minecraft 对象mc,请使用d = Drawing(mc)进行初始化。无论哪种情况,您都可以通过d.mc访问 Minecraft 对象。
添加提示问问题评论下载
第 11 步:可选:在失去焦点时禁用暂停
当您按 alt-tab 退出游戏或以其他方式失去焦点时,Minecraft 通常会暂停游戏并进入游戏菜单。如果您从 Minecraft 外部启动 python 脚本,这会使其更难查看它们在做什么。为此,您可以编辑 Minecraft 目录( Windows 上为%appdata%\.minecraft)中的 options.txt 文件,更改
pauseOnLostFocus:真线到
pauseOnLostFocus:假然后保存,重启我的世界。
这对于交互式运行 python 脚本特别有用。在屏幕截图中,我正在玩 Michael O'Hanlon 的 3D 乌龟绘图(是的,背景是深空九号)。
添加提示问问题评论下载
第 12 步:高级注释 1:绘制由不等式定义的对象
在 Minecraft 中使用 python 脚本绘制数学定义的对象基本上有两种不同的技术。
一种方法是通过不等式定义实体对象。例如,一个以 (x0,y0,z0) 为中心、半径为 r 的球体可以通过不等式定义:
(x-x0)**2 + (y-y0)**2 + (z-z0)**2 <= r**2(即到 (x0,y0,z0) 的距离最多为 r。)所以要绘制一个球体,只需循环遍历边长 2*r+1 的立方体中的所有点 (x,y,z) 周围(x0,y0,z0),如果上述不等式成立,则画一个方块。
我从示例nt7s_sphere.py脚本中学到了这项技术。从标准头开始并初始化 Minecraft 连接代码:
从我的进口 *mc = 我的世界()然后就这样做:
半径 = 8playerPos = mc.player.getPos()对于范围内的 x(半径*-1,半径): 对于范围内的 y(半径*-1,半径): 对于范围内的 z(半径*-1,半径): 如果 x**2 + y**2 + z**2 < 半径**2: mc.setBlock(playerPos.x + x, playerPos.y + y + radius, playerPos.z - z - 10, block.GLASS)这会在玩家上方绘制一个指定半径的球体,并在 z 方向上稍微偏移。
我在我的donut.py脚本中使用了相同的技术,但公式更复杂(是的,这比基于海龟的方法更复杂):
对于范围内的 x(-Rr,R+r): 对于范围内的 y(-Rr,R+r): xy_dist = math.sqrt(x**2 + y**2) 如果(xy_dist > 0): ringx = x / xy_dist * R # 主环上最近的点 ringy = y / xy_dist * R ring_dist_sq = (x-ringx)**2 + (y-ringy)**2 对于范围内的 z(-Rr,R+r): 如果 (ring_dist_sq + z**2 <= r**2): mc.setBlock(mcx+x,mcy+z,mcz+y,mcblock,mcmeta)虽然不等式技术最适用于实心形状,但您可以通过两种方式将其用于空心形状。一种方法是使用两个不等式,例如在球体的情况下,一个确保我们在中心的外半径内,另一个确保我们不比内半径更近。另一种方法是在较大的固体物体内部绘制另一个用空气制成的较小尺寸的物体,就像在我的donut.py脚本中一样,我最初画了一个玻璃甜甜圈,然后用水替换了它的内部。
添加提示问问题评论下载
第 13 步:高级注释 2:绘制由参数化曲面定义的对象
还可以通过使用两个参数(比如 a 和 b)对其进行参数化来绘制曲面,然后循环遍历这些参数的范围,在需要的地方设置块。在我的克莱因瓶和莫比乌斯带脚本中,我有一个通用的 draw_surface() 方法可以做到这一点。例如,莫比乌斯带(参见我的mobius.py脚本)由三个公式定义:
x = (3 + a * cos(b/2)) * cos(b)y = a * sin(b/2)z = (3 + a * cos(b/2)) * sin(b)a 的范围从 -1 到 1,b 的范围从 0 到 2*pi(这又是为什么这会出现在 pi/e 竞赛中的另一个原因?)。您可以将 b 视为定义电路周围的角度,并将其从一个边缘移动到另一个边缘。
使用这样的脚本,您需要确保在 a 和 b 上的循环中,步长足够小,以至于表面没有间隙。除非那是你追求的效果。
有关详细信息和示例,请参阅mobius.py、klein.py和klein2.py。
添加提示问问题评论下载
第 14 步:高级注释 3:结
您可以在网上找到结的参数方程。这一次,我们要做的事情与以前略有不同。之前,我们有循环直接驱动对 mc.setBlock() 的调用。但是在我们的曲面图中,例如克莱因瓶,同一个块通常会被绘制多次,这是缓慢且低效的。更好的方法是跟踪已绘制的确切块集,以避免重做相同的事情。
让我通过一个这样的例子(在knot.py中)来画一个结。从标准标题开始,例如:
从我的进口 *我们现在需要生成我们的结。
我使用了此处 的五叶草配方。这需要将参数 t 从 0 循环到 2*pi,步长足够小以确保我们没有间隙。我用了 10000 步。由于这是在内存中完成的,而且计算机速度很快,而且重叠的方块只会发送一次到 Minecraft,所以做更多的步骤比考虑多少就足够更容易。字典中的坐标是整数很重要,这样我们就可以知道正在绘制同一个块(位于 (1.1,1.2,1.4) 的块和位于 (1,1,1) 的块是同一件事在我的世界中)。
我们首先初始化并设置结相对于玩家的位置。请注意,玩家位置不必是整数(您可能不会与方块完全对齐)并且应该变成整数。
mc = 我的世界()playerPos = mc.player.getPos()规模 = 12x0 = int(playerPos.x)y0 = int(playerPos.y + 5*scale)z0 = int(playerPos.z)现在我们创建一个名为done 的空集来存储我们已经绘制的坐标:
完成=设置()我们绘制集合:
t = 0当 t < 2*pi 时: x = x0+int( scale * cos(2*t) * (3 + cos(5*t)) ) y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) ) z = z0+int( 比例尺 * sin(5*t) ) 如果 (x,y,z) 未完成: mc.setBlock(x,y,z,block.GOLD_BLOCK) done.add((x,y,z)) t += 2*圆周率 / 10000这只会绘制尚未绘制的数据。请注意,我们需要使用 int() 函数对 x、y 和 z 坐标进行四舍五入。这就是重叠去除背后的魔力:当舍入坐标相同时,只绘制一个块。(注意: done.add((x,y,z))行中的双括号是因为我们要添加到集合中的是坐标三元组(x,y,z)。)
上面的代码在knot.py中。
如果绳子粗一些,结会更好看。有很多方法可以做到这一点。一种低效的方法,但很容易,因为现在的计算机速度很快,就是在每个像素处绘制一个小球而不是一个点。为此,首先我创建了一个小实用函数来绘制一个球,同时检查已完成的集合以确保没有重复的块:
def 球(x0,y0,z0,r,块,完成): 对于范围内的 x(-r,r): 对于范围内的 y(-r,r): 对于范围内的 z(-r,r): 如果(x**2 + y**2 + z**2 <= r**2): 如果没有 (x0+x,y0+y,z0+z) 完成: mc.setBlock(x0+x,y0+y,z0+z, 方块) done.add((x0+x,y0+y,z0+z))这使用不等式方法在 (x0,y0,z0) 处填充一个半径为 r 的球。
然后只需修改我们的打结while循环来制作一个球而不是一个点:
规模 = 10x0 = int(playerPos.x)y0 = int(playerPos.y + 5*scale)z0 = int(playerPos.z)完成=设置()t = 0当 t < 2*pi 时: x = x0+int( scale * cos(2*t) * (3 + cos(5*t)) ) y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) ) z = z0+int( 比例尺 * sin(5*t) ) 球(x,y,z,4,块。GOLD_BLOCK,完成) t += 2*圆周率 / 10000结果在示例脚本中的knot2.py中。
其他样本结位于trefoil.py、trefoil2.py和borromean.py中。如果您使用多种材质绘制,您可以使用字典代替一组,或者只是按顺序浏览不同的材质并在每种材质之前清除该组(这就是我在 trefoil2.py 和 borromean.py 中所做的)。
添加提示问问题评论下载
第 15 步:高级笔记 4:用你的大脑飞行
首先导入相关包并初始化 Minecraft:
从我的进口 *从 NeuroPy.NeuroPy 导入 NeuroPymc = 我的世界()然后连接到 EEG 耳机。我被黑的 Mindflex EEG 玩具作为 COM11 连接到我的 Windows 笔记本电脑,工作波特率超过 57600。它还需要一个特殊的初始化字符串发送给它以将其切换到 57600 波特(和原始模式)。这是通过以下方式完成的:
eeg = NeuroPy("COM11",57600,真)如果您有官方的 Mindwave Mobile(或者正在使用 Mindflex 但波特率保持在 9600),那么您可以省略“,True”部分。
现在我们设置一个简单的回调例程,当来自 eeg 的“冥想”值(范围从 0 到 100)超过 60 时,它将使您向上移动(这需要创意模式),并在低于 40 时向下移动:
向上 = 60向下 = 40定义回调(一): mc.postToChat(一) 如果 > 向上: pos = mc.player.getPos() pos.y = pos.y + 1 如果 mc.getBlock(pos.x,pos.y,pos.z) == block.AIR.id: mc.player.setPos(位置) elif a < 向下: pos = mc.player.getPos() pos.y = pos.y - 1 如果 mc.getBlock(pos.x,pos.y,pos.z) == block.AIR.id: mc.player.setPos(位置)eeg.setCallBack("冥想", 回调)为了更好地衡量,我将冥想值发布到聊天室。现在,我们需要做的就是启动 EEG 并通知用户:
mc.postToChat("连接到 EEG")eeg.start()mc.postToChat("要飞起来,要沉思")最后,我们需要通过启动无限循环休眠来防止脚本退出:而真实的: 时间.睡眠(10)(我的neurosky.py脚本让你选择是使用耳机中的“冥想”还是“注意力”值来工作,这让你稍微有点花哨。默认情况下它会注意力,但 /py neurosky m将在冥想模式下启动它。)
然后打开耳机,使用/py scriptname启动脚本。要停止脚本,请再次执行/py。
添加提示问问题评论下载
第 16 步:可选:使用 Python 和 Minecraft 的 Visual Studio:入门
一个非常有用的东西是 Visual Studio 的代码完成将帮助您使用 Minecraft python api。例如,当您键入“块”时。它将弹出所有块类型(AIR、BED等)的列表。
确保您已经安装了 Python、mod 和示例脚本。
3. 启动视觉工作室。
4. 单击“打开项目”,搜索示例脚本文件夹(带有 Raspberry Jam Mod 的%appdata%\.minecraft\mcpipy)并加载mcpipy.sln解决方案。
5. 在右侧的 Solution Explorer 窗口中,您可以选择一个现有脚本进行修改,例如knot2.py (或者您可以通过单击Solution Explorer 中的粗体mcpipy并从主菜单中选择“创建一个新脚本”项目”,“添加新项目”,然后选择“Python”和“空模块”)。
现在您可以根据自己的喜好编辑脚本。
添加提示问问题评论下载
第 17 步:可选:带有 Python 和 Minecraft 的 Visual Studio:运行和调试
因为我们将所有脚本设置为一个项目的一部分,所以要运行或调试脚本,您需要告诉 Visual Studio 您要运行哪个脚本。右键单击解决方案资源管理器窗口中的脚本(如果您丢失了解决方案资源管理器,请转到“Windows”菜单并选择“重置窗口布局”)和“设置为启动文件”。
您还需要在打开世界的情况下运行 Minecraft,否则您的脚本将无法连接到 Minecraft。
启动文件设置好后,下拉“Debug”,选择“Start debugging”(或直接按F5)或“Start without debugging”(ctrl-F5)即可运行。如果您选择“开始调试”,脚本运行速度会慢得多,但您将拥有有用的调试功能,例如随时暂停脚本的能力,逐步执行它(有有用的按钮在工具栏),并在运行时检查变量(请参阅“Autos”和“Locals”框)。
您还可以在调试模式下运行到脚本中的特定行,方法是右键单击该行并选择“运行到光标”。如果您知道脚本中该行周围有问题,并且您想查看此时的变量,这将很方便。例如,如果您将knot2.py脚本运行到调用draw_data()的行附近,您可以看到存储要绘制的块列表的结字典的内容。
添加提示问问题评论下载
第 18 步:其他资源
上图中的实时工作模拟时钟来自其中一个 stuffaboutcode 脚本(位于我的一个甜甜圈上方):/py stuffaboutcode_clock
O'Hanlon 做的一件相当酷的事情是编写了一个 python 脚本来将
Wavefront mesh.obj 文件转换为 Minecraft。我也将其改编为转换 3DS、PLY 和二进制 STL 文件。例如,您可以使用/py render shuttle绘制航天飞机(在 mcpipy/models 目录中有描述块选择的 .txt 文件;网格将自动下载)。
来自群组:
学谷组
相关帖子聚合推荐
1 Minecraft 的 Python 编码--国外文章搬迁
这个 Instructable 展示了如何安装和使用我编写的 mod,它可以让您使用 python 脚本控制 Minecraft。我将专注于 Windows,但 OS X 和 Linux 应该也能正常工作。(如果你想要比 Python 更简单的东西,这里是这个项目的 Scratch 版本。)Python 脚本可以生成整洁的现实世界,网络上有很多示例。只需几条线,您就可以绘制一个 ...
2 python玩我的世界minecraft(重新备份)
9 更多图片
由arpruss跟随
更多作者:
这个 Instructable 展示了如何安装和使用我编写的一个 mod,它可以让你用 python 脚本控制 Minecraft。我将重点介绍 Windows,尽管 OS X 和 Linux 应该也能正常工作。(如果你想要比 python 更简单的东西,这里是这个项目的 Scratch 版本。)Python 脚本可以在现实世界 ... ...
3 使用 Scratch 在 Minecraft 中编码
由arpruss跟随
更多作者:
几年前,我编写了 RaspberryJamMod,这是一个专为用 Python 编写 Minecraft 程序而设计的模组。我现在写了一个基于浏览器的 Scratch 3.0 扩展,它与 RaspberryJamMod 交互,让你(或你的孩子或学生)制作在 Minecraft 中运行的基于块的程序,包括海龟图形。这些说明将主要 ... ...
4 用 Python 来玩 Minecraft
让我们写几段程序来运行一下,看一看这个 API 究竟能实现哪些功能?首先,导入 Minecraft 的 API 并创建相应的对象:from mcpi.minecraft import Minecraftmc = Minecraft.create()
这里,我们得到了一个 mc 对象, 任何关于玩家和建筑物的编程都是基于这个对象来进行的。游戏的世界里,玩家人物、建筑物都有其相应的坐标。 ...
楼主热帖