正版我的世界一是要收费,二是游戏性过强,编写Mod门槛高,树莓派版Minecraft免费,且能够很容易的与python交互,是非常好的学习工具,学生对Minecraft有非同一般的热情,结合python,让学生体会码创一切的魅力。本文翻译自树莓派官方网站,大家将就看(已经被吐槽翻译的像人机了)。
树莓派官方的教程,格式比较统一,适合作为学习资料,是写作教程类资料很好的参考。
最终成果
你将探索树莓派定制版本Minecraft中的虚拟世界。将会学习如何用控制玩家,手动搭建积木块,用python控制游戏中的一切。
学习目标
使用树莓派学习本资料你将会掌握:
- 如何启动
Minecraft Pi
并创建一个新的世界 - 如何用
IDLE Python
编程环境连接Minecraft Pi
- 如何用
Minecraft Python API
向聊天窗口发送消息,确定玩家坐标,实现传送并搭建建筑 - 如何利用变量保存不同种类方块的的
ID
值 - 尝试使用有特殊属性的不同类型方块
本资料涵盖了树莓派数字创客课程中以下课程涉及到的要求:
- 用基本程序结构编写简单的程序
树莓派有一套自己的数字创客课程标准,这套课程标准跟CAD公司的
TinkerCAD
中体现的思想有异曲同工之处,也可以说TinkerCAD
为树莓派课程的落地提供了更好的支持。
需求清单
软件
软件安装
自2014年9月开始,树莓派系统Raspbian默认安装Minecraft。双击快捷方式就可以启动。mimmi
如果你用的是老版本的树莓派系统,打开命令行窗口,输入以下命令:
sudo apt-get update
sudo apt-get install minecraft-pi
命令执行完毕后,就成功安装了Minecraft Pi和相关的Python库会。
我记得以前树莓派系统自带了一些游戏,五子棋、记忆游戏啥的,我现在的树莓派用NOOBS刷的系统,反而没有了。
测试Minecraft是否安装成功
双击桌面Minecraft的图表或者在命令行窗口输入minecraft-pi
均可启动我的世界
注意
如果你安装Minecraft Pi得到了以上提示信息,并且菜单或者桌面没有Minecraft图表,那么尝试在命令行输入以下指令就可以启动Minecraft:
minecraft-pi
命令行可能会持续输出一堆很奇怪的信息,不用理会。
Minecraft加载完毕后,单击Start Game
开始游戏按钮。游戏窗口可能会轻微有一点便宜。如果你想拖动窗口,你拖动游戏窗口后面的标题栏。
看,你现在就在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
运行文件。代码运行后,你会再游戏的界面看到消息。
如果Minecraft界面出现Hello world
,你就可以继续进行下一步了。
开始探索Minecraft Pi
Minecraft是一个非常流行的开放世界的沙盒游戏,Minecraft为树莓派开发了免费版本,同时提供了专门的编程接口。也就是说,你可以用python编写命令和脚本自动在游戏里搭建你想搭建的东西。这是个非常棒的学习Python的方式。
树莓派版本的Minecraft可以联机,我们的两个小朋友联机,而且两个人分工还挺好,一个建筑师,一个执行,实际测试很多同学联机,不限制人数,爽歪歪! 这跟scratch社区中为了做复杂作品而自动出现的分工是一致的,这在scratch官方的论文**《scratch:programming for all》 **中有非常详细的描述。`
树莓派的wifi不稳定,如果有条件最好使用有线网,无线网的话,不要使用5G无线频段,用2.4G会稳定许多,联机的搜索速度快。
运行我的世界
从桌面上的菜单或者在命令行输入minecraft-pi
可以启动Minecraft。
我的世界启动后,单击游戏开始按钮Start Game,然后创建新的世界Create new。我的世界窗口有一点偏移。
这个地方官方资料也重复了,可能是觉得测试,和正式启动是两件事,所有过程重复说了2遍吧。
从下图找亮点:
树莓派是非常好的学习平台,而且可玩儿性极高,可以说是从3岁到99岁都可以玩儿了。非常好的编程、开源硬件、创客学习平台。小学生可以玩儿scratch,初中生python和开源硬件,高中生学AI,大学生学底层知识,厉害的。而且一个树莓派加一套键鼠300,现在32寸的电视也不过七八百,1000块就能拼凑一个非常好的学习平台,真的是划算至极,比买苹果划算。苹果可没有暴露的GPIO引脚,嘿嘿嘿。
上课场景,小朋友们联机玩儿Minecraft,体现出了很好的合作分工意识,非常融洽,小朋友们操作的熟练程度让人惊叹,手眼配合,双手配合操作极佳,比如双手生成已房间框架的手续 比打字的手续不知道快了多少,游戏果然是孩子的天性啊。
移动鼠标可以切换视角,常用快捷键如下:
树莓派版本可以说是教育版或者阉割版,操作很少,不过我们的学生照样玩儿的很开心,分工合作也棒棒的,还有学生把握用石块包起来了,哈哈哈,我出去了20分钟,竟然把握推到虚无里了,这帮小坏蛋。
你可以用鼠标滚轮在快捷菜单选择不同的物品,或者是按键盘上的快捷键,或者按E
键,从仓库选择你想要的东西。
快速双击空格键可以飞。松开空格键停止飞行,悬浮在空中。再次双击空格键降落到地面。
树莓派计算能力有限,所以如果你搭建的东西过大,可能会显示不全,我用代码生成就是如此。
树莓派联网功能很有趣,如果家里孩子玩儿树莓派版本的我的世界,两个孩子一起玩儿会更有趣。
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
三个变量分别保存变量的一部分了。x
和z
表示行走的方向,前进,后退,左边或者右边,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
, z
和id
。(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的石头立方体。
用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)
现在,四处走两步,然后回头看,会发现你真的是步步生莲啊哦不是花。
因为我们用的是
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)
现在我们走两步试试看,如果我们走在草地上,我们就会在深厚留下一朵芬芳,如果下一个方块不是草方块,我们把它变成草方块。当我们回过头来看的时候,我们在我们后面种了一朵花。
玩下TNT炸药
另外一种很有趣的方块就是炸药了!普通的炸药如下:
当然这种炸药太稀松平常,很没意思。我们给炸药的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)
现在,你将看到一个满是炸药的立方体。点燃其中的一个炸药块,马上跑开,观察壮观的爆炸场景吧。因为爆炸的时候,同时改变的东西太多了,图形渲染起来会很卡,也就是画面会很卡,树莓派的性能还是有点弱的。
尝试下熔岩的乐趣
还有一个非常有趣的方块是熔岩:
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
的参数,调整时间长短,改变熔岩流淌的时间。
进阶学习
当你搞清楚如何用python来操控我的世界的时候,你可以做的事情可就太多了,你可以用python代码创建任何你想创建的东西。
联机游戏
如果多个树莓派连接同一个局域网,可以加入彼此的Minecraft世界一起玩耍。玩家在Minecraft可以彼此看到。
API接口
访问API查看方块ID的详细列表,以及更多API的详细解释,我有时间也会介绍更多的API和案例。
粗略翻译,有的地方按照自己的意思来了,点击阅读原文,阅读原版英文资料。