最近看到mcmod百科上有个叫成就生成器的东西,于是也想用Python做一个。

大致思路:

一张成就图像,需要有底图,图标和和说明文字三个部分。

成就的图标比较难搞,我使用的是Minecraft Wiki上的物品栏图标,大致思路是先把Sprite全图下载下来,然后再从Wiki的Lua脚本里获取物品名和图标位置的映射关系,然后保存在一个字典里备用。

因为成就的底图有透明度,所以不能上传到博客园的相册里,于是我把它放在了其他图床(SM.MS)上,地址见代码(base_url)。

Minecraft的英文字体(minecraft.otf)在网上是比较好找的,下载后和脚本文件放在同一目录下即可。不过,现在网上还是找不到Minecraft原生的中文字体(即像素化的仿宋字体),所以要显示中文,就只能用系统自带的simsun.ttc将就一下了。

注意图像的绘制需要用到Pillow模块,html的处理和提取需要BeautifulSoup模块,需使用pip命令安装。

代码如下:

from urllib.request import urlopen, urlretrieve

from bs4 import BeautifulSoup

from PIL import Image, ImageFont, ImageDraw

import re, string, os, requests

size = 32

listsize = 32

page_url = r'https://minecraft.gamepedia.com/Module:InvSprite'

sprite_url = r'https://static.wikia.nocookie.net/minecraft_gamepedia/images/4/44/InvSprite.png/revision/latest'

base_url = r'https://i.loli.net/2020/09/27/zwIY6nVJRmqbHaL.png' #使用SM.MS储存成就底图

catdict = {}

itemdict = {}

def init():

#创建资源文件夹...

if (not os.path.exists(r'./adv-maker/')):

os.mkdir(r'./adv-maker/')

#下载图标文件...

if (not os.path.exists(r'./adv-maker/inv-sprite.png')):

print('Downloading Sprites file...')

urlretrieve(sprite_url, './adv-maker/inv-sprite.png')

#下载成就底图...

if (not os.path.exists(r'./adv-maker/advancement-base.png')):

print('Downloading Advancement Background Image...')

r = requests.get(base_url)

with open(r'./adv-maker/advancement-base.png','wb') as bim:

bim.write(r.content)

#把Wiki上的Lua脚本先搞出来...

if (not os.path.exists(r'./adv-maker/pos-info.txt')):

resp = urlopen(page_url)

print('Downloading HTML file...')

cont = resp.read()

soup = BeautifulSoup(cont,'html.parser')

print('Extracting Lua script...')

src = soup.select(".mw-code")[0].prettify().replace('&','&')

print('Saving the script...')

with open(r'./adv-maker/pos-info.txt','w+') as f:

f.write(src)

print('Reading Lua script...')

f = open(r'./adv-maker/pos-info.txt','r')

src = f.read()

f.close()

print('Getting Position Info...')

#...然后提取物品名称、物品分类、在图中的位置等信息,存起来

pat1 = re.compile(r'^\s*{ name = \'(.*)\', id = (.*) }',re.M)

pat2 = re.compile(r'^\s*(.*) = { pos = (.*), section = (.*) }',re.M)

res1 = pat1.findall(src)

res2 = pat2.findall(src)

for cat in res1:

catdict[str(cat[1])] = cat[0]

for itm in res2:

#print('%-45s%-35s%-20s' %(itm[0][2:-2] if(itm[0][0]=='[') else itm[0], catdict[itm[2]], itm[1])) 如果要显示物品列表,把这行的注释符号去掉

itemdict[(itm[0][2:-2] if(itm[0][0]=='[') else itm[0])] = int(itm[1])

def trans_paste(bg,fg,box=(0,0)):

trans = Image.new("RGBA",bg.size)

trans.paste(fg,box,mask=fg)

nim = Image.alpha_composite(bg,trans)

return nim

def show(tar="???",text1="Advancement Made!",color1=(255,255,0),text2="Minecraft Advancements!",color2=(255,255,255)):

idx = 1

if (tar in itemdict):

idx = itemdict[tar]

