翻译:树莓派版Minecraft入门大揭秘

正版我的世界一是要收费,二是游戏性过强,编写Mod门槛高,树莓派版Minecraft免费,且能够很容易的与python交互,是非常好的学习工具,学生对Minecraft有非同一般的热情,结合python,让学生体会码创一切的魅力。本文翻译自树莓派官方网站,大家将就看(已经被吐槽翻译的像人机了)。

封面

树莓派官方的教程,格式比较统一,适合作为学习资料,是写作教程类资料很好的参考。

最终成果

你将探索树莓派定制版本Minecraft中的虚拟世界。将会学习如何用控制玩家,手动搭建积木块,用python控制游戏中的一切。

学习目标

使用树莓派学习本资料你将会掌握:

  • 如何启动Minecraft Pi并创建一个新的世界
  • 如何用IDLE Python编程环境连接Minecraft Pi
  • 如何用Minecraft Python API向聊天窗口发送消息,确定玩家坐标,实现传送并搭建建筑
  • 如何利用变量保存不同种类方块的的ID
  • 尝试使用有特殊属性的不同类型方块

本资料涵盖了树莓派数字创客课程中以下课程涉及到的要求:

树莓派有一套自己的数字创客课程标准,这套课程标准跟CAD公司的TinkerCAD中体现的思想有异曲同工之处,也可以说TinkerCAD为树莓派课程的落地提供了更好的支持。

image.png

需求清单

软件

软件安装

自2014年9月开始,树莓派系统Raspbian默认安装Minecraft。双击快捷方式就可以启动。mimmi


image.png

如果你用的是老版本的树莓派系统,打开命令行窗口,输入以下命令:

sudo apt-get update
sudo apt-get install minecraft-pi

命令执行完毕后,就成功安装了Minecraft Pi和相关的Python库会。

我记得以前树莓派系统自带了一些游戏,五子棋、记忆游戏啥的,我现在的树莓派用NOOBS刷的系统,反而没有了。

测试Minecraft是否安装成功

双击桌面Minecraft的图表或者在命令行窗口输入minecraft-pi均可启动我的世界

image.png

注意

image.png

如果你安装Minecraft Pi得到了以上提示信息,并且菜单或者桌面没有Minecraft图表,那么尝试在命令行输入以下指令就可以启动Minecraft:

minecraft-pi

命令行可能会持续输出一堆很奇怪的信息,不用理会。

Minecraft加载完毕后,单击Start Game开始游戏按钮。游戏窗口可能会轻微有一点便宜。如果你想拖动窗口,你拖动游戏窗口后面的标题栏。

image.png

看,你现在就在Minecraft游戏中了。

测试Python

启动并运行树莓派,创建一个世界,按Tab,树莓派失去焦点,从游戏中释放鼠标,打开Python3 IDLE,单击开始按钮,然后选择编程,Python 3(IDLE),然后让IDLE窗口和Minecraft并排。

你也可以直接在python交互式命令行中输入指令,或者新建一个python文件,方便以后直接使用文件控制Minecraft。

如果你想新建文件,单击File > New wind或者File > Save。你可以把python 文件保存在home文件夹或者新建一个文件夹。

首先,我们需要导入Minecraft库,然后建立一个代码文件和游戏的连接,通过向游戏窗口发送Hello world来测试Minecraft库。

from mcpi import minecraft

mc = minecraft.Minecraft.create()

mc.postToChat("Hello world")

如果你在python交互式命令行输入上述命令,每条命令后面要敲回车。如果你新建了一个python文件,按Ctrl + S快捷键保存文件,按F5运行文件。代码运行后,你会再游戏的界面看到消息。

image.png

如果Minecraft界面出现Hello world,你就可以继续进行下一步了。

开始探索Minecraft Pi

Minecraft是一个非常流行的开放世界的沙盒游戏,Minecraft为树莓派开发了免费版本,同时提供了专门的编程接口。也就是说,你可以用python编写命令和脚本自动在游戏里搭建你想搭建的东西。这是个非常棒的学习Python的方式。

image.png

