top

DOTA2版一言的制作

本文最后修改于 269 天前,部分内容可能已经过时!


由于无耻的暴力剽窃了熊猫大佬的博客皮肤版式,但是调用的Hitokoto都是一些自己没见过的句子,于是萌生了自己做一个类似接口的想法。题材选择了每个人物都有大量台词的DOTA2!

共分为两步:

  1. 制作句库
  2. 启动接口

接口使用了小霖大佬制作的php版


制作句库

首先要找到DOTA2英雄的台词文本
用SteamDatabase制作的反编译器解包dota 2 beta\game\dotapak01_dir.vpk文件,resource文件夹下的.dat就是我们所需的英雄台词文本。
decompiler
但是这些文本使用的是UTF-16 LE编码,查看的话最好转换成UTF-8编码,或者直接下载大佬提取并转换编码后的文件

但是,如果直接用本文编辑器打开会发现文件中有大量的乱码以及无意义字符中间夹着我们要的中文台词,非常影响阅读!
word
由于最近正好学习了下正则表达式,决定自己做一个过滤器,去掉乱码保留文字的小程序。

1.替换停止符

因为正则表达式是针对字符串操作的,而这个文件中包含了大量的0x00(结束符),程序读取字符串是遇到0x00就会认为字符串没了而停止,所以首先读取文件并将文件中所有的0*00替换为0x0a(换行符)

//从文件读取
FILE *fp;
fp = fopen(fileRead, "r");
char buffer[1024*100];
memset(buffer, 0, sizeof(buffer));
fread(buffer, 1024*100, 1, fp);

//将0x00替换为0x0a换行符
int i = 0;
for (i; i < sizeof(buffer); i++)
{
    if (buffer[i] == 0x00)
    {
        buffer[i] = 0x0a;
    }
}
string strtemp;
strtemp = buffer;
fclose(fp);

2.截取可读文字部分

因发现所有的可读文字开始前和结束后都有很多%s1字符,所以以他为界将第一个%s1和最后一个%s1中间的字符截取出来,并且再过一次正则筛选出所有的中文,\u4e00-\u9fa5为unicode汉字范围,第一次测试发现只用汉字范围会忽略很多汉字符号,所以后面加上了汉字符号的unicode代码。

//截取第一个"%s1"和最后一个"%s1"之间的字符
string strsub;
int first = strtemp.find_first_of("%s1");
int last = strtemp.find_last_of("%s1");
strsub = strtemp.substr(first, last - first);

//中文,句号,问号,逗号,换行
regex s(u8"[\u4e00-\u9fa5\u3002\uff1f\uff0c\u000a]");
smatch sm;
string strRegex;
while (regex_search(strsub, sm, s))
{
    strRegex += sm.str();
    strsub = sm.suffix();
}

3.去掉多余的换行符

由于文件中本来有大量连续的0x00(结束符),在第一步都被替换成了换行符导致文件中会出现大量连续的换行符,于是再过一遍正则,将两个连续的换行符替换为,这样正常语句后的换行符不受影响,多余连续的换行符会被删掉,最后写入文件。

//去掉两个连着的换行符
regex r(u8"[\u000a]+[\u000a]");
string strReplaced;
strReplaced=regex_replace(strRegex, r, "");

//写入文件
FILE *fwp;
fwp = fopen(fileWrite, "w+");
fwrite(strReplaced.c_str(), strReplaced.length(), 1, fwp);
fclose(fwp);

最后在依次获取文件夹中的文件名,循环调用这串代码就将所有英雄的中文台词提取出来啦!

效果如下。
word3.jpg

启动接口

小霖大佬做的php文件直接丢到服务器目录,将筛选出来的句子整合到一个文件改名为Hitokoto.txt放在和php同一个目录下,再将php文件中的句子数量修改为实际句子数量,修改一下路由跳转,就完工啦!

成果

我的api地址:https://api.huii.xyz/hitokoto
成功调用的效果
效果

Tags:代码游戏
上一篇
下一篇

添加新评论

已有 1 条评论

 穆雷 10 个月前 • |

穆雷牛逼!