美文网首页树莓派我的世界
翻译:树莓派版Minecraft入门大揭秘

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

作者: 少儿创客 | 来源:发表于2019-07-17 22:54 被阅读0次

    正版我的世界一是要收费,二是游戏性过强,编写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

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

    相关文章

      网友评论

        本文标题:翻译:树莓派版Minecraft入门大揭秘

        本文链接:https://www.haomeiwen.com/subject/qxvclctx.html