设为首页收藏官网网盘立人百科立人课堂 今天是: 2021-09-27    "世界旅游日"  投稿

立人创客

 找回密码
 立即注册
成都市金牛实验中学校
立人创客 门户 查看主题

Minecraft 的 Python 编码--国外文章搬迁

发布者: 信息中心 | 发布时间: 2021-7-26 10:47| 查看数: 298| 评论数: 1|帖子模式

<

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0.jpg
这个 Instructable 展示了如何安装和使用我编写的 mod,它可以让您使用 python 脚本控制 Minecraft。我将专注于 Windows,但 OS X 和 Linux 应该也能正常工作。(如果你想要比 Python 更简单的东西,这里是这个项目的 Scratch 版本。)
Python 脚本可以生成整洁的现实世界,网络上有很多示例。只需几条线,您就可以绘制一个巨大的玻璃球体,再多做一点工作,就可以在天空中制作一个巨大的谢尔宾斯基三角形,甚至可以像航天飞机一样导入 obj 文件。我自己编写了有趣的脚本来绘制一个装满水的玻璃甜甜圈和一个巨大的克莱因瓶将所有东西都变成 TNT,并使用 MindFlex EEG 玩具用大脑控制 Minecraft。有一整本书介绍了使用 Python 脚本为 Minecraft 进行编程,您甚至可以制作简单的基于 Minecraft 的游戏。我还将展示如何在 Minecraft 中绘制简单(有时更复杂)的基于海龟的绘图,同时您可以像海龟一样骑在绘图上。
一段时间以来,您可以在 Raspberry Pi 上为 Minecraft 编写 Python 脚本。我希望我的孩子能够做到这一点,但我们没有 Pi,而且使用完整的桌面 Minecraft 做到这一点会很好。您可以使用Raspberry Juice 插件运行您自己的服务器,该插件使大多数 Python 脚本都能正常工作。但并不是每个人都想安装和配置服务器。
因此,我为 Minecraft 1.8编写了Raspberry Jam Mod(现在也移植到 1.8.8、1.8.9 和 1.9),它模拟了大多数 Raspberry Pi Minecraft 协议(与 Raspberry Juice 插件提供的大致相同)并让 Raspberry Pi python 脚本与完整的桌面 Minecraft 一起运行。(后来我发现有人在几周前为 Minecraft 1.7.10编写了mcpiapi mod。)我最初为 Python 2.7 编写了这个 Instructable,但我认为我的大多数示例都适用于 3.x。
我假设您具有在 Windows(或您选择的操作系统)上创建文件夹和下载、解压缩和复制文件的基本能力。
您可以使用文本编辑器、Python 附带的 IDLE 环境或 Windows 上的 Visual Studio Python 工具为 Minecraft 创建 Python 脚本。最后一个在某些方面实际上是最好的,所以我将有一些关于如何做到这一点的可选步骤。
今年夏天,我计划使用 Minecraft、Raspberry Jam Mod、Python 和 Visual Studio 向有天赋的中学生教授编程和基本 3D 几何。
如果你想在 Android 上使用 Minecraft Pocket Edition 来做到这一点,我也有一个Instructable

添加提示问问题评论下载

第 1 步:为 Minecraft 安装 Forge
Forge 管理 Minecraft 模组,是 Raspberry Jam Mod 所需要的。
我假设你已经安装了 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 安装程序 [自动安装]
如果你有 Windows,一旦你有了 Forge,你就可以使用Windows 安装程序安装所有东西。这将安装 RaspberryJamMod、Python 解释器、Python 的 IDLE 和示例脚本。如果您没有 Windows,或者想要更多控制,请查看接下来的两个步骤(但如果您没有 Windows,则必须调整它们)。

添加提示问问题评论下载

第三步:安装Python【手动安装】
您需要决定是否需要 Python 2.7 或 Python 3.x。《我的世界一书使用的是 2.7,网上流传的大部分脚本都是 2.7 的,但我已经转换了很多 3.x 的脚本。
1. 从这里下载您选择的 Python 安装。
2. 运行安装程序。
3. 单击自定义 Python 对话框,确保向下滚动到“将 python.exe 添加到路径”,单击它并选择“将安装在本地硬盘上”。如果您不将 Python 添加到路径中,您将无法从 Minecraft 中使用/python启动脚本。

添加提示问问题评论下载

第 4 步:安装 Mod 和脚本
1.在您的 Minecraft 文件夹中创建一个mods文件夹。(为此,请按Windows-R,键入% appdata%\.minecraft,然后按enter。您将看到 Minecraft 文件夹中的所有内容。如果您已经有一个mods子文件夹,则无需执行任何操作。否则,请执行一. 在 Windows 8 上,单击New folder,然后输入名称mods并按enter。)
2.从最新版本的 Raspberry Jam Mod下载mods.zip文件。将 zip 文件的内容(当前由多个名称如1.8和1.10.2的文件夹组成)放入您刚刚创建的mods文件夹中。
3. 从我的Raspberry Jam Mod github 版本下载包含示例 Python 脚本和 mcpi 库的最新 zip 文件。(这些脚本应该适用于 Python 2.7 和 3.x。)
4. 打开下载的 zip 文件(在 Chrome 中,通过在窗口底部单击它)。它有一个mcpipy文件夹。将mcpipy文件夹复制到您的 Minecraft 文件夹中。(为此,请在 zip 文件中的mcpipy文件夹上单击一次,然后按ctrl-c,然后按照步骤 1导航到%appdata%\.minecraft文件夹,然后按ctrl-v)。

添加提示问问题评论下载

