复习
1.检测方块:getblock方法
格式:getblock(x坐标,y坐标,z坐标)
返回值:方块的id
方块的id到哪里去查?
setblock(x坐标,y坐标,z坐标,方块id)
2.列表数据类型
(1)基础概念
两个关键符号[]
,
列表是一种序列,也是集合,列表由多个元素组成,元素之间由,隔开,列表用[]表示。
(2)切片
列表同字符串一样支持切片,索引从0开始
切片格式[start:end:stp]
注意类比字符串、字典!
(3)增删改查
增加元素:列表.append(新元素)
删除元素:del 列表[下标]
修改元素:列表[下标]=新值
访问元素:列表[下标]
一、for循环
1.1 for循环格式
for循环基本格式如下:
for 临时变量 in 可迭代对象:
循环体
其中,可迭代对象常见的有字符串、列表、元组、字典等,可迭代对象往往具有一系列元素,通常用临时变量代表其中的一个元素。for循环执行时,会按照可迭代对象元素的顺序依次循环,每次循环即执行一次循环体。
1.2 range函数
range()函数是Python内置函数,可以返回一系列整数。
range()函数有3种写法:
range(起始值, 终止值, 步长)
range(起始值, 终止值)
range(终止值)
二、for循环的嵌套
Python 语言允许在一个循环体里面嵌入另一个循环。
for 循环嵌套语法:
for 临时变量1 in 可迭代对象1:
for 临时变量2 in 可迭代对象2:
循环体2
循环体1
案例1:输出每次循环时两层循环的临时变量值
for i in range(2):
for j in range(3):
print(i+1,j+1)
输出结果:
1 1
1 2
1 3
2 1
2 2
2 3
案例2:输出4行5列#
for i in range(4):#控制输出的行数
for j in range(5):#控制每行输出多少个#
print('#',end='')#在一行中输出
print()#换行
输出结果:
#####
#####
#####
#####
案例3:输出4行6列符号,要求奇数行输出*,偶数行输出#
for r in range(4):
for c in range(6):
if r % 2 == 0:#判断行是奇数还是偶数
print("*", end="")
else:
print("#", end="")
print() # 换行
输出结果:
******
######
******
######
三、采矿机案例
案例要求
任务的当前位置的Z轴从右向左,从上到下依次检测方块是否是需要的矿石原料,如果是我们需要的矿石则保留,否则清理掉,在一定范围内一面墙检测完毕之后,在人物面前插一根火把
案例分解
1.矿机函数设计:定义一个矿机函数,这样就可以自定义调整矿机
(1)矿机跟玩家当前位置有关,需要获取当前位置
(2)矿机大小?
矿机需要定义每次采集的宽度、高度和深度。
(3)矿机采矿顺序?
采矿其实就是对玩家前方立方体区域进行处理,案例要求,在Z轴方向采矿,从右到左,从上到下依次检测方块。由于有3个方向,因此需要3层嵌套循环才能依次遍历每一个方块。
(4)矿机如何采矿?
判断玩家面前的方块是否是需要的矿石,如果是保留,否则设为空气方块,清除掉。
(5)如何放置火把?
当一面墙,也就是一次采集结束后,在矿机中央位置放置一根火把。
2.监听事件,不停进行采矿
不停运行矿机,即不停执行矿机函数
案例运行要求
1.玩家保持不动,观察矿机的工作状态。
(在游戏中按F3查看坐标)
(1)采矿的宽度、高度、深度,数一数每个方向每次采集几个方块
(2)观察火把位置、个数
(3)是否有矿石留下
2.停止程序(在VSCODE终端界面按CTRL+C),手动放置几块我们需要的矿石。
(金矿石、铁矿石:建筑方块第3排第5、6个方块)
3.向我们放置的矿石开动矿机,检查矿石是否被留下
案例代码
import mcpi.block as block
import mcpi.minecraft as minecraft
import time
mc = minecraft.Minecraft.create()
def miner(width):
pos = mc.player.getTilePos()
width2 = width//2
# 获取宽度的中间值
for i in range(width):
# 定义采集深度
print(i, '1111')
for j in range(width):
# 定义采集高度
print(j, '2222')
for k in range(width):
# 定义采集宽度
print(k, '3333')
b = mc.getBlock(pos.x-width2+k, pos.y+width-j-1, pos.z+i+1)
# 定义采集模式
if b != block.GOLD_ORE.id and b != block.DIAMOND_ORE.id:
mc.setBlock(pos.x-width2+k, pos.y+width-j-1,
pos.z+i+1, block.AIR.id)
# 当第一面墙检测完毕后 则放置一个火把
if pos.x-width2+k == pos.x and pos.y+width-j-1 == pos.y:
mc.setBlock(pos.x-width2+k,pos.y+width-j-1,
pos.z+i+1, block.TORCH.id)
while True:
time.sleep(1)
miner(5)
小结
注意嵌套循环的顺序!
注意每层循环循环体的缩进!