混搭的MINECRAFT第一部分
我的世界在树莓派是你可能已经在另一台计算机或游戏机玩过的版本稍有不同。除了那里是没有用攀缘植物,这里还有抗衡内置的破解和修改的Minecraft的能力。
完整的文章中可以找到的MAGPI 41
在过去,我们向您展示一些简单的方法与使用Python的Minecraft互动; 但是,您可以连接多达不是一个简单的Python脚本等等。无论是其他软件,如声波丕,控制与硬件的游戏,如感的帽子,甚至有在现实世界中的Minecraft控制的东西,还有很多更多的尝试。因此,让你树莓派出来,让我们捣碎了一些我的世界!
我的世界的Python API
这里有对树莓派编程的Minecraft的一些方法,我们将谈论那些在功能的其余部分。国防部是最流行的方式,然而,是通过使用包括Python库。如果你曾经使用过的Python,代码的语法和逻辑是一样的,只是现在有一些直接链接到我的世界的功能!
正如我们在Python正在编写中,我们还可以通过的Minecraft GPIO引脚或与Python的作品,如皮相机或检测HAT任何附加的硬件连接到真实的世界。以下是如何开始…
代码:位置用法:GETPOS()举例:位置= mc.player.getPos()将给坐标列表为玩家的当前位置
|
1
2
3
4
|
from mcpi.minecraft import Minecraft
mc = Minecraft.create()
print mc.player.getPos()
Vec3(5.67561,0.0,6.55693)
|
这将返回球员在世界上的三个数字的位置。在X轴的第一个数字指示播放器多远向前或向后是从中心。第二个数字是多远向左或向右它们,或Y轴。最后一个号码,Z轴,是在从地面的块的高度。
代码:瞬移用法:.setPos(X,Y,Z)举例:mc.player.setPos(0.0,0.0,0.0)会传送玩家到地图的中心
|
1
2
|
mc.player.setPos(10.0,12.0,5.0)
mc.player.setPos(10.0,12.0,–5.0)
|
利用X,Y的同一坐标系和Z GETPOS() ,您可以根据您认为合适的移动玩家在地图各处。你有,或通过找出你想通过测试移到坐标 GETPOS()在需要的位置。
代码:块类型用法:getBlock(X,Y,Z)举例:块= mc.getBlock(0,0,0)在地图的中心设置可变块作为块的类型
|
1
2
3
4
|
print mc.getBlock(10.0,3.0,–5.0)
3
print mc.getBlack(5,–1,7)
12
|
每个块类型都有它的名称和标识号; 例如,AIR具有使用getBlock功能0 ID,你可以计算出在一定的坐标是什么样块:一个球员在你的代码,如果你需要触发某个事件,这是搞清楚是有用的。
代码:创建一个块用法:.setBlock(X,Y,Z,ID)的实施例:mc.setBlock(0,0,0,block.OBSIDIAN.id)将在地图的中心创建黑曜石的方块
|
1
2
3
|
mc.setBlock(10.0,0.0,–1.0, block.OBSIDIAN.id)
mc.setBlock(10.0,0.0,–2.0, block.OBSIDIAN.id)
mc.setBlock(9.0,2.0,–2.0, block.ICE.id)
|
无论你想在世界上创建任何类型的块。你可以看到这是如何工作的CrazySqueak代码接下来,因为他创造了熔岩,水,空的空间作为自然灾害计划的一部分。您还可以创建块的块与一系列坐标。
创建的Minecraft自然灾害
我已经使用Python中创建的Minecraft自然灾害,“十岁CrazySqueak在他的博客写道。“它增加了许多灾难到您的Minecraft是随机发生的,无论你是在你的世界。程序随机启动灾害对自己,所以你应该继续前进,以避免被击中。“
为的Minecraft这个优秀的Python脚本做一些非常不同,需要玩家互动其它Python黑客:这实际上增加了世界的方式正常的PC游戏MOD的威力。随着地震,落水洞,流星,间歇泉和火山喷发每个不同的作用,独立,很多工作已经进入这个程序。
代码工作通过建立各灾区的参数。每种类型都有单独的时序发生时,一旦被触发,它的工作多久。它们都使用了Python的的Minecraft API(在页面上讨论)创建或删除块,如火山爆发和流星创建熔岩;或者创建拥有天坑与地震的空白处。
所有的灾害在代码的随机触发的,都是基于在游戏中自己的位置 – 这就是为什么CrazySqueak建议留在移动!您也可以触发各功能单独看它如何工作的,有的甚至配有声音剪辑进一步增加了国防部的效果。
以及创造自然灾害,CrazySqueak获得了高度推荐奖一提交给天文皮。我们不能等待,看看他在未来产生什么其他的混搭为我的世界。
代码清单
您可以下载完整的代码,与伴音剪辑一起,从CrazySqueak的网站。代码也低于供参考。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
import mcpi.minecraft as minc
import mcpi.block as block
mc = minc.Minecraft.create()
import random, time, pygame
pygame.mixer.init()
earthSound = pygame.mixer.Sound(‘earthquake.ogg’)
eruptSound = pygame.mixer.Sound(‘lava.ogg’)
meteorSound = pygame.mixer.Sound(‘meteor.ogg’)
def earthquake(x, z):
mc.postToChat(‘Earthquake!’)
y = mc.getHeight(x, z)
endtime = time.time() + 60
nearthtime = time.time()
while endtime > time.time():
if time.time() > nearthtime:
earthSound.play()
nearthtime = time.time() + 5
ppos = mc.player.getPos()
if ppos.x < x+15 and ppos.x > x–15:
if ppos.y < y+15 and ppos.y > –60:
if ppos.z < z+15 and ppos.z > z–15:
mc.player.setPos(ppos.x, ppos.y, ppos.z)
bx = random.randint(x–15, x+15)
by = y
bz = random.randint(z–15, z+15)
if mc.getHeight(bx, bz) > –50:
by = mc.getHeight(bx, bz)
if mc.getBlock(bx, by, bz) in [block.GLASS.id, block.GLASS_PANE.id]:
mc.setBlock(bx, by, bz, block.AIR.id)
continue
mc.setBlock(bx, by, bz, block.GRAVEL.id)
mc.setBlocks(bx, by–1, bz, bx, –60, bz, block.AIR.id)
def sinkhole(x, z):
blks = []
y = mc.getHeight(x, z)
xdist = random.randint(1, 5)
for bx in range(–xdist, xdist+1):
zdist = random.randint(1, 5)
for bz in range(–zdist, zdist+1):
blks.append([x+bx, z+bz])
earthSound.play()
for blk in blks:
mc.setBlocks(blk[0], mc.getHeight(blk[0], blk[1]), blk[1], blk[0], –60, blk[1], block.AIR.id)
mc.setBlocks(blk[0], –55, blk[1], blk[0], –60, blk[1], block.LAVA.id)
for blk in blks:
mc.setBlock(blk[0], y, blk[1], block.GRAVEL.id)
def geyser(x, z):
y = mc.getHeight(x, z)
mc.setBlocks(x–2, y+5, z–2, x+2, –60, z+2, block.WATER.id)
time.sleep(25)
mc.setBlocks(x–2, y+5, z–2, x+2, –60, z+2, block.AIR.id)
def eruption(x, z):
y = mc.getHeight(x, z)
for i in range(3):
eruptSound.play()
mc.setBlocks(x–2, y+9, z–2, x+2, y+9, z+2, block.LAVA.id)
eruptSound.play()
for i in range(15):
time.sleep(1)
eruptSound.play()
eruptSound.play()
mc.setBlocks(x–2, y+10, z–2, x+2, y+10, z+2, block.WATER.id)
eruptSound.play()
for i in range(5):
time.sleep(1)
eruptSound.play()
eruptSound.play()
mc.setBlocks(x–2, y+10, z–2, x+2, y+10, z+2, block.AIR.id)
eruptSound.play()
for i in range(5):
time.sleep(1)
eruptSound.play()
eruptSound.play()
y += 1
eruptSound.play()
def meteor(x, z):
mc.postToChat(‘Meteor approaching!’)
y = 64
h = mc.getHeight(x, z)
x -= (64 – h)
meteorSound.play()
while y > h:
y -= 1
x += 1
mc.setBlocks(x–2, y–2, z–2, x+2, y+2, z+2, block.OBSIDIAN.id)
time.sleep(0.05)
mc.setBlocks(x–2, y–2, z–2, x+2, y+2, z+2, block.AIR.id)
mc.setBlocks(x–2, y–2, z–2, x+2, y+2, z+2, block.LAVA.id)
mc.setBlocks(x–1, y–1, z–1, x+1, y+1, z+1, block.OBSIDIAN.id)
def meteor_shower(x, z):
for i in range(10):
mx = random.randint(x–15, x+15)
mz = random.randint(z–15, z+15)
meteor(mx, mz)
def heatwave(x, z):
y = mc.getHeight(x, z)
endtime = time.time() + random.randint(50, 90)
while time.time() < endtime:
blkid = block.AIR.id
while blkid == block.AIR.id:
bx = random.randint(x–10, x+10)
by = random.randint(y, y+10)
bz = random.randint(z–10, z+10)
blkid = mc.getBlockWithData(bx, by, bz).id
blk = blkid
blkd = mc.getBlockWithData(bx, by, bz).data
if blkid == block.GRASS.id:
blk = block.DIRT.id
blkd = 0
elif blkid in [block.WATER.id, block.WATER_FLOWING.id, block.WATER_STATIONARY.id]:
blk = block.WATER.id
blkd = 1
elif blkid == block.LEAVES.id:
blk = block.COBWEB.id
blkd = 0
elif blkid == block.WOOD.id:
blk = block.LAVA_STATIONARY.id
blkd = 1
mc.setBlock(bx, by, bz, blk, blkd)
def tsunami(x, z):
tend = time.time() + 15
tx = x
while time.time() < tend:
h = mc.getHeight(tx, z)
mc.setBlocks(tx, h–5, z–5, tx, h+5, z+5, block.WATER_STATIONARY.id)
time.sleep(0.1)
mc.setBlocks(tx, h–5, z–5, tx, h+5, z+5, block.AIR.id)
time.sleep(0.1)
tx += 1
hm = 5
while hm > –1:
h = mc.getHeight(tx, z)
mc.setBlocks(tx, h–int(hm), z–5, tx, h+int(hm), z+5, block.WATER_STATIONARY.id)
time.sleep(0.1)
mc.setBlocks(tx, h–int(hm), z–5, tx, h+int(hm), z+5, block.AIR.id)
time.sleep(0.1)
tx += 1
hm -= 0.2
disasters = [tsunami, heatwave, meteor, meteor_shower, geyser, earthquake, sinkhole]
def main(disasters, mc):
baseed = random.randint(1, 10000)
while True:
t = random.randint(15, 180)
t = 15
time.sleep(t)
random.seed(baseed + t)
baseed = random.randint(1, 10000)
random.shuffle(disasters)
disaster = random.choice(disasters)
ppos = mc.player.getTilePos()
#mc.postToChat(str(disaster) + ‘ in’)
#for c in range(3, 0, -1):
# mc.postToChat(str(c))
# time.sleep(0.33)
disaster(ppos.x, ppos.z)
try:
import _thread as thread
except ImportError:
import thread
thread.start_new_thread(main, (disasters, mc))
|







发表评论
Comment List(1)
Arcko
2016.2.28 23:02
混搭的MINECRAFT三部曲之一