第 5 步:测试模组
启动 Minecraft,确保您使用Forge配置文件。
创建一个新世界(使用 python 脚本太容易搞砸了)。我女儿建议我使用 Creative 和 Superflat。
在 Minecraft 中,输入/py donut并按回车键。
如果一切顺利,会在你周围画一个巨大的玻璃甜甜圈,然后里面装满水。
如果您收到类似Script not found错误的提示,这可能意味着您没有在%appdata%\.minecraft\mcpipy文件夹中安装示例脚本。
如果您收到“无法运行程序“python””错误,则您的系统路径中没有您的 python 目录。您可能希望手动将其添加到路径中,或者只是重新安装 python,按照我的 python 安装步骤的步骤 3 中的说明进行操作。
使用/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 = Minecraft()
然后,您可以发送“Hello world!” 给用户的消息:
mc.postToChat("世界你好!")
如果您想在播放器正下方创建一个钻石块,您还可以执行以下操作:
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)
技术说明:从from mine import *开始将很多东西(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)右(90)t.go(50)右(90)t.go(50)右(90)t.go(50)
您可以通过执行以下操作来制作 7 面星:
t.go(50)t.right(180.-180./7)
七次。或者循环一次:
对于范围内的 i (7):    t.go(50)    t.right(180.-180./7)
您可以使用penblock()更改材料。例如,金色的垂直星星:
t.penblock(block.GOLD_BLOCK)对于范围内的 i (7):    t.go(50)    t.right(180.-180./7)
您可以使用penwidth(x)更改笔宽。例如,这绘制了一个非常简单的玻璃甜甜圈(实际上是一个加厚的 90 边形,但谁能分辨出其中的区别?):
t.penblock(block.GLASS)半径 = 20周长 = 2 * 半径 * pit.penwidth(10)对于范围内的我(90):    t.go(周长/90)    t.left(360/90)
以下是所有可用的方法:
  • go(x):向前移动 x 个方块(如果笔未按下则绘制)
  • back(x):向后移动 x 块(如果笔已放下则绘制)
  • penup():暂停绘图恢复绘图
  • 左(角度):按角度(以度为单位)向左旋转
  • right(angle):按角度向右旋转(以度为单位)
  • up(angle):向上旋转角度(以度为单位);初学者不要混合左右旋转和上下旋转,否则可能会得到意想不到的结果(技术说明:与pitch(angle)相同)
  • down(angle):按角度向下旋转(以度为单位)(技术说明:与pitch(-angle)相同)
  • pendelay(x):海龟的每一次移动或旋转都延迟x秒;默认为 0.05;设置为零以获得更快的绘制(玩家仍然会随着绘制的每条线移动,但从头到尾瞬间移动)
  • 角度(x):将水平角度设置为 x(顺时针以度为单位;0 = 南,90 = 西,180 = 北,270 = 东);重置滚动角
  • verticalangle(x):将垂直角度设置为 x(以度为单位;向上为正;90 = 垂直向上;-90 = 垂直向下);重置滚动角
  • 角度(罗盘,垂直,滚动):设置罗盘,垂直和滚动角度;省略的参数被视为零
  • penblock(x):设置绘制材料到块x;有关预定义块的列表,请参阅mcpi/block.py
  • goto(x,y,z):将笔位置设置为(x,y,z);您还可以访问位置为t.position.x,t.position.y和t.position.z
  • follow():玩家跟随乌龟
  • nofollow():玩家不跟随乌龟
  • 龟(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()和端面() :启动和完成绘制填充凸多边形
  • push()和pop():保存和恢复绘图状态(标题、材料、面状态、厚度;但不是速度或海龟类型);对L 系统有用
  • gridalign() : 将当前位置和海龟方向与网格对齐(选择海龟当前方向的最佳近似值)
与我的 Raspberry Jam Mod 不同,mcpiapi mod 不支持设置玩家的方向。这意味着玩家将不会与海龟面对相同的方向。(乌龟脚本可能会出现其他问题。)
技术说明:如果您已经有一个 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() 方法将它绕垂直轴旋转,所以你会得到一个螺旋。
相反,我们需要做的是乌龟的偏航/俯仰/滚动旋转。看美国宇航局的图片(美国政府作品属于公共领域)解释三个角度是如何去的,想象一下飞机就是你的乌龟。(不幸的是,由于 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)  对于范围内的 i (4):    t.pitch(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(block.WOOD)t.verticalangle(90)树(6,20)
这个分形树看起来不太现实。我们应该让树干变粗,树枝越往外越细(比方说,厚度减半,直到达到一个方块为止),我们应该在外出时从WOOD切换到LEAVES方块。但最重要的是,真正的树木并不那么规则。我们需要一些随机性。最简单的随机性形式就是给每个分支一个失败的机会,比如 20% 的机会。我在我的Fantasytree.py 脚本中实现了所有这些. 对于由这样一段相对简单的代码生成的东西,生成的树看起来非常逼真。我如何实施它的一个有趣的副作用是有 20% 的机会什么也不会被绘制——即,树有可能无法生长,这也是现实的。每次运行脚本时,都会得到不同的结果。
海龟绘图类的另一个有用功能是不仅可以绘制线条,还可以绘制多边形表面。为此,只需执行t.startface(),绘制曲面,然后执行t.endface()。一旦您处于人脸模式,每次绘制一条线时,代码实际上会绘制一个三角形:一个顶点是调用t.startface()时海龟所在的点,而该线是对边。这绘制了一个倾斜 45 度的五边形:
t.roll(45)t.startface()对于范围内的 i (5):  t.go(20)  t.yaw(360/5)t.endface()

添加提示问问题评论下载

第 9 步:使用 Turtle 图形的 L 系统分形
画一个三角形。现在取三角形的每一行,并用一条带有三角形凸起的线替换它。重复。就像在动画图像(公共领域,基于Wikipedia)上一样,您会得到Koch 雪花
这可以通过一个超级简单的海龟图形程序来建模。想象一下,F 表示“向前绘制”,“+”和“-”分别逆时针和顺时针旋转 60 度。然后可以通过以下方式绘制初始三角形:
F++F++F
即,前进,右转 120 度,然后前进,右转 120 度,继续前进。
三角形凹凸线可以通过以下方式绘制:
F-F++FF
所以这里是我们如何生成雪花。我们取初始海龟程序F++F++F来画一个三角形。其中的每个F代表一条线。所以替换每个˚F由FF FF ++。如果我们继续前进,就会生成科赫雪花。
这是 L 系统的一个简单示例。L-system 背后的想法是我们从一串字符(在本例中为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 中不起作用。)
这本免费的 PDF 书中有很多非常好的信息。
我写了一个非常简单的lsystem.py模块。要实现雪花,请从样板开始:
导入系统从海龟进口 *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),  '-': lambda: 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)。龙曲线代码还给出了一个更复杂的前向函数示例——它不仅仅是一条线,而是绘制了一堵有开口的墙。
实际上,即使并非所有角度都是直角,调用gridalign()有时也是一个好主意。您可能会在大图像中遇到一些舍入问题,但它仍然可以看起来更好。请参阅空间填充曲线示例(以紫色彩色玻璃呈现!)。
L 系统不必是二维的。您可以包含进行偏航、俯仰和滚动旋转的符号。对于设计树,一个有用的技巧是使用堆栈命令:“[”将当前绘图状态保存到堆栈中,“]”将其恢复。这将使用乌龟模块的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后,我们回到之前的位置。如此重复,以致树枝上的叶子被三倍的树枝取代,依此类推。
更现实的树可能有更复杂的'['代码。它可以使后续的树枝更短更细,并在我们靠近叶子时改变它们的材料(然后在']'上恢复)。我在lsystem.py 中包含这样一个树作为演示代码,基于来自Geeky Blogger 的规则(有一些调整)。
你也可以做网格对齐的 3D 事情。例如,hilbert.py有一个 3D Hilbert 曲线。
最后,您可能希望在 L 系统规则中引入一些随机化。到目前为止,我们的规则是确定性的:给出一个替换符号的字符串,例如,'F': 'F-F++F-F'。但不是简单的替换字符串,我们可以给出一个 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时,块):绘制一个面与所述顶点VertexList时,从制成块材料
例如,您可以在重生点制作一个 0 级玻璃制成的倾斜 45 度的矩形:
d.face([(0,0,0),(0,10,10),(10,10,10),(10,0,0)])
为了好玩,我改编了 Simon Tatham 非常简洁的多面体生成代码,以使用 Minecraft 绘图类。他的代码从球体上的一些随机点开始,然后模拟它们相互排斥,直到它们稳定成通常规则的配置。然后他有两种用这些点制作多面体的巧妙方法,面法和顶点法。我把它放在polyhedron.py 中。此脚本采用命令行参数。例如,要绘制一个二十面体,使用 12 个点和顶点构造。直接来自 Minecraft:
/py 多面体 12 顶点
对于十二面体,将vertex更改为face。您还可以为大小添加另一个参数。多面体将由带有石头边缘的玻璃制成,并以玩家为中心。
技术说明:如果您已经有一个 Minecraft 对象mc,请使用d = Drawing(mc) 进行初始化。无论哪种情况,您都可以通过d.mc访问 Minecraft 对象。

