logo资料库

在我的世界Minecraft 中用Python搭建剑球游戏.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
可移动的中线
显示数字
在《我的世界 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 字体: (默认)宋体, (中文)宋体, 小
分享到:
收藏