本帖最后由 wangtianen 于 2016-9-14 23:09 编辑
畅游Minecraft Pi 的世界!
启动Minecraft

使用Python编程界面复制代码
获取你的位置复制代码复制代码
复制代码复制代码
复制代码复制代码
方块名称常量复制代码复制代码
方块作为变量
特殊的方块
放置多个方块复制代码
在你走路的时候(自动)放置方块复制代码
复制代码
复制代码复制代码
与方块玩耍
有趣的流动岩浆复制代码
接下来去哪里?
畅游Minecraft Pi 的世界!
Minecraft是一个流行的开放式沙盒建筑类的游戏。在Raspberry Pi上Minecraft有一个免费的版本;当然,这个版本也有一个可供编程的平台。这意味着你能用Python语言来书写命令和代码,以实现在游戏中建筑的自动化。在这个平台上,学习Python语言真的是再好不过的了~

启动Minecraft
为了让Minecraft启动,请在菜单中运行它,或者在TX终端输入minecraft-pi并回车。

当Minecraft Pi 启动完成后,单击 Start Game ,之后单击 Create new 。你将会注意到游戏画面相对于窗口而言会有轻微的偏移。这意味着如果你想拖动窗口的话就必须拖动在Minecraft游戏画面后的标题栏。

你现在已经进入游戏了!到处走走,破坏以及创造点什么东西!
使用鼠标来环视四周,以及使用下面的按键操作:
按键 | 动作 |
W | 前 |
A | 后 |
S | 左 |
D | 右 |
E | 背包 |
空格 | 跳跃 |
双击空格 | 飞翔/掉落 |
ESC | 暂停 |
Tab | 释放鼠标(可以让鼠标移到游戏窗口之外) |
你可以用鼠标滚轮在物品栏中选择物品(也可以用键盘上的数字键),或者按E键打开背包来选择物品。

你也可以双击空格键在空中飞翔。当你松开空格键时你可以停留在空中,而在此时双击空格键,你会落回地面。

当你手中拿着剑时,你可以单击前方的方块来破坏(或挖掘)它们。当你手中拿着方块时,你可以对着前面的空地单击右键来放置它们,或者单击来破坏方块。
使用Python编程界面
在Minecraft运行且世界被生成时,可以按Tab键来释放鼠标,以进行游戏外的操作。在菜单里打开Python 3 并将窗口拖动至与Minecraft窗口并排的位置。
你不仅可以直接向Python窗口输入命令,而且还可以创建一个文件,以便多次运行。
如果你想创建文件,请转至File > New window 和 File > Save。你应该将这个文件存储在Home(应该存放至Home/pi 文件夹——译者注)文件夹或一个专门存放工程的文件夹。
通过载入Minecraft的库,你可以建立程序与Minecraft游戏的连接,下面的代码在连接游戏的同时并且在屏幕上输出“Hello world”信息:
- from mcpi.minecraft import Minecraft
如果你直接在Python窗口输入命令行,可以直接在每行的最后回车。如果你保存为文件,先Ctrl+S 保存然后按F5运行。当你的代码运行时,你可以看到你的信息在游戏的界面中显示。

如果你想获取你的位置,输入下面的代码:
- pos = mc.player.getPos()
pos这个变量现在包含了你的位置信息;x轴、y轴、z轴的数据分别储存在pos.x、pos.y、pos.z里。
或者,还有一种很好的方法,就是用分离的变量来获取坐标。下面的代码演示了Python的拆分变量的一种方式:
- x, y, z = mc.player.getPos()
现在x,y,z包含了你所处位置的坐标。x和z是你行走的方向(即前/后和左/右),y是你的上/下位置。
小结:getPos()这个函数的功能是返回玩家当前的位置,如果你进行移动的话,你就被迫再次执行函数,或者使用已经被存储的位置(数据)。
传送当你获得你的正确的位置时,你可以输入一个具体的位置传送。
- x, y, z = mc.player.getPos()
- mc.player.setPos(x, y+100, z)
这将会使你的操控的玩家上升100格。这意味着你将被传送到半空中,之后会掉回到你原来的地方。(实际上,当你的头上存在方块时,你不可能回到原来的地方。——译者注)
试试传送到别的地方!
放置方块在一个坐标点上,你可以用mc.setBlock()函数来放置单个方块:
- x, y, z = mc.player.getPos()
- mc.setBlock(x+1, y, z, 1)
现在一个石头方块应该在你的旁边出现了。如果它没有立刻在你的面前出现,那么它可能会在你的左右两侧或者在你的后面。回到Minecraft的游戏窗口,然后你用鼠标转动视角,直到看见一个灰色的方块在你的正前方。

