《我的世界》Python编程入门(11) 开矿机案例

复习

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)

小结

注意嵌套循环的顺序!
注意每层循环循环体的缩进!

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值