您一直想学习编码但不知道从哪里开始吗?了解如何使用Python和一些简单的电子设备在Raspberry Pi上控制Minecraft。这是最终结果:
您将需要一个Pi 2或更高版本的该项目,尽管您可以通过Secure Shell(SSH)上的命令行完成大多数任务,但本教程将重点关注直接编码
《我的世界》的新手?不用担心-这是我们的Minecraft入门指南。
Minecraft Pi简介
Raspberry Pi的Minecraft是为学习和修补而开发的(免费)。它带有一个应用程序编程接口(API),它为代码提供了一种与Minecraft轻松对话的方式。对于学习如何使用Python进行编码以及电子学入门来说,这是非常出色的。
什么是Python?
Python是一种编程语言。它是解释的,这意味着当您运行Python文件或程序时,计算机必须首先对文件进行一点工作。不利之处在于,与编译语言相比,它被认为是较慢的。
The benefits of interpreted languages are the speed of coding and their friendliness. You do not need to tell the computer what data you want to store, just that you want to store something and the computer will figure out what to do. There are exceptions, of course, and this is a somewhat simplified view, however programming should be fun! If you start digging into the complex technical details it can become a bit laborious.
Python区分大小写。重要的是要知道,因为Python无法识别对象即使拼写正确也可以。如果该方法实际上称为“ DoSomething()",则“ Dosomething()"将不起作用。 Python还使用缩进。其他编程语言可能不在乎您的代码有多少个缩进,而Python 确实在意。缩进用于告诉Python代码在哪里。其他语言可能使用“大括号"({})来对代码进行分组-Python不使用它们。 Python使用井号(#)进行注释,注释用于告诉其他开发人员或查看代码的人员特定部分的功能或为什么需要它。
最后,Python会忽略所有内容。
最后,有两个主要的Python版本-Python 2.7.x和Python3.x。两者之间有一些区别(有什么区别?)。本教程将使用Python 3。
初始设置
假设您的Pi已经设置好并且正在运行Raspbian,则不需要很多初始设置。
打开终端(菜单>附件>终端),然后运行此命令。始终将存储库列表保持最新是一个好习惯,这将下载最新的程序列表(它不会自行下载程序,这有助于Pi知道调用了哪些程序以及在哪里可以找到它们)。
sudo apt-get update
现在更新Pi(可能需要一段时间):
sudo apt-get upgrade
已经安装了Python和Minecraft Pi,但是如果由于任何原因未安装Minecraft Pi,则安装起来很简单:<
sudo apt-get install minecraft-pi
导航至文档并创建一个名为“ Minecraft"的新文件夹:
cd Documents/mkdir Minecraft
您可以查看此新文件夹的内容:
ls
这里有个提示–如果您开始输入内容并按TAB键,则命令行将尝试自动为您完成该语句。
您可以使用pwd来检查当前目录的路径,pwd代表“打印工作目录":
pwd
转到菜单>游戏> Minecraft Pi ,启动Minecraft。您将需要运行此程序,但稍后会再次使用。
从菜单>编程> Python 3(IDLE)中打开Python 3。该程序为您提供了一种运行Python命令和编写程序的方法。
现在您可以在此处键入Python命令,但这不是很实用。依次转到文件>新文件,然后依次文件>保存并将其保存在您之前创建的文件夹中。 (文档> Minecraft )。我们称之为“ hello_world.py "。您不必使用.py扩展名,它会自动添加,但这是很好的做法。
如果您切换回终端,并导航到Minecraft文件夹,您应该会看到刚刚的文件创建:
cd Minecraft/ls
您可以像这样运行该文件:
python hello_world
注意“ python"都是小写的。该文件必须在文件名之前,因为它告诉Pi,以下文件是Python,因此应这样执行。
切换回Python编辑器,然后键入:
print "Hello, World!"
保存该文件并再次运行-您现在应该在命令行中看到“ Hello,World!"-整洁! print命令只是简单地告诉Python输出以下双引号的文本。这很好,但对Minecraft并不是很有用,让我们将其链接起来:
from mcpi.minecraft import Minecraftmc = Minecraft.create()mc.postToChat("Hello, World!")
现在,如果您保存并运行此文件,则应该在Minecraft游戏中看到“ Hello,World!"。让我们细分一下代码:
from mcpi.minecraft import Minecraft
此行告诉Python您要使用另一个文件中的代码。开发此mcpi.minecraft文件是为了轻松控制Minecraft。
mc = Minecraft.create()
此行创建了一个名为“ mc"(Minecraft)的对象。您必须创建此文件才能与Minecraft游戏进行通信-仅包含文件是不够的。
mc.postToChat("Hello, World!")
最后,此行告诉Minecraft在聊天室中编写一些文本。尝试将“ Hello,World!"更改为其他内容,看看会发生什么,但请记住同时包含两个双引号。如果您遇到软件问题,则是一些常见的Python和Minecraft Pi错误:
项目
现在,您已经了解Python和Minecraft的基础知识,让我们来做一些很酷的项目。可以从Github下载所有代码。
该程序将有效地架设水上桥梁。当玩家接近水域时,程序会将几个方块转换为石头。由于Minecraft使用坐标系,因此很容易获得玩家的位置以及玩家周围的方块类型。 Minecraft Pi受到一些限制,因此无法批量更新多个不同的区块。但是,您可以自己轻松地对此行为进行编码。
创建一个新文件(文件>新文件)并将其保存为“ bridge_builder.py " 。
from mcpi.minecraft import Minecraftmc = Minecraft.create() # create Minecraft Objectwhile True: x, y, z = mc.player.getPos() # store player position # store the surrounding blocks a = mc.getBlock(x, y - 1, z + 1) b = mc.getBlock(x, y - 1, z - 1) c = mc.getBlock(x - 1, y - 1, z) d = mc.getBlock(x + 1, y - 1, z) if a == 8 or a == 9 or b == 8 or b == 9 or c == 8 or c == 9 or d == 8 or d == 9: # 8 or 9 is water. Set surrounding blocks on floor to a solid (stone) if water is found mc.setBlocks(x, y - 1, z, x + 1, y - 1, z + 1, 1) mc.setBlocks(x, y - 1, z, x - 1, y - 1, z - 1, 1) mc.setBlocks(x, y - 1, z, x - 1, y - 1, z + 1, 1) mc.setBlocks(x, y - 1, z, x + 1, y - 1, z - 1, 1)
注意y值实际上是如何看待y – 1的。这是最低水平。如果使用y的值,则脚本将在大约膝盖的水平上查找块-它将不能很好地工作! Mc.getBlock()返回给定坐标的块ID。由于x,y和z是播放器的坐标,因此您可以对其进行加或减,以获取播放器周围的位置。您不必使用x,y和z值,可以使用任何数字,但是您可能不知道该特定块与播放器之间的关系-最好使用相对于播放器的值。从命令行运行此文件,看看会发生什么。
您应该看到,一旦玩家到达水体,一小块土地就会变成石头。这不是很好-您能够走得足够快就能引起问题。您可以通过将大量水转化为土地来解决此问题。 mc.setBlocks()方法的最后一部分是块ID。一个是石头的方块ID。您可以将其更改为木头,草木或其他任何东西。如果您愿意,可以很容易地将其转换为复杂的设计-也许是吊桥!
该示例将简化挖掘工作。它由一个物理按钮组成,按下该按钮将挖出10个立方体块。让我们从按钮开始。与Arduino上的按钮类似,您将需要少量的电子设备,所有这些都应在基本入门工具包中找到:
以下是电路:
该电阻器称为“下拉"电阻器。这有助于确保Pi认为被按下的按钮,实际上是被按下的按钮。您不必使用它,但是建议您使用它,因为如果没有它,您可能会发现很多噪音和错误的读数。
按钮连接到通用输入输出(GPIO)引脚14。您可以使用任何GPIO引脚,但是请先看一下引脚排列,因为它们并非均可通过Pi进行控制,并且在型号之间略有不同。
现在已经连接了按钮,现在该进行测试了。创建一个新文件,并将其另存为“ button_test.py "。添加此代码,保存并在终端中运行。
import RPi.GPIO as GPIOimport timeGPIO.setmode(GPIO.BCM) # tell the Pi what headers to useGPIO.setup(14, GPIO.IN) # tell the Pi this pin is an inputwhile True: if GPIO.input(14) == True: # look for button press print "BUTTON WORKS!" # log result time.sleep(0.5) # wait 0.5 seconds
按 Control + C 停止脚本。如果一切正常,您应该在终端中看到“按钮工作!"。请注意,与Minecraft模块一样,此测试如何使用RPi.GPIO和时间模块。这些使Pi可以访问硬件引脚并提供有用的计时功能。
现在,让我们完成其余的代码。创建一个名为“ super_mine.py "的新文件。代码如下:
import RPi.GPIO as GPIOimport timefrom mcpi.minecraft import Minecraftmc = Minecraft.create() # create Minecraft ObjectGPIO.setmode(GPIO.BCM) # tell the Pi what headers to useGPIO.setup(14, GPIO.IN) # tell the Pi this pin is an inputwhile True: if GPIO.input(14) == True: # look for button press x, y, z = mc.player.getPos() # read the player position mc.setBlocks(x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blocks mc.setBlocks(x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blocks time.sleep(0.5) # wait 0.5 seconds
mc.player.getPos()返回玩家当前的坐标,然后将其存储在x,y和z中。 setBlocks()方法告诉Minecraft用以下块填充开始和结束之间的所有块。零是空气的块标识。您可以将其更改为另一个块ID,以实心填充区域。您也可以将坐标更改为+100甚至+1000块,但是如果您太疯狂,Pi可能会开始挣扎。请注意,这两行的y + 10相同。您可以将其更改为y – 10(如果要删除地下的块)。
此按钮的另一种简单用法是“传送"。 Minecraft Pi Api提供了一种设置玩家位置的方法。以下代码会将播放器“传送"到预设位置:
mc.player.setPos(0, 0, 0)
请注意,他的方法接受三个参数。 x,y和z –因此您可以将它们设置为任何值,以立即将播放器传送到该位置。
创建super_mine文件的副本(文件>另存为 ),并通过将if替换为以下内容进行修改:
if GPIO.input(14) == True: # look for button press mc.player.setPos(0, 0, 0) # teleport player time.sleep(0.5) # wait 0.5 seconds
该文件现在应如下所示:
import RPi.GPIO as GPIOfrom mcpi.minecraft import Minecraftimport timemc = Minecraft.create() # create Minecraft ObjectGPIO.setmode(GPIO.BCM) # tell the Pi what headers to useGPIO.setup(14, GPIO.IN) # tell the Pi this pin is an inputwhile True: if GPIO.input(14) == True: # look for button press mc.player.setPos(0, 0, 0) # teleport player time.sleep(0.5) # wait 0.5 seconds
将其另存为“ teleport.py "
。使用此功能时,您可能会发现播放器卡在某些块内,在这种情况下,您需要将坐标调整为已知的空白区域(屏幕左上方显示您的
此按钮的最后一项任务是盖房。就像上面的快速挖掘示例一样,这将简单地替换玩家周围的砖块来建造房屋。不同的块ID将用于不同的材料(窗口,墙壁等)。为了使代码更容易编写,将创建一个实心块,然后移除内部(将块设置为空气),这将创建一个空心外壳。您可以添加诸如床或门之类的附加功能,但是Minecraft Pi项目有点不完整,尽管这些对象在玩家放置时可以正常工作,但在使用Python时它们并不出色。
from mcpi.minecraft import Minecraftimport RPi.GPIO as GPIOimport timemc = Minecraft.create() # create Minecraft ObjectGPIO.setmode(GPIO.BCM) # tell the Pi what headers to useGPIO.setup(14, GPIO.IN) # tell the Pi this pin is an inputwhile True: if GPIO.input(14) == True: x, y, z = mc.player.getPos() mc.setBlocks(x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # make shell mc.setBlocks(x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # remove inside mc.setBlocks(x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # make doorway mc.setBlocks(x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make window 1 mc.setBlocks(x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make window 2 mc.setBlocks(x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make window 3
另存为“ house.py "并运行。一切都很好,您应该看到一所小房子出现了(您可能需要转身找到它)。非常简单,有一个开口和一些窗户。从理论上讲,您可以建造多大或多复杂的建筑物没有限制。
接下来,我们来做一个迷你游戏!这很简单,当玩家踩到一块沙子时,经过一段随机的时间后它将变成熔岩。这是一款出色的游戏,因为您可以设计自己的关卡或对其进行修改以使事情变得更难。在此示例中,您将不需要按钮。
创建一个新文件并将其另存为“ mini_game.py "。以下是代码:
from mcpi.minecraft import Minecraftimport randomimport timemc = Minecraft.create() # create Minecraft Objectwhile True: x, y, z = mc.player.getPos() block_under_player = mc.getBlock(x, y - 1, z) if block_under_player == 12: # player standing on sand, start the timer random_time = random.uniform(0.1, 2.5) # generate random number time.sleep(random_time); # wait mc.setBlock(x, y - 1, z, 11) # turn it into lava
此代码是 random()函数的良好入门: random.uniform(0.1,2.5)将生成一个介于0.1(1/10秒)到2.5(2.5秒)之间的随机数。增加这些数字将使游戏更加轻松。
尝试一下!站在一块沙子上,它很快就会变成熔岩。这可能是制作更复杂游戏的基础。
该游戏的前提很简单-时间用完时不要站在木地板上。玩家被传送到一个“竞技场"。他们被迫站着直到比赛开始。一旦启动,一旦计时器用完,地板将变成水。玩家必须站在安全区(钻石街区)才能生存。每个级别将计时器减少一秒钟。每个成功的级别之后,安全区域都会变大。请查看下面的代码:
import timeimport randomfrom mcpi.minecraft import Minecraft mc = Minecraft.create() # create Minecraft Object# clear areamc.setBlocks(-10, 1, -10, 25, 5, 25, 0)# create arena shellmc.setBlocks(0, 0, 0, 25, 10, 25, 17)# hollow out arenamc.setBlocks(1, 1, 1, 24, 10, 24, 0)# move player to arenamc.player.setPos(14, 25, 20) # teleport player # make them stay put# teleport player to start position every 1/10th second.# do this for 5 seconds then start the gametime.sleep(2)total_wait = 0mc.postToChat("Waiting to Start")while total_wait < 5: mc.player.setPos(14, 1, 20) # teleport player time.sleep(0.1) total_wait += 0.1mc.postToChat("BEGIN!")# 10 levelsfor level in range(10): x, y, z = mc.player.getPos() level_time = 10 - level # reduce time by 1 second for each level mc.postToChat("Level - " + str(level + 1) + " start") # build floor mc.setBlocks(0, 0, 0, 25, 0, 25, 17) # make safe area safe_area_start = random.uniform(0, 22) safe_area_end = random.uniform(0, 22) mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57) elapsed_time = 0 while elapsed_time < 10: x, y, z = mc.player.getPos() time.sleep(0.25) elapsed_time += 0.25 # check player is still on floor if y < 0.75: mc.postToChat("Game Over") break; else: # remove floor mc.setBlocks(-10, 0, -10, 25, 0, 25, 8) # put safe area back mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57) time.sleep(2.5) continue break
将其另存为“ mini_game_2.py "并运行。
Pi 2在运行时会遇到一些性能问题运行Minecraft。中央处理器(CPU)使用情况图(右上角)从不显示任何高负载,因此这必须归因于开发人员的不良设计和优化。这些问题与正在运行的代码无关(因为在不运行Python时会继续存在),但是此迷你游戏将使这些问题更加复杂。如果您的Pi确实很挣扎,则可能需要缩小竞技场的大小或对Pi进行超频。
让我们再做一个电路。当下面有钻石时(不到15个方块),这将使用发光二极管(LED)点亮。这就是您的需要:
这是电路:
将阳极(长脚)连接到GPIO引脚14。此引脚的作用类似于+ 5v。将阴极(短腿)接地。
我使用了廉价的矿石玩具,并通过拆下后盖和电子设备对其进行了改装,然后在其下方放置了一个LED。您可以使用热胶或类似方法轻松地将其永久化。
将此代码另存为“ diamonds.py ":
import RPi.GPIO as GPIOimport timefrom mcpi.minecraft import Minecraftmc = Minecraft.create() # create Minecraft Objectled_pin = 14 # store the GPIO pin numberGPIO.setmode(GPIO.BCM) # tell the Pi what headers to useGPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an outputwhile True: # repeat indefinitely x, y, z = mc.player.getPos() for i in range(15): # look at every block until block 15 if mc.getBlock(x, y - i, z) == 56: GPIO.output(led_pin, True) # turn LED on time.sleep(0.25) # wait GPIO.output(led_pin, False) # turn LED off time.sleep(0.25) # wait
播放器下方的一块钻石矿块(在15个块内),指示灯将闪烁。
您是否使用Minecraft Pi制作了一些很棒的东西?在评论中让我知道您在游戏中做了什么或走了多远。
标签: