《我的世界》Python编程入门(10)模块与“挖宝藏”游戏

一、模块概述

1.1 模块

模块是Python组织、封装代码的一种形式。在Python中,一个.py文件就称之为一个模块(Module)
创建模块的优点:

  • 大大提高了代码的可维护性。
  • 便于复用代码。
  • 避免函数名和变量名冲突。

创建模块的注意事项:

  • 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
  • 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。

1.2 包

为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)
现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下树形结构图组织文件和文件夹存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。
类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ utils.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 └─ utils.py

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。

二、使用模块

2.1 import语句

2.1.1 import语句的三种形式

import语句用于导入模块,它有3种形式
(1)导入模块
格式:import 模块1,模块2
多个模块名之间用逗号隔开
例如:import sys,time
(2)导入模块中的某个变量、函数、类定义
格式:from 模块 import 定义
例如:

>>> import sys,time
>>> from sys import path
>>> path
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

(3)直接导入模块中的所有定义
格式:from 模块 import *

例如:from sys import *

>>> from sys import *
>>> version
'3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]'

2.2 as关键字

作用:用于给模块或模块中的定义起别名
例如:

>>> from sys import version as v
>>> v
'3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]'

三、模块实例

回忆下前面学习中用到的导入语句

import mcpi.minecraft as minecraft
import mcpi.block as block
import time

这三个语句都是导入模块的语句,每个模块就是一个.py文件,那么这些.py在什么位置呢?

3.1 mcpi.minecraft和mcpi.block

请打开mcpi目录
《我的世界》Python编程入门(10)模块与“挖宝藏”游戏_第1张图片

打开minecraft.py文件,看看里面有没有熟悉的某些方法(函数)?
打开block.py文件,看看里面有没有熟悉的某些变量?
模块中复用的主体就是这些函数和变量!包、模块只是一种组织形式。

3.2 模块搜索方式

当我们导入一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错:

>>> import mymodule
Traceback (most recent call last):
  File "", line 1, in <module>
ImportError: No module named mymodule

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块。
这也是我们要求编写的程序文件必须保存在MyAdventures目录的原因,因为只有这样,程序才能正常导入“我的世界”相关的模块。

四、标准库和random模块

4.1 标准库

Python安装时自带的模块叫做标准库(standard library)。
库(library)是相关模块、包的集合,是一个虚拟概念。
标准库中的内置模块,可直接用import语句导入。
在windows的Python安装目录中,lib目录中存放着绝大多数标准库和已安装的第三方库,其中第三方库在lib目录的site-packages子目录中。

4.2 random模块

内置模块random用于生成随机数。
random模块包含多个用于生成随机数的函数。

案例1:随机模块功能演示

import random

#random函数用于生成一个0-1之间的随机浮点数
print(random.random())

#randint() 用于生成一个指定范围内的随机整数
print(random.randint(2,10))

#uniform() 用于生成一个指定范围内的随机浮点数
print(random.uniform(2,10))

#randrange函数用于随机从某个区间按某步长选择一个数字。
#第1个参数起始值,第2个参数终止值,第3个参数步长
print(random.randrange(0,1000,3))

#sample函数可以从序列中随机选择若干个元素,返回数据类型为列表。
print(random.sample(range(100), 4))

#choice函数能够从序列中随机选择一个元素输出。
print(random.choice("abcdefg"))

多次执行该案例,对比结果可知,每次执行结果都不同
请分析下不同结果之间的规律!

五、案例:随机生成石块

《我的世界》Python编程入门(10)模块与“挖宝藏”游戏_第2张图片

代码实现

import random
#导入模块
import mcpi.minecraft as minecraft
import mcpi.block as block

# 连接游戏
mc = minecraft.Minecraft.create()
# 获取玩家当前坐标
pos = mc.player.getTilePos()
x = pos.x 
y = pos.y
z = pos.z

#循环20次,用于输出20个随机的石块
for i in range(20):
    #随机生成两个整数
    j = random.randint(0,20)
    k = random.randint(0,20)
    #用两个随机数构造坐标,在东南方向随机生成石块
    mc.setBlock(x + j, y , z + k, block.STONE.id)

六、案例:“挖宝藏”

《我的世界》Python编程入门(10)模块与“挖宝藏”游戏_第3张图片

代码实现

import random
import time
#导入相关模块
import mcpi.minecraft as minecraft
import mcpi.block as block

# 连接游戏
mc = minecraft.Minecraft.create()
# 获取玩家当前坐标
pos1 = mc.player.getTilePos()
# 获取一个随机整数
R = random.randint(1,10)
# 在玩家东南方随机放置一个钻石方块
mc.setBlock(pos1.x + R, pos1.y - 1 , pos1.z + R, block.DIAMOND_BLOCK.id)

while True:
    #每隔0.1秒检测一次玩家坐标
    pos = mc.player.getTilePos()
    time.sleep(0.1)
    #当玩家找到钻石方块时退出循环
    if pos.y-1 == pos1.y-1 and pos.x == pos1.x+R and pos.z == pos1.z+R:
        mc.postToChat("here")
        break
    elif pos.y-1 != pos1.y-1 or pos.x != pos1.x+R or pos.z != pos1.z+R:
        mc.postToChat("not here")

小结
模块:一个py文件就是一个模块
包:含__init__.py文件的目录层次结构
导入语句:注意三种不同语句的作用
random库:伪随机数生成器

你可能感兴趣的:(我的世界,Minecraft,我的世界,Python,模块,挖宝藏)