cbbl 发表于 2024-4-16 02:29

minecraft文档转成书

本帖最后由 cbbl 于 2024-4-17 05:58 编辑

新人学习,代码有问题欢迎讨论指正
import pyperclip


def modified_width(char):
    global width
    char_width = {'%': 10, '^': 10, '&': 10, '*': 6, '(': 6, ')': 6, '_': 10, '-': 10, '+': 10, '=': 10, '{': 6,
                  '[': 6, '}': 6, ']': 6, '|': 2, '\\': 10, ';': 2, ':': 2, '"': 6, "'": 6, '<': 8, '>': 8, ',': 2,
                  '.': 2, '?': 10, '/': 10, 't': 6, 'i': 2, 'I': 6, 'f': 8, 'k': 8, 'l': 4, ' ': 6, ' ': 16, '”': 6,
                  '“': 6}
    if char in char_width:# 半角符号 部分英文 空格
      width += char_width
    elif 0x20 <= ord(char) <= 0x7E:# 部分英文
      width += 10
    elif 0x4e00 <= ord(char) <= 0x9fff:# 汉字
      width += (15 + 1)
    elif 0x3000 <= ord(char) <= 0x303F:# 中文符号
      if char == '…':
            width += 14
    else:
      width += (15 + 1)
    width += 2


def arch_pages(_page):# 归档page
    global page
    page = r'\\n'.join(_page)
    page = f"'{{\"text\":\"{page}\"}}'"
    pages.append(page)
    page = []


# 书拆分成句子
with open("book.txt", "r", encoding="UTF-8") as f:# 需要转换的文档book.txt
    char_list = []
    line_list = []
    while True:
      para = f.readline()
      if para:
            # 处理上一段落末尾
            if char_list:
                line_list.append(''.join(char_list).strip('\n'))# 归档这一行
            width = 0
            if char_list:
                modified_width(char)
            char_list = []
            for char in para:
                modified_width(char)# 长度修正
                if width > 228:
                  line_list.append(''.join(char_list).strip('\n'))# 归档这一行
                  width = 0
                  modified_width(char)
                  char_list =
                else:
                  # 补充行列表
                  char_list.append(char)
      if not para:
            # 处理文章末尾
            if char_list:
                line_list.append(''.join(char_list).strip('\n'))# 归档这一行
                width = 0
                modified_width(char)
            break

# 句子打包成页
i = 0
page = []
pages = []

for line in line_list:
    i += 1
    if i <= 14:
      pass
    else:
      i = 1
      arch_pages(page)
    page.append(line)
if page:# 处理文章末页
    arch_pages(page)
pages = ','.join(pages)

# 书籍信息
title = '书名'
author = 'cbbl'
display = '{Lore:["书籍介绍"]}'
version = '1.20'# 修改为需要导入的版本

if int(version.replace('1.', '')) <= 12:
    number = ' 1 0 '
else:
    number = ''
if int(version.replace('1.', '')) >= 15:
    pass
else:
    pages = pages.replace('"text"', r'\"text\"')
if int(version.replace('1.', '')) < 8:
    print('该版本give指令仅支持空白成书')
else:
    command = f'give @p written_book{number}{{pages:[{pages}],title:{title},author:{author},display:{display}}}'
    command.replace(r'\\n', '')
    pyperclip.copy(command)
    print('指令已复制到剪贴板')


补充,游戏内指令输入长度有限制,可以用数据包方式导入指令
已修改一个版本号处理上的错误

codeaftercode 发表于 2024-4-16 08:18

很久没玩过minecraft啦

smartfind 发表于 2024-4-16 08:40

这个看着不错,学习了!

三滑稽甲苯 发表于 2024-4-16 09:57

这个想法不错,等会试试

hjxhjxjx 发表于 2024-4-16 12:22

???有点看不懂,是mc游戏存档吗?里面的书?

cbbl 发表于 2024-4-17 02:02

hjxhjxjx 发表于 2024-4-16 12:22
???有点看不懂,是mc游戏存档吗?里面的书?

mc允许玩家用它自带的指令给予玩家修改好自定内容的成书物品,这个的作用是是把外部文字整合成游戏给定的格式以供导入游戏

Gxd1703 发表于 2024-4-18 06:32

这个不错,谢谢分享。
页: [1]
查看完整版本: minecraft文档转成书