python生成汉字点阵,在我的世界用Python程序输出方块汉字

上期讲了如何在我的世界里搭建编程环境全网最简我的世界Minecraft搭建Python编程环境全网最简如何在我的世界Minecraft搭建Python编程环境,本期开始搞事情了,而且是搞大事。本期给大家介绍一段非常有意思的代码,可以在我的世界游戏里用方块来写汉字。

也可以请参阅公众号"我的世界MC"文章”我的世界Python编程环境搭建详细步骤”mp.weixin.qq.com/s/KCLgYLH9AQ8feoUHqTByuw 来获取更更多的帮助。

为了用方块来写汉字,首先要做的工作是将每个汉字分解成点阵字。啥叫点阵字呢?就是将每个汉字分解成16*16个点,然后用每个点的虚实不同来表示字符的轮廓,也可以叫位图字体,每个字体都是用一组二维像素信息表示。将汉字转成点阵的工作不需要我们自己去做,有现成的汉字点阵字库HZK16,大家可以在这个地址下载www.cr173.com/font/65244.html

将下载文件解压,把文件HZK16拷贝到mcpipy目录里。

其次,有了点阵字库后,我们就可以根据字符串中的汉字编码,去HZK16字库中获取该字的点阵信息,再根据16*16点阵中每个点是1还是0,是1的放一个方块,是0的放一个空气方块,这样就可以打印出汉字来。

注意这段代码目前只能写纯粹的汉字,不能处理标点符号和英文字母。

详细的代码在最后。

将代码保存为文件hz_mc.py,放到mcpipy目录里。打开我的世界,输入t打开命令行,输入/py hz_mc.py后回车运行代码,根据提示“写你所想:“写入汉字,就可以看到汉字一行行的生成啦!

这里有几个案例,可以欣赏欣赏:

b72d46ba916231d0cdc0cbca485daf95.png用钻石方块写的字

#原始代码来自https://www.jianshu.com/p/c4ae92e8a835,向原作者表示感谢

import binascii

KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04,0x02, 0x01]

def printPlay(textStr):

importmcpi.minecraft as minecraft

importmcpi.block as block

mc = minecraft.Minecraft.create()

x_size = len(textStr) * 16

#初始化16*16的点阵位置,每个汉字需要16*16=256个点来表示,需要32个字节才能显示一个汉字

#之所以32字节:256个点每个点是0或1,那么总共就是2的256次方,一个字节是2的8次方

rect_list = [] * 16

for i in range(16):

rect_list.append([] * 16)

for text in textStr:

#获取中文的gb2312编码,一个汉字是由2个字节编码组成

gb2312 = text.encode('gb2312')

#将二进制编码数据转化为十六进制数据

hex_str = binascii.b2a_hex(gb2312)

#将数据按unicode转化为字符串

result = str(hex_str, encoding='utf-8')

#前两位对应汉字的第一个字节:区码,每一区记录94个字符

area = eval('0x' + result[:2]) - 0xA0

#后两位对应汉字的第二个字节:位码,是汉字在其区的位置

index = eval('0x' + result[2:]) - 0xA0

#汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节

offset = (94 * (area-1) + (index-1)) * 32

font_rect = None

#读取HZK16汉字库文件

with open("HZK16", "rb") as f:

#找到目标汉字的偏移位置

f.seek(offset)

#从该字模数据中读取32字节数据

font_rect = f.read(32)

#font_rect的长度是32,此处相当于fork in range(16)

for k in range(len(font_rect) // 2):

#每行数据

row_list = rect_list[k]

for j in range(2):

for i in range(8):

asc = font_rect[k * 2 + j]

#此处&为Python中的按位与运算符

flag = asc & KEYS[i]

#数据规则获取字模中数据添加到16行每行中16个位置处每个位置

row_list.append(flag)

#清理一片场地,将在这片场地里写字

pos = mc.player.getTilePos()

mc.setBlocks(pos.x, pos.y, pos.z-2, pos.x+x_size+6, pos.y+18, pos.z,block.AIR.id)

#根据获取到的16*16点阵信息,用方块来写字

k= 0

for row in rect_list:

j = 0

for i in row:

if i:

#前景字符,用钻石方块写字

mc.setBlock(pos.x+j, pos.y+17-k,pos.z-2, block.DIAMOND_BLOCK.id)

else:

#背景字符,空白

mc.setBlock(pos.x+j, pos.y+17-k,pos.z-2, block.AIR.id)

j = j + 1

#print()

k = k + 1

inpt = input("写你所想:")

printPlay(inpt)

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值