提交到set block函数(应该是setBlock函数,但是原文就是如此。——译者注)的参数为x, y, z和id。x, y, z代表的是地图上的一个坐标(我们刚才指定的那个方块的位置就是玩家的位置x坐标加一格的地方),而id 则是代表我们想放置方块的种类。代码中的1代表的是石头。
你也可以试试其他的方块:
- 空气:0
- 草方块:2
- 泥土:3
现在保持观察刚才的石头方块,尝试换一种方块:
- mc.setBlock(x+1, y, z, 2)
你应该能看见眼前的石头方块变成了泥土方块!

方块名称常量
如果你知道方块的名称,你就可以使用内置的方块名称常量。你仅需要在开头添加一行额外的import的命令行。
- from mcpi import block
现在你可以写入下面的代码行来放置一个方块:复制代码
- mc.setBlock(x+3, y, z, block.STONE.id)
方块的id很容易去推测,它们的名字的字母全部大写,但是这里是一些不能通过这种方式就能找到的方块:
- WOOD_PLANKS
- WATER_STATIONARY
- GOLD_ORE
- GOLD_BLOCK
- DIAMOND_BLOCK
- NETHER_REACTOR_CORE
方块作为变量
如果你知道方块的id,你就可以让这个id设置成变量。你可以使用声明它的名称或者它的(整数的)id。复制代码
- dirt = 3
- mc.setBlock(x, y, z, dirt)
或者:复制代码
- dirt = block.DIRT.id
- mc.setBlock(x, y, z, dirt)
特殊的方块
有一些方块有额外的数据值,就像羊毛方块,你能够通过修改额外的设置来指定羊毛的颜色。为了设置它你就得使用可选的第四个参数:复制代码
- wool = 35
- mc.setBlock(x, y, z, wool, 1)
这里,第四个参数1设置了羊毛的颜色为橙色。没有第四个参数,函数会将第四个参数设置为0,即为白色的羊毛。还有更多的颜色可以选择:复制代码
- 2: Magenta #品红
- 3: Light Blue #亮蓝
- 4: Yellow #黄色
试试更多的数字,看看方块的变化!
其他的还有额外的数据时的方块还有:木头(17):橡木、云杉木、桦树,等等;草(31):灌木、青草、蕨类植物;火把(50):指向东、西、北、南;以及等等。查阅 API参考资料来获取更多的信息。
放置多个方块
除了用setBlock放置单个方块,你还可以用setBlocks函数来用方块填充一大块立体区域:
- stone = 1
- x, y, z = mc.player.getPos()
- mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, stone)
上面的代码执行完成后会生成一个10 x 10 x 10实心的石头大的立方体。

你也可以用setBlocks函数创建更大体积的立方体,但这可能会花费更长的时间去生成!
在你走路的时候(自动)放置方块
现在你知道怎样去放置方块了,那就让我们通过行走以便移动自己的位置来放置方块。
下面的代码将会在你行走时在你的后面生成花朵:
- from mcpi.minecraft import Minecraftfrom time import sleep
- mc = Minecraft.create()
- flower = 38
- while True:
- x, y, z = mc.player.getPos()
- mc.setBlock(x, y, z, flower)
- sleep(0.1)
现在,向前走一会儿,然后再转过身子,看一下在你身后你已经生成的花朵。

当我们用while True这个循环时,这个循环将会永远执行下去。想让它停止的话,在Python窗口中按Ctrl + C即可。
试试在天上飞一会儿,然后看你留在天空中的花朵:

如果我们只想让玩家走在草地上时才能生成花朵呢?我们可以使用getBlock函数来获取你脚底下的方块的种类:
- x, y, z = mc.player.getPos() # 玩家的位置 (x, y, z)
- this_block = mc.getBlock(x, y, z) # 方块 ID
- print(this_block)
上面的代码将会返回你所在的方块的种类(返回0,空气方块)。而我们想获取的是玩家所站在的方块的种类。为了达到这个目的,我们可以将y的值减1,然后再使用getBlock()函数来判断我们站在那种方块上:复制代码
- x, y, z = mc.player.getPos() # 玩家的位置 (x, y, z)
- block_beneath = mc.getBlock(x, y-1, z) # 方块 ID
- print(block_beneath)
上面的代码将会返回你所站在的方块的种类。
那么,为了测试一下效果,执行一个loop循环来输出你当前所站在的方块的ID:复制代码
- while True:
- x, y, z = mc.player.getPos()
- block_beneath = mc.getBlock(x, y-1, z)
- print(block_beneath)