posx = int((idx - 1) // listsize)

posy = (idx - 1 + listsize) % listsize

print(idx,posx,posy)

sprite = srci.crop((posy*size,posx*size,(posy+1)*size,(posx+1)*size))

box = (17, 16, 17 + size, 16 + size)

resi = trans_paste(advi,sprite,box)

drw = ImageDraw.Draw(resi)

drw.text((60, 12), text1, font=fnt, fill=color1)

drw.text((60, 34), text2, font=fnt, fill=color2)

resi.show()

def main():

init()

global srci, advi, fnt

srci = Image.open('./adv-maker/inv-sprite.png').convert('RGBA')

advi = Image.open('./adv-maker/advancement-base.png').convert('RGBA')

fnt = ImageFont.truetype(r'minecraft.otf', 20)

#fnt = ImageFont.truetype("simsun.ttc", 19) Use this to display Chinese characters

#show('Wooden Pickaxe',text2='Stone Age')

show(text1='Advancement Made!',text2='What the hell is this?')

if __name__ == '__main__':

main()

# print(__name__)

输出:

至此,一个自制的Minecraft成就生成器就算完成了,撒花!

SPECIAL THANKS TO:

用python做我的世界代码_从零开始用Python做一个Minecraft成就(进度)生成器相关推荐

  1. python有什么好玩的代码_可以用 Python 编程语言做哪些神奇好玩的事情?

    Python作为一种应用极为广泛的语言,几乎在任何领域都能派上用场.想做Web有Flask/Django/Tornado:想做分布式有Celery:想做手机App有Kivy:想做数据分析有Pandas ...

  2. python美元汇率兑换程序代码_如何实现python汇率转换代码

    对于刚刚入门python的学习者们,最头疼的莫过于基础的功能实现代码了,很多函数可以实现意义是一样的,今天小编教大家实例--实现python汇率转换代码. Python中的货币转换器 tkinter ...

  3. python无法加载文件系统代码_致命的Python错误:initfsencoding:无法加载文件系统cod...

    我已经创建了一个简单脚本的.exe文件,打算在服务器上运行它,但是我似乎无法找出这个错误的含义,也无法在网上找到任何答案.故障代码如下:Fatal Python error: initfsencodi ...

  4. python的read函数调用报错_从零开始学Python(七):文件存储I/O流和异常捕捉

    这两天在搞小程序开发,耽搁了一下更新的进度,今天补上.一个完整的前端程序肯定离不开数据存储和网络两个模块,今天我们就先来讲讲python中的一种常见数据存储:文件存储!~! 文件存储(I/O操作) 何 ...

  5. python无限循环语句的代码_如何在Python中实现非阻塞无限循环

    我有一个无限循环,从网络摄像头读取视频帧,每个帧将通过一个复杂的功能,需要高计算能力.因此,当显示帧时,由于阻塞代码,程序会感觉有点迟钝. 我现在打算做的是, >仅在目标对象出现时收集前几帧 & ...

  6. python函数模块关键代码_从零开始学Python(六):函数,模块和类的使用

    从这章开始,我们不在使用sublime文本编译器进行编码了,主要是我们每次运行的使用还得去命令行执行pyhon ***.py命令查看结果,操作比较麻烦.推荐大家使用Pycharm(具体安装使用教程大家 ...

  7. python turtle画彩虹的代码_如何用python海龟库画彩虹

    python生成的彩虹效果,大家可以参考: 使用的python版本:3.7.0 ,以下为源代码:# rainbow.py from turtle import * from random import ...

  8. python浅蓝色对应的代码_浅蓝色Python模块不在m上工作

    我正在尝试通过macosx10.7.2上的Python连接到wiimote.在 为此我试着用浅蓝色.运行时:import lightbluePython会给我这个错误.在>>> im ...

  9. python爬取知乎评论_从零开始写Python爬虫 --- 爬虫应用:IT之家热门段子(评论)爬取...

    不知道这里有没有喜欢刷it之家的小伙伴,我反正每天早上醒来第一件事就是打开it之家,看看有没有新鲜的段子 逃~ 其实这次是要来抓取it之家的热门评论,因为数量较多(上万),所以我们这次采用MongoD ...

最新文章

  1. 编写程序实验两个数的加减结果的判断_力学实验1:实验基础与实验仪器
  2. Java 面试,这样拿 Offer!
  3. kdj python实现_一颗韭菜的自我修养:用Python分析下股市,练练手
  4. Archlinux 下的 VMWare Workstation 维护笔记
  5. Office 插件开发和部署的总结
  6. 二叉树的基本操作(c语言)
  7. python-9:nonlocal,指定上一级变量
  8. 一起谈.NET技术,一个MVC分页Helper
  9. 从“规模叙事”迈向“利润叙事”,中国制造背后的“天狼”动力
  10. 【Cadence16.6】安装教程
  11. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  12. 英文标题中哪些词不用大写
  13. 【常用的办公软件】万彩办公大师教程丨文件批量压缩工具
  14. mac datagrip如何建立本地链接
  15. VSCode中调试flutter遇到Android licenses not accepted的错误提示
  16. leet75:颜色分类
  17. 单向一对多和双向一对多
  18. 2021江苏省南通市高考成绩查询时间,2021南通市安全教育平台登录入口网址【最新】...
  19. 自制汉字字库,识别汉字(一)(数字篇)
  20. 在android安卓模拟器BlueStacks蓝手指上使用微信摇一摇

热门文章

  1. C. Serval and Toxel‘s Arrays
  2. 基于互联网而构建的虚拟世界或者共同幻境正“废物化”人类
  3. 我的.emacs(Ubuntu版)(二十二)
  4. Java、模式、美眉、篮球
  5. java强制使用ie打开_使用标记强制关闭IE兼容模式
  6. pureref 平移用不了_参考图管理神器PureRef使用教程(附注册机)
  7. 东方财富函数 量化交易 第001记录 量价研究的开始
  8. uva 796 - Critical Links
  9. Matlab匿名函数(@(var1,...)表达式)
  10. 金字塔原理-演示的逻辑