树莓派版本的Minecraft可以联机,我们的两个小朋友联机,而且两个人分工还挺好,一个建筑师,一个执行,实际测试很多同学联机,不限制人数,爽歪歪! 这跟scratch社区中为了做复杂作品而自动出现的分工是一致的,这在scratch官方的论文**《scratch:programming for all》 **中有非常详细的描述。`
树莓派的wifi不稳定,如果有条件最好使用有线网,无线网的话,不要使用5G无线频段,用2.4G会稳定许多,联机的搜索速度快。

image.png

运行我的世界

从桌面上的菜单或者在命令行输入minecraft-pi可以启动Minecraft。

image.png

我的世界启动后,单击游戏开始按钮Start Game,然后创建新的世界Create new。我的世界窗口有一点偏移。

image.png

这个地方官方资料也重复了,可能是觉得测试,和正式启动是两件事,所有过程重复说了2遍吧。

从下图找亮点:


image.png

树莓派是非常好的学习平台,而且可玩儿性极高,可以说是从3岁到99岁都可以玩儿了。非常好的编程、开源硬件、创客学习平台。小学生可以玩儿scratch,初中生python和开源硬件,高中生学AI,大学生学底层知识,厉害的。而且一个树莓派加一套键鼠300,现在32寸的电视也不过七八百,1000块就能拼凑一个非常好的学习平台,真的是划算至极,比买苹果划算。苹果可没有暴露的GPIO引脚,嘿嘿嘿。

image.png

上课场景,小朋友们联机玩儿Minecraft,体现出了很好的合作分工意识,非常融洽,小朋友们操作的熟练程度让人惊叹,手眼配合,双手配合操作极佳,比如双手生成已房间框架的手续比打字的手续不知道快了多少,游戏果然是孩子的天性啊。
image.png

移动鼠标可以切换视角,常用快捷键如下:

image.png

树莓派版本可以说是教育版或者阉割版,操作很少,不过我们的学生照样玩儿的很开心,分工合作也棒棒的,还有学生把握用石块包起来了,哈哈哈,我出去了20分钟,竟然把握推到虚无里了,这帮小坏蛋。

你可以用鼠标滚轮在快捷菜单选择不同的物品,或者是按键盘上的快捷键,或者按E键,从仓库选择你想要的东西。

image.png

快速双击空格键可以飞。松开空格键停止飞行,悬浮在空中。再次双击空格键降落到地面。

image.png

树莓派计算能力有限,所以如果你搭建的东西过大,可能会显示不全,我用代码生成就是如此。
树莓派联网功能很有趣,如果家里孩子玩儿树莓派版本的我的世界,两个孩子一起玩儿会更有趣。
Minecraft Pi的一个缺点是加入的名字都是StevePi,没有区分,且加入同一个游戏的人物外观相同,没有标签,是开源项目,等哪天有时间的时候,自己改下代码(就是没有时间)。

剑在手,可以摧毁面前的方块或者挖坑。如果你手里是方块,右键在你正前方放置方块,左键销毁方块。

使用Python编程接口

跟前面测试的时候相同,启动我的世界,创建世界并进入游戏界面,按Tab键让游戏窗口失去焦点,释放鼠标。打开Python3 IDLE并且移动两个窗口使之并排。

可以通过在交互式命令行编写命令或者创建一个python文件留待以后使用。

如果创建文件,单击File > Save,保存在合适的位置。

开始的时候,需要导入Minecraft库,建立和游戏的联系,并通过向游戏界面发送Hello world!测试。

from mcpi.minecraft import Minecraft

mc = Minecraft.create()

mc.postToChat("Hello world")

如果是在命令行输入,每行代码智慧敲回车。如果是文件,按Ctrl + S快捷键保存文件,按F5运行文件。大概代码运行的时候,你能够看到屏幕上出现消息。

确定自己的位置

为了确定你在游戏的位置,可以输入以下代码:

pos = mc.player.getPos()

运行智慧pos变量中会保存你的位置。通过pos.x,pos.y,pos.z,来访问你坐标的每部分。

我的世界是三维游戏,需要3个坐标确立位置,可以用房间墙角3条正交的线做例子,加强理解。

用Python的解包语法把坐标分别保存到三个变量也是一个非常好的办法(但是不如上面直观):

x, y, z = mc.player.getPos()

这样,x,y,z三个变量分别保存变量的一部分了。xz表示行走的方向,前进,后退,左边或者右边,y表示上或者下。

注意getPos()方法,返回的是玩家代码运行时候的坐标,如果你移动了,你必须重新通过这个函数来获取位置信息,或者用已经存储的信息。

如果是pc版本的Minecraft,可以通过F3查看当前的坐标。Minecraft对于培养孩子的创造力、空间想象能力非常有帮助。

传送

既然可以获取当前位置的坐标,那么也可以移动到特定的坐标,就像传送一样。

x, y, z = mc.player.getPos()
mc.player.setPos(x, y+100, z)

孩子们要用方块把握的角色包起来,那么,我用这个命令,他们怎么也包不住我。

上述代码,将会把你的玩家传送到比当前位置高100个方块的空中。你会被传送到半空中,然后径直下落到地面。

尝试下传送到其他的位置。

生成代码块

如果手里是方块,我们左键会生成方块,但是我们可以通过mc.setBlock(),生成方块,需要提供新方块的坐标和类型id。

x, y, z = mc.player.getPos()
mc.setBlock(x+1, y, z, 1)

运行上述代码,你所立之地一侧会出现一块大石头。如果你没有看到石块,用鼠标移动游戏的视角,知道你能够看到你前面灰色的石头。

生成代码块的setBlock需要4个参数,x, y, zid(x, y, z)代表游戏世界里的坐标,x+1意味着玩家当前位置旁边,id表示方块的类型,1代表石块。

其他类型的方块有:

  • Air: 0
  • Grass: 2
  • Dirt: 3

保持石块在你的视野范围之内,试着生成其他类型的方块:

mc.setBlock(x+1, y, z, 2)

你会发现,灰色的石块眼睁睁的变成了玻璃方块。

方块常量

如果你知道方块的名称(英文),可以用内置的方块常量生成方块(这比记忆数字方便多了)。你需要添加新的一行倒入库的import代码。

from mcpi import block

现在你可以生成新的代码块了:

mc.setBlock(x+3, y, z, block.STONE.id)

方块di很好猜,都是大写,这里有一些帮助你理解和习惯方块明明的例子:

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)

这次夏令营,失败在没有给学生准备足够的文字材料,下次开课给学生准备文字材料。学生学会更加方便,不过这篇文章也可以给学生看。

特殊方块

有些方块有额外的属性,比如可以设置颜色的羊毛。可以通过setBlock函数的第四个可选参数来设置这些额外信息。

wool = 35
mc.setBlock(x, y, z, wool, 1)

数字1把木块的颜色设置为橙色。如果不设置第4个参数,默认值是0,是白色。其他颜色的例子如下:

2: Magenta
3: Light Blue
4: Yellow

其他有额外信息的代码块是17木块:橡木板,杉木板,桦木板等;很高的草31,灌木丛,蕨类植物;火把50:可以设置指向东西南北,更多的可以阅读https://www.stuffaboutcode.com/p/minecraft-api-reference.htmlAPI参考手册。

生成多个方块

利用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)

这将会生成10x10x10的石头立方体。

image.png

setBlocks函数可以生成比较大的立方体,但是需要花费更多的时间。

边走边生成方块

现在我们已经知道如何生成方块了,接下来,我们实现,边走,变生成方块(这个在创建方块的时候非常有用)。

下面代码会实现边走边种花:

from mcpi.minecraft import Minecraft
from 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)

现在,四处走两步,然后回头看,会发现你真的是步步生莲啊哦不是花。

image.png

因为我们用的是while True所以代码会一直运行,你走的时候始终会生成花。在Python窗口按Ctrl + C键可以停止程序。

你也可以试着飞起来,可以看到一番天女散花的景象。

如果我们想实现只有玩家走在草地上的时候才生成话怎么办?我们可以用getBlock获取方块的类型。

x, y, z = mc.player.getPos()  # player position (x, y, z)
this_block = mc.getBlock(x, y, z)  # block ID
print(this_block)

这段代码能够返回你所在的位置,是那种类型的代码块,如果是0,那就意味着你是在空中。我们想知道我们站在那种方块上面,我们就需要把当前位置坐标的y坐标减去1,再用getBlock方法返回我们站在那种类型的方块上面:

x, y, z = mc.player.getPos()  # player position (x, y, z)
block_beneath = mc.getBlock(x, y-1, z)  # block ID
print(block_beneath)

上面的代码会告诉我们我们站在那种方块上面。

我们用循环来打印出你所站在的任何方块的类型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) # 别种的太快,程序会崩

国家重视环保,大力退耕护岸林,三倍防护栏,治理沙漠,那么我们完全可以把我们站在的方块变成草方块,那么就实现了退耕还林了,哈哈哈。

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)
   else:
       mc.setBlock(x, y-1, z, grass)
    sleep(0.1)

现在我们走两步试试看,如果我们走在草地上,我们就会在深厚留下一朵芬芳,如果下一个方块不是草方块,我们把它变成草方块。当我们回过头来看的时候,我们在我们后面种了一朵花。

image.png

玩下TNT炸药

另外一种很有趣的方块就是炸药了!普通的炸药如下:


image.png

当然这种炸药太稀松平常,很没意思。我们给炸药的data数据属性设置为1,也就是setBlock的第四个参数设置为1

tnt = 46
mc.setBlock(x, y, z, tnt, 1)

现在当你用的剑左键单击炸药块的时候,会过一会才才爆炸,相当于延时炸药了。

现在试着搭建一个大大的炸药立方体:

tnt = 46
mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, tnt, 1)
image.png

现在,你将看到一个满是炸药的立方体。点燃其中的一个炸药块,马上跑开,观察壮观的爆炸场景吧。因为爆炸的时候,同时改变的东西太多了,图形渲染起来会很卡,也就是画面会很卡,树莓派的性能还是有点弱的。

尝试下熔岩的乐趣

还有一个非常有趣的方块是熔岩:

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 Minecraft
from 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的参数,调整时间长短,改变熔岩流淌的时间。

image.png

进阶学习

当你搞清楚如何用python来操控我的世界的时候,你可以做的事情可就太多了,你可以用python代码创建任何你想创建的东西。

联机游戏

如果多个树莓派连接同一个局域网,可以加入彼此的Minecraft世界一起玩耍。玩家在Minecraft可以彼此看到。

API接口

访问API查看方块ID的详细列表,以及更多API的详细解释,我有时间也会介绍更多的API和案例。

image.png

粗略翻译,有的地方按照自己的意思来了,点击阅读原文,阅读原版英文资料。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容