添加提示问问题评论下载

第 11 步:可选:禁用在失去焦点时暂停
Minecraft 通常会暂停游戏并在您按 alt-tab 键退出游戏或以其他方式失去焦点时进入游戏菜单。如果您从 Minecraft 外部启动它们,这会使您更难看到您的 Python 脚本在做什么。为此,您可以编辑 Minecraft 目录(Windows 上的%appdata%\.minecraft)中的 options.txt 文件,更改
pauseOnLostFocus:true
线到
pauseOnLostFocus:false
然后保存,并重新启动 Minecraft。
这对于以交互方式运行 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 = Minecraft()
然后就这样做:
半径 = 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 + 半径, 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 # 主环上最近的点           环 = 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) 的块是同一个东西在 Minecraft 中)。
我们首先初始化并设置结相对于玩家的位置。请注意,玩家位置不必是整数(您可能不会与方块完全对齐),而应将其转换为整数。
mc = Minecraft()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( 比例 * cos(2*t) * (3 + cos(5*t)) )  y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) )  z = z0+int( scale * sin(5*t) )  如果 (x,y,z) 没有完成:     mc.setBlock(x,y,z,block.GOLD_BLOCK)     done.add((x,y,z))  t += 2*pi / 10000
这只会绘制尚未绘制的数据。请注意,我们需要使用 int() 函数对 x、y 和 z 坐标进行四舍五入。这就是去除重叠背后的魔法:当圆角坐标相同时,只绘制一个块。(注意:done.add((x,y,z))行中的双括号是因为我们添加到集合中的是坐标三元组(x,y,z)。)
上面的代码在knot.py 中。
如果绳子更粗,结会更好看。有很多方法可以做到这一点。一种低效但简单的方法,因为现在计算机速度很快,就是在每个像素上画一个小球而不是一个点。为此,首先我创建了一个小实用函数来绘制一个球,同时检查完成集以确保没有重复的块:
def ball(x0,y0,z0,r,block,done):  对于范围内的 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( 比例 * cos(2*t) * (3 + cos(5*t)) )  y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) )  z = z0+int( scale * sin(5*t) )  球(x,y,z,4,block.GOLD_BLOCK,done)  t += 2*pi / 10000
结果在示例脚本中的knot2.py中。
其他示例结在trefoil.py、trefoil2.py和borromean.py 中。如果您使用多种材料进行绘制,您可以使用字典代替集合,或者只是顺序浏览不同的材料并在每个材料之前清除集合(这就是我在trefoil2.py和borromean.py 中所做的)。