我们可以用if语句来判断我们是否该放置花:
- grass = 2
- flower = 38
- while True:
- x, y, z = mc.player.getPos() # player position (x, y, z) block_beneath = mc.getBlock(x, y-1, z) # block ID
- if block_beneath == grass:
- mc.setBlock(x, y, z, flower)
- sleep(0.1)
下一步,我们应该为程序添砖加瓦?,假如你将要站在的地方上不是草方块的话,就让它变成草方块吧:
- if block_beneath == grass:
- mc.setBlock(x, y, z, flower)else:
- mc.setBlock(x, y-1, z, grass)
现在,我们可以向前走,假如我们走在草方块上,我们将会在这个草地上留下一朵花,如果下一个方块不是草方块的话,它将变成草方块。当我们转身并向后走,我们将会(在经过的草方块上)留下一朵花。

还有一种有意思的方块,那就是TNT!放置一个普通的TNT可以执行下面的语句:复制代码
- tnt = 46
- mc.setBlock(x, y, z, tnt)

但是,这个TNT方块实在是太无聊了,试试将 data 变为1:复制代码
- tnt = 46
- mc.setBlock(x, y, z, tnt, 1)
现在使用你的先然后单击TNT方块,它将会被激活然后将会在大约几秒钟之内爆炸!
下面尝试制作一个由TNT组成的立方体!复制代码
- tnt = 46
- mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, tnt, 1)

现在你会看到一个由TNT方块充斥的巨大立方体。走过去并激活其中的一个TNT然后跑到一边去看TNT的表演!你的树莓派将会非常缓慢地绘图,因为太多的事件在一瞬间改变(很多的TNT在同一时间爆炸)。

有一种方块,它有很多的乐趣去让你玩耍,它就是流动的岩浆。复制代码
- from mcpi.minecraft import Minecraft
- mc = Minecraft.create()
- x, y, z = mc.player.getPos()
- lava = 10
- mc.setBlock(x+3, y+3, z, lava)
找出你刚才放置的岩浆方块,然后你会看到岩浆从那个方块流向周围的地面。
还有一件很酷的,与岩浆有关的事情,就是当岩浆冷却下来时会变成石头(应该是原石。——译者注)。
在这个世界中移动到别的地方然后试试下面的语句:
- from mcpi.minecraft import Minecraftfrom time import sleep
- mc = Minecraft.create()
- x, y, z = mc.player.getPos()
- lava = 10
- water = 8
- air = 0
- mc.setBlock(x+3, y+3, z, lava)
- sleep(20)
- mc.setBlock(x+3,y+5, z, water)
- sleep(4)
- mc.setBlock(x+3, y+5, z, air)
你可以调整sleep 的参数来调整岩浆流出的多与少。

你现在可以做很多事情了,你现在知道了该怎样在Minecraft Pi的世界中冒险,以及如何使用Python编程界面。
局域网游戏如果多台树莓派连接在同一个局域网,它们就可以加入同一个Minecraft世界而且一起愉快地玩耍。这些玩家可以在Minecraft世界里互相看到对方。
API参考资料stuffaboutcode.com - 这里有非常多的函数的资料,还有一个很全面的方块ID列表。
制作一个游戏试试另外的教程并制作一个打地鼠的游戏:Minecraft之打方块。
后记&译者的一些废话
本帖最后由 XIAOMM 于 2016-8-30 21:56 编辑
火钳刘明!很详细的树莓派教程啊!
(树莓派的水居然比PC,PE和主机的都好看!
(人气什么的明天补……
火钳刘明!很详细的树莓派教程啊!
(树莓派的水居然比PC,PE和主机的都好看!
(人气什么的明天补……
XIAOMM 发表于 2016-8-30 21:55
火钳刘明!很详细的树莓派教程啊!
(树莓派的水居然比PC,PE和主机的都好看!
(人气什么的明天补……
这仅仅是MCPI 的入门级教程……
Magpi上个月刚出了一本关于MCPI的教程,有80多页……本来想翻译那本的,但想了一下,工作量太大了,还是等到高考完后再抽空翻译吧2333
今天把主楼更完了,明天补充一下与此相关的内容。
作为第一次发表翻译作品的人,我可以肯定这篇文章里有翻译不当的地方,望大家多多指出,互相提高:-P
看起来好玩的样子
感谢lz分享!
感谢兰州烧饼分享
好厉害 学道了