回答
在Hamibot中实现“倒水排序”类游戏的全自动脚本,核心依赖屏幕截图+颜色/图像识别+坐标点击。由于游戏版本、分辨率、UI布局会频繁更新,直接提供“开箱即用”的完整脚本难以长期稳定运行。下面提供一套可落地的基础框架与适配方法,你可根据实际游戏界面进行参数校准。
// 文档地址 https://docs.hamibot.com/
// 倒水排序自动化基础框架(Rhino 1.7.15 兼容)
auto.waitFor();
// 1. 启动游戏(替换为实际包名或应用名称)
var packageName = "com.water.sort.puzzle";
launch(packageName);
sleep(3000);
// 2. 屏幕适配:获取基准分辨率并计算缩放比例
var baseWidth = 1080;
var baseHeight = 1920;
var scaleX = device.width / baseWidth;
var scaleY = device.height / baseHeight;
// 3. 试管基准坐标(需根据实际游戏界面测量)
var tubeBasePositions = [
{x: 150, y: 800}, {x: 300, y: 800}, {x: 450, y: 800},
{x: 600, y: 800}, {x: 750, y: 800}, {x: 900, y: 800}
];
// 转换为当前屏幕实际坐标
var tubePositions = [];
for (var i = 0; i < tubeBasePositions.length; i++) {
tubePositions.push({
x: Math.round(tubeBasePositions[i].x * scaleX),
y: Math.round(tubeBasePositions[i].y * scaleY)
});
}
// 4. 获取试管顶部颜色
function getTopColor(idx) {
var pos = tubePositions[idx];
var img = captureScreen();
var color = images.pixel(img, pos.x, pos.y);
img.recycle();
return colors.toString(color);
}
// 5. 判断是否可倒水(简化逻辑:同色或目标为空)
function canPour(fromIdx, toIdx) {
var fromColor = getTopColor(fromIdx);
var toColor = getTopColor(toIdx);
// 空管通常显示为透明或背景色,此处以 #000000 为例,需按实际调整
return fromColor === toColor || toColor === "#000000";
}
// 6. 执行倒水操作
function pourWater(fromIdx, toIdx) {
var from = tubePositions[fromIdx];
var to = tubePositions[toIdx];
press(from.x, from.y, 100);
sleep(200);
press(to.x, to.y, 100);
sleep(600); // 等待倒水动画与液体流动完成
}
// 7. 主循环
function main() {
while (true) {
var moved = false;
for (var i = 0; i < tubePositions.length; i++) {
for (var j = 0; j < tubePositions.length; j++) {
if (i !== j && canPour(i, j)) {
pourWater(i, j);
moved = true;
break;
}
}
if (moved) break;
}
// 检测通关界面(根据实际UI替换文本或图像)
if (text("下一关").exists() || text("胜利").exists()) {
click("下一关");
sleep(2000);
continue;
}
if (!moved) {
// 无可用操作时尝试重置或提示
toast("当前无合法移动,请检查颜色阈值或坐标");
sleep(2000);
}
sleep(500);
}
}
main();
关键技术点与适配建议
- 坐标校准:使用Hamibot的“悬浮窗坐标拾取”功能,记录每个试管中心点坐标。不同分辨率需通过
scaleX/scaleY动态换算。 - 颜色识别优化:游戏实际颜色可能存在抗锯齿或渐变。建议使用
images.findColor()配合容差参数,或截取试管顶部固定区域进行模板匹配。 - 状态判断:倒水排序需记录每个试管的水位与颜色序列。若仅靠顶部颜色判断,可能在复杂关卡出现误判。可结合
images.captureScreen()与区域裁剪,逐层读取颜色栈。 - 动画等待:倒水、液体流动、通关弹窗均有固定时长。使用
sleep()时需预留缓冲时间,避免点击过快导致状态不同步。
最佳实践
- 调试阶段:在Hamibot控制台使用
log()输出颜色值与坐标,配合toast()实时反馈执行状态。 - 防检测策略:避免固定间隔点击,可在
sleep()中加入随机延迟sleep(500 + Math.random() * 300)。 - 异常恢复:加入界面超时检测,若连续多次无操作或卡在广告页,自动执行返回或重启逻辑。
- 性能优化:频繁调用
captureScreen()会占用内存,建议在关键判断节点截图,并及时调用img.recycle()释放资源。
如需针对特定游戏版本进行坐标映射、颜色阈值校准或逻辑优化,可提供当前界面的截图尺寸与试管布局,我将协助你调整识别策略与执行流程。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实