添加提示问问题评论下载

第 15 步:高级说明 4:用你的大脑飞翔
另一个 Instructable 中,我描述了如何破解 Mindflex EEG 玩具以通过蓝牙工作。使用 python 和NeuroPy 包的修改版本,您现在可以用大脑控制 Minecraft。以下是使用 Mindflex 或完整的 Mindwave Mobile 套装的方法。在我的示例脚本中,我在neurosky.py脚本中执行此操作。
首先导入相关包并初始化 Minecraft:
从我的进口 *从 NeuroPy.NeuroPy 导入 NeuroPymc = Minecraft()
然后连接到 EEG 耳机。我被黑的 Mindflex EEG 玩具以 COM11 的形式连接到我的 Windows 笔记本电脑,并且工作波特率超过 57600。它还需要一个特殊的初始化字符串发送给它,以将其切换到 57600 波特(和原始模式)。这是通过以下方式完成的:
eeg = NeuroPy("COM11",57600,True)
如果您有官方的 Mindwave Mobile(或正在使用 Mindflex 但将其保留为 9600 波特),那么您可以省略“,True”部分。
现在我们设置了一个简单的回调例程,当 eeg 的“冥想”值(范围从 0 到 100)高于 60 时,它将向上移动您(这需要创造模式),当它低于 40 时向下移动:
向上 = 60向下 = 40定义回调(a):    mc.postToChat(a)    如果 > 向上:       pos = mc.player.getPos()       pos.y = pos.y + 1       如果 mc.getBlock(pos.x,pos.y,pos.z) == block.AIR.id:          mc.player.setPos(pos)    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(pos)eeg.setCallBack("冥想", 回调)
为了更好的衡量,我发布了冥想值来聊天。现在,我们需要做的就是启动 EEG 并通知用户:
mc.postToChat("连接到脑电图")eeg.start()mc.postToChat("要飞起来,要沉思")最后,我们需要通过启动无限循环睡眠来防止脚本退出:为真:    时间.睡眠(10)
(我的Neurosky.py脚本稍微更有趣,让您选择是使用头显中的“冥想”还是“注意力”值。默认情况下它会注意,但/py neurosky m会在冥想模式下启动它。)
然后打开耳机,用/py scriptname启动脚本。要停止脚本,请再次执行/py。

