案例:检测玩家所在位置
第一步:通过API接口连接游戏
1.1什么是API接口
我们的程序和Minecraft游戏可以理解为两个分隔两地的人,两者之间要进行沟通怎么办?
是不是要借助某种工具?比如电话、微信、QQ等等。
这种工具是否需要两者都能够使用?
Minecraft API即Minecraft的应用程序接口,可以理解为Minecraft游戏留给我们用程序跟游戏沟通的工具!
备注:我们用的Minecraft API就是第1节课讲的mcpi目录的文件,这也是为什么.py程序必须创建在mcpi目录的同级目录中。
1.2 连接游戏步骤
(1)首先打开服务器和游戏
(2)通过API连接游戏
import mcpi.minecraft as minecraft
#导入程序需要用到的模块
#import为导入模块的关键字,mcpi.minecraft为需要引入的模块
#as为模块创建别名的关键字,minecraft为模块的别名。
#创建别名主要为了简化代码,比如中华人民共和国简称中国!
mc = minecraft.Minecraft.create()
#minecraft为我们导入的模块的别名,Minecraft.create()为连接游戏的方法
#()结尾代表执行一个动作,在编程中一般叫做函数或方法。
注意!#表示注释,用于解释程序,程序运行时不执行这些代码,我们可以不输入这些内容!
第二步:获取玩家的位置
pos = mc.player.getTilePos()
#网络课件中第6页pos = mc.player.getTilepos()有错误。
#mc.player.getTilePos()为获取用户当前位置的方法
#变量pos为mc.player.getTilepos()方法的返回值
#返回值即方法执行后留给调用者的可用的值,不同方法、函数的返回可能不同。具体概念可在扩展中详细了解
#pos变量代表的数据由x,y,z三部分组成,通过print语句可以输入这三部分内容
print(pos.x)
print(pos.y)
print(pos.z)
#注意!不是每个变量都可以用pos.x这样的形式表示某一部分数据
3.第三步:改进玩家位置输出信息
pos变量用3个print语句太繁琐,而且程序设计者之外的人可能根本就不明白输出的3个值什么意思!
因此,我们改进程序将3个语句合并为1个语句。
print("x="+str(pos.x)+"y="+str(pos.y)+"z="+str(pos.z))
# + 两端都为数字时表示两个数字相加,+ 两端都为字符串时表示拼接两个字符串
# + 两端不能一边是数字,一边是字符串
# + 在这里用作拼接2个字符串
#pos.x,pos.y,pos.z的值均为整数,因此在与字符串拼接前需要转换为字符串
4.第四步:动态获取玩家位置
通过前两步我们已经可以获取玩家的所在位置,但是有一个缺点,每次运行程序,只能获取一个坐位置,再移动玩家,就获取不了位置,只能再次运行程序!如何动态获取玩家位置?
4.1 导入time模块
time是Python自带的关于时间的模块。
import time
#通过import语句导入time模块
time.sleep(1)
#time.sleep()方法可以让程序暂停执行一定时间,单位为秒
#演示代码为1,即暂停1秒,()内的值可以修改,要求为整数。
4.2 while循环
格式:
while 条件:
子代码块
条件为True时,执行子代码块
注意:子代码块整体要缩进!
4.3 动态获取玩家位置
代码:
import time
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
while True:
time.sleep(1)
pos = mc.player.getTilePos()
mc.postToChat("x=" + str(pos.x) + "y=" + str(pos.y) + "z=" + str(pos.z))
代码解读:
#导入使用到的模块
import time
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
#使用API连接游戏
while True:
#死循环,监听游戏
time.sleep(1)
#每次循环暂停1秒钟,要不然一直后面输出太快,我们就不容易看到后面输出的结果
pos = mc.player.getTilePos()
#获取玩家当前位置
mc.postToChat("x=" + str(pos.x) + "y=" + str(pos.y) + "z=" + str(pos.z))
#利用postToChat()方法在游戏中输出玩家的位置
注意!因为while循环中条件一直为True,所以子代码块一直执行,而且子代码块未引入退出循环的机制,这样程序就无法正常退出,只能强制停止程序(在终端中同时按下ctrl键和c键)。while True:
这种形式的循环一般用于监听事件,等待用户执行某种操作,例如当代用户输入用户名、密码,用户输入完成之后退出循环,如果用户未完成输入,一直循环,等待用户完成输入。