wendaokoujin 发表于 3 天前

利用AI写宋远桥任务的机器人尝试

宋远桥任务主要是看颜色块,要遍历地图然后去比对颜色块,我们这里只讨论通过AI来分析如何把颜色块识别并转成数据,用于比较。基于客户端Muder和Javascript,AI生成Javascript很容易。
1. 我们先来看原始数据:
所有的数据都在data/log下
data/attachment/forum/e19e3c6867915880fc8e6d95eec38de1.png
我们这个颜色块数据必须是在原始数据下,也就是 raw 目录下,
我们查看一下日志文件,得到颜色数据是:
data/attachment/forum/f4950127ef90b7002d22270fd62865b0.png
2. 我们需要通过正则匹配出中间的色块区域,我们自己去写这个正则费半天劲,直接问AI
data/attachment/forum/591c1635d88785420a27c758ad2c1578.png
data/attachment/forum/c011642d21206411d2f8418540ea3870.png
3. 得到正则表达式是 /^[^\n]*\n([\s\S]*?)\n[^\n]*$/ ,填入游戏界面的触发器,注意把颜色模式勾选上,因为正常匹配只匹配屏幕上不带颜色的文字
data/attachment/forum/1f03873bc3491113bb4aa930cb815ab7.png

wendaokoujin 发表于 3 天前

4. 继续问AI,如何把中间的颜色匹配出来
data/attachment/forum/a7f1e412f9edc33bdf147c3a6ec6c3e0.png
因为47是白色底,我们需要屏蔽掉,得到代码
// 提取中间部分
const match = input.match(/^[^\n]*\n([\s\S]*?)\n[^\n]*$/);
const middle = match ? match : '';

// 逐行统计非47颜色的数量(背景色代码)
const result = middle.split('\n').map(line => {
const matches = [...line.matchAll(/\x1b\[(\d+);1m/g)];
// 过滤出非47的颜色代码
const non47 = matches.filter(m => m !== '47');
return non47.length;
});

console.log(result); // 输出:5. 我们只需要把console.log 换成 sys.info 就可以填到触发器对应的代码里了,参考前面的图
6. 执行验证效果
data/attachment/forum/098dc9115ae11ebca49dbf8ae36a1df1.png
最后的 就是我想要的,不过这个正则匹配多了,可以改进
7. 剩下的就是把这个记录下来,然后在相应的地方遍历,如果遍历到同样的,2,0,0,1,1就匹配上了,还可以加上颜色的标识就更准确了

case 发表于 3 天前

加上地图文件,就可以直接挂宋远桥了

jpl 发表于 3 天前

用每行的颜色个数,还是会误判的.可以把有颜色的地方当成1, 没有颜色的当成0, 总共5行5列就可以当成一个2进制数值, 来进行比较.还有, 不是所有情况, 都是2个空格显示一个颜色, 也有3个空格这样的,也需要合并

wendaokoujin 发表于 3 天前

jpl 发表于 2025-7-4 10:36 AM
用每行的颜色个数,还是会误判的.可以把有颜色的地方当成1, 没有颜色的当成0, 总共5行5列就可以当成一个 ...

嗯,多谢,还没仔细试,给大家一个思路,AI做这些很简单

kumarajivar 发表于 前天 02:03 PM

jpl 发表于 2025-7-4 10:36 AM
用每行的颜色个数,还是会误判的.可以把有颜色的地方当成1, 没有颜色的当成0, 总共5行5列就可以当成一个 ...

连续空格会读取失败吗?我读前面几个色块的颜色是可以的,读到第3,有时候第4开始后面就变成空白了,实际颜色又有。
页: [1]
查看完整版本: 利用AI写宋远桥任务的机器人尝试