在《我的世界 Minecraft》中用 Python 搭建剑球游戏
设置格式[bh1rhr]:
字体: (默认)宋体, (中文)宋体
——可移动的中线与显示数字
可移动的中线
设置格式[bh1rhr]:
行距: 1.5 倍行距
程晨
设置格式[bh1rhr]:
字体: (默认)宋体, (中文)宋体
完成了出界和进球的规则后,现在我们来完成一个“剑球”游戏独有的规则
——可移动的中线。在前面的代码中,当复位的时候,“球”会移动到球场的中
心重新开始,这是一种公平的规则,不过在本人的“剑球”游戏中,我希望规则
能够偏向于能力较弱的一方,所以设定了这个移动的中线的规则,即中线会更靠
近比分高的一方,这样,当“球”回到中线上时,比分落后的一方进球所需要移
动的直线距离比分高的一方要近,这样更容易追赶比分。而且,我希望双方的比
分差距越大,相应的中线移动的距离也越多。
介绍了这个规则之后,下面我们就来看看在游戏中如何实现它。由于规则操
作的是中线,所以我们来看看搭建中线的代码
mc.setBlocks(0,0,-19,0,0,19,block.WOOL.id,0)
通过代码我们能够看到,现在的中线是在 x 坐标为 0 的这条线上,那么我们
只需要改变中线的 x 位置为双方的比分差就可以,当黄队比分高时,中线应该更
靠近黄色一方,即更靠近东方,也就是 x 值为正的方向,而当蓝队比分高时,中
居中, 段落间距段前: 0 磅, 段后: 0 磅,
字体: (默认)宋体, (中文)宋体, 小
左, 缩进: 首行缩进: 2 字符, 行距: 1.5
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
行距: 1.5 倍行距
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
倍行距
删除[bh1rhr]:
这个
删除[bh1rhr]:
中
设置格式[bh1rhr]:
四
删除[bh1rhr]:
若
设置格式[bh1rhr]:
四
删除[bh1rhr]:
就
删除[bh1rhr]:
比
删除[bh1rhr]:
就
设置格式[bh1rhr]:
四
删除[bh1rhr]:
线应该更靠近蓝色一方,即更靠近西方,也就是 x 值为负的方向。所以可以直接
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
将 x 值设定为 yellowScore-blueScore。另外,因为我们同时要设定“球”的复
位位置,所以可以将这个复位位置的 x 坐标设定为 yellowScore-blueScore,而
中线的 x 坐标位置直接取“球”的 x 坐标位置即可。
查看代码中设定 ballPosX 的位置,做相应的修改(加粗部分)。
import mcpi.minecraft as minecraft
import mcpi.block as block
ballPosX = 0
ballPosY = 1
ballPosZ = 0
yellowScore = 0
左, 缩进: 首行缩进: 2 字符, 行距: 1.5
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
左, 行距: 1.5 倍行距
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
倍行距
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
删除[bh1rhr]:
设置格式[bh1rhr]:
四
字体: (默认)宋体, (中文)宋体, 小
blueScore = 0
def buildField():
mc.setBlocks(-29,0,-19,29,15,19,block.AIR.id)
mc.setBlocks(-29,0,-19,29,0,19,block.WOOL.id,0)
mc.setBlocks(-28,0,-18,28,0,18,block.WOOL.id,13)
mc.setBlocks(ballPosX ,0,-19,ballPosX ,0,19,block.WOOL.id,0)
mc.setBlocks(-29,0,-8,-18,0,8,block.WOOL.id,0)
mc.setBlocks(29,0,-8,18,0,8,block.WOOL.id,0)
mc.setBlocks(-28,0,-7,-19,0,7,block.WOOL.id,13)
mc.setBlocks(28,0,-7,19,0,7,block.WOOL.id,13)
mc.setBlocks(29,3,-5,29,3,5,block.WOOL.id,4)
mc.setBlocks(-29,3,-5,-29,3,5,block.WOOL.id,11)
mc = minecraft.Minecraft.create()
mc.postToChat("welcome to nille's world")
while True:
if mc.getBlock(ballPosX,ballPosY,ballPosZ) == block.AIR.id:
mc.setBlock(ballPosX,ballPosY,ballPosZ,block.WOOL.id,1)
events = mc.events.pollBlockHits()
for e in events:
if e.pos.x == ballPosX and e.pos.y == ballPosY and e.pos.z ==
ballPosZ:
if e.face == 5 :
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
删除[bh1rhr]:
设置格式[bh1rhr]:
四
删除[bh1rhr]:
设置格式[bh1rhr]:
四
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
mc.setBlock(e.pos.x,e.pos.y,e.pos.z,block.AIR.id)
mc.setBlock(e.pos.x-1,e.pos.y,e.pos.z,block.WOOL.id,1)
ballPosX = ballPosX - 1
if e.face == 3 :
mc.setBlock(e.pos.x,e.pos.y,e.pos.z,block.AIR.id)
mc.setBlock(e.pos.x,e.pos.y,e.pos.z-1,block.WOOL.id,1)
ballPosZ = ballPosZ - 1
if e.face == 4 :
mc.setBlock(e.pos.x,e.pos.y,e.pos.z,block.AIR.id)
mc.setBlock(e.pos.x+1,e.pos.y,e.pos.z,block.WOOL.id,1)
ballPosX = ballPosX + 1
if e.face == 2 :
mc.setBlock(e.pos.x,e.pos.y,e.pos.z,block.AIR.id)
mc.setBlock(e.pos.x,e.pos.y,e.pos.z+1,block.WOOL.id,1)
ballPosZ = ballPosZ + 1
if ballPosX <-29 or ballPosX > 29 or ballPosZ < -19 or
ballPosZ > 19:
if ballPosZ >= -5 and ballPosZ <= 5 :
mc.postToChat(‘GOAL')
if ballPosX <-29:
yellowScore = yellowScore + 1
if ballPosX > 29:
blueScore = blueScore + 1
mc.postToChat(‘YELLOW:' + str(yellowScore) +‘BLUE:' +
str(blueScore))
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
1.5 倍行距
设置格式[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
1.5 倍行距
删除[bh1rhr]:
字体: (默认)宋体, (中文)宋体, 小
左, 缩进: 首行缩进: 5.5 字符, 行距:
左, 行距: 1.5 倍行距
左, 缩进: 悬挂缩进: 6.5 字符, 行距:
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
删除[bh1rhr]:
'
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
删除[bh1rhr]:
'
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
删除[bh1rhr]:
'
设置格式[bh1rhr]:
四
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
else:
mc.postToChat('OUT')
ballPosX = yelloScore - blueScore
ballPosZ = 0
buildField()
试运行一下(最好在场边做一个标记),此时每当双方有分差的时候,相应
的中线就会做一定的偏移。
另外我们可能还需要设置一下偏移的最大量,这个最大量设定为 15,即当
两者的分差大于 15 的时候,这个偏移量维持在 15 就可以了,修改相应代码如下
(上面代码的最后三行)。
ballPosX = yellowScore - blueScore
if ballPosX > 15:
BallPosX = 15
if ballPosX < -15:
BallPosX = -15
ballPosZ = 0
buildField()
显示数字
如果以上的操作你都能够顺利完成,那么现在邀请一些小伙伴一起玩这个游
戏问题已经不大了(当然首先是你和你的小伙伴都用的是相同版本的
Minecraft)。
从这里开始,以下的内容算是锦上添花,其中最先实现的就是要在
Minecraft 中通过方块来实时显示比分。目前我们的比分实际上只有在进球的时
候会显示一下,如果没有进球,我们是无法看到比分的。
在显示比分之前,这里需要花点时间介绍一下在 Minecraft 中如何用方块来
显示数字。
不知道大家有没有注意过公交车、电梯上显示信息的点阵屏,点阵屏显示信
息的方式是通过一个一个的发光的小点,这些小点按照一定的规则点亮和熄灭,
从整体上来看就能显示不同的文字和数字,如图 1 所示。
删除[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距, 图案: 清除(背景1)
左, 缩进: 首行缩进: 2 字符, 行距: 1.5
左, 行距: 1.5 倍行距
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
倍行距
设置格式[bh1rhr]:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
删除[bh1rhr]:
就
删除[bh1rhr]:
:
删除[bh1rhr]:
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
删除[bh1rhr]:
设置格式[bh1rhr]:
居中, 行距: 1.5 倍行距
左, 缩进: 首行缩进: 2 字符, 行距: 1.5
设置格式[bh1rhr]:
倍行距
删除[bh1rhr]:
来
删除[bh1rhr]:
需要
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
删除[bh1rhr]:
设置格式[bh1rhr]:
四
设置格式[bh1rhr]:
四
删除[bh1rhr]:
一些
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
删除[bh1rhr]:
的部分
删除[bh1rhr]:
minecraft
设置格式[bh1rhr]:
四
删除[bh1rhr]:
的
删除[bh1rhr]:
的话
设置格式[bh1rhr]:
四
删除[bh1rhr]:
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
左, 缩进: 首行缩进: 2 字符, 行距: 1.5
设置格式[bh1rhr]:
倍行距
删除[bh1rhr]:
minecraft
设置格式[bh1rhr]:
四
删除[bh1rhr]:
表示
设置格式[bh1rhr]:
四
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
图 1 点阵屏
图 2 由小点组成的世界地图
如果这些小点够多,还能够显示一些图形出来,图 2 所示的内容实际上就可
以通过点阵的方式显示出来。而图 3 是由这种显示方式显示的汉字“汉”
图 3 点阵汉字
图 4 Minecraft 中用方块表示的数字
当点阵放大的时候,我们能看到其实上面是一个一个的小方块,而当点阵拿
远一点的时候,我们看到的就是一个汉字了。如果要显示的话,这里黑色的小方
块就点亮,而白色的小方块就熄灭。在 Minecraft 中显示数字就是这种形式(其
实按照相同的方式也可以显示文字),用来表示数字所需要的矩阵大小最小只用
3×5 个方块的位置就可以了。0 到 9 十个数字在 Minecraft 中显示效果如下。
对于每个数字来说,黑色羊毛和白色羊毛所占的区域大小就是 3×5,如果
假设每个数字区域从左上角开始,横向用 ABC 来指定每一个列的位置,竖向用
12345 来指定每一行的位置,那么如果我们要显示数字 1 的话就需要设定 B1、A2、
B2、B3、B4、A5、B5、C5 这几个方块,而其他的方块只要设定为空气即可。图 4
是使用黑色羊毛主要是为了标示出 3×5 的区域大小。依次类推,我们能够得到
所有 10 个数字所占用的方块位置表(见表 1)。
表 1 方块位置表
数字 A1
B1 C1
A2
B2
C2
A3
✔
✔ ✔
C3
A4
B3
✔
B4
✔
C4
A5
B5
C5
✔ ✔ ✔
✔ ✔ ✔
1
2
✔ ✔ ✔
✔ ✔ ✔ ✔ ✔
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
设置格式[bh1rhr]:
图案: 10%(自动设置 前景, 白色 背景)
设置格式[bh1rhr]:
图案: 10%(自动设置 前景, 白色 背景)
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
四, 图案: 10%(自动设置 前景, 白色 背景)
删除[bh1rhr]:
图 24 点阵屏
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
四
删除[bh1rhr]:
的话
删除[bh1rhr]:
5
删除[bh1rhr]:
删除[bh1rhr]:
26
设置格式[bh1rhr]:
四
删除[bh1rhr]:
设置格式[bh1rhr]:
图案: 10%(自动设置 前景, 白色 背景)
设置格式[bh1rhr]:
图案: 10%(自动设置 前景, 白色 背景)
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
删除[bh1rhr]:
图 26 点阵汉字
设置格式[bh1rhr]:
四
删除[bh1rhr]:
minecraft
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
四
删除[bh1rhr]:
minecraft
设置格式[bh1rhr]:
四
删除[bh1rhr]:
:
设置格式[bh1rhr]:
四
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
删除[bh1rhr]:
图 27 minecraft 中用方块表示的数字
设置格式[bh1rhr]:
四
删除[bh1rhr]:
上
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
删除[bh1rhr]:
中
设置格式[bh1rhr]:
四
删除[bh1rhr]:
删除[bh1rhr]:
十
3
4
5
6
7
8
9
0
✔ ✔ ✔
✔
✔ ✔
✔ ✔ ✔ ✔
✔
✔ ✔
✔ ✔ ✔ ✔
✔
✔
✔ ✔ ✔ ✔
✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔
✔
✔
✔
✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
✔ ✔
✔ ✔
✔ ✔ ✔ ✔
如果我们要在游戏中竖着显示这些数字,那么就需要确定一下各个方块点的
相对坐标。如果以左下角方块(A5)为基点,那么其他各点的相对坐标如表 2
所示。
表 2 位置相对坐标表
方块位置标识
垂直坐标偏移(y 方向) 水平坐标偏移(x 或 z 方向)
A1
B1
C1
A2
B2
C2
A3
B3
C3
A4
B4
C4
A5
B5
C5
+4
+4
+4
+3
+3
+3
+2
+2
+2
+1
+1
+1
0
0
0
0
+1
+2
0
+1
+2
0
+1
+2
0
+1
+2
0
+1
+2
通过以上的两个表,现在我们只需要在游戏中设定相应的方块即可显示数字了。
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
左, 行距: 1.5 倍行距
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)宋体, (中文)宋体, 小
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
设置格式[bh1rhr]:
Gothic, 小四, 字距调整: 0 磅
设置格式[bh1rhr]:
四, 字距调整: 0 磅
左, 行距: 1.5 倍行距
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小
字体: (默认)MS Gothic, (中文)MS
字体: (默认)宋体, (中文)宋体, 小