添加提示问问题评论下载

第 16 步:可选:使用 Python 和 Minecraft 的 Visual Studio:入门
如果您在 Windows 上运行,Visual Studio(我推荐免费的Visual Studio Express for Desktop 2015)与 Python 工具一起是为 Minecraft 开发 Python 代码的好方法。(但是如果你使用我的 Windows 安装程序来安装 mod,你需要一个完整的官方 Python 安装而不是我捆绑的,否则你需要使用 PTVS 来设置一个指向 %appdata%\.minecraft 的自定义环境\pythonX。)
一个非常有用的事情是 Visual Studio 的代码完成将帮助您使用 Minecraft python api。例如,当您键入“阻止”时。它将弹出所有块类型(AIR、BED等)的列表。
确保您已安装 Python、mod 和示例脚本。
1. 下载并安装Visual Studio Community Edition 2013。
2. 下载并安装Python Tools for Visual Studio (PTVS 2.1 VS 2013.msi)。
3. 启动 Visual Studio。
4. 单击“打开项目”,搜索您的示例脚本文件夹(%appdata%\.minecraft\mcpipy with Raspberry Jam Mod)并加载mcpipy.sln解决方案。
5.在右侧的解决方案资源管理器窗口中,您可以选择现有脚本进行修改,例如knot2.py(或者您可以通过单击解决方案资源管理器中粗体的mcpipy并从主菜单中选择“ Project”、“Add new item”,然后选择“Python”和“Empty module”)。
现在,您可以根据自己的喜好编辑脚本。

添加提示问问题评论下载

第 17 步:可选:使用 Python 和 Minecraft 的 Visual Studio:运行和调试
因为我们将所有脚本设置为一个项目的一部分,以运行或调试脚本,所以您需要告诉 Visual Studio 哪个脚本是您要运行的脚本。右键单击解决方案资源管理器窗口中的脚本(如果您丢失了解决方案资源管理器,请转到“Windows”菜单并选择“重置窗口布局”)和“设置为启动文件”。
您还希望在打开世界的情况下运行 Minecraft,否则您的脚本将无法连接到 Minecraft。
设置启动文件后,可以通过下拉“Debug”,选择“Start debugging”(或直接按F5)或“Start without debugging”(ctrl-F5)来运行。如果您选择“开始调试”,脚本将运行得更慢,但您将拥有有用的调试功能,例如可以随时暂停脚本,逐步执行(有一些有用的按钮)工具栏),并在运行时检查变量(请参阅“自动”和“本地”框)。
您还可以在调试模式下运行到脚本中的特定行,方法是右键单击该行并选择“运行到光标”。如果您知道该行周围的脚本有问题,并且您想查看此时的变量,这将非常方便。例如,如果您在调用draw_data()的行附近运行knot2.py脚本,您可以看到存储要绘制的块列表的knot字典的内容。

添加提示问问题评论下载

第 18 步:其他资源
用 Python 编写 Minecraft 的最佳资源是Martin O'Hanlon 所著的Adventures in Minecraft一书。
O'Hanlon 在stuffaboutcode.com站点上也有很多很好的信息。特别是,他在这里有一个 API 参考。Raspberry Jam Mod(和 mcpiapi mod)几乎支持 Raspberry Juice 服务器插件所做的一切。
上图中的实时工作模拟时钟来自一个 stuffaboutcode 脚本(位于我的一个甜甜圈上方):/py stuffaboutcode_clock
O'Hanlon 做的一件很酷的事情是编写一个 python 脚本将Wavefront mesh.obj文件转换为 Minecraft。我已经将其调整为转换 3DS、PLY 和二进制 STL 文件。例如,您可以使用/py 渲染穿梭机绘制航天飞机(在 mcpipy/models 目录中有描述块选择的 .txt 文件;网格将自动下载)。

来自群组: 学谷组
展开
Loading...
快速回复 返回顶部 返回列表