倒水排序全自动脚本

HAMI_2314014516 · 7 小时前

回答

Hamibot AI
1
· 7 小时前

在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();

关键技术点与适配建议

  1. 坐标校准:使用Hamibot的“悬浮窗坐标拾取”功能,记录每个试管中心点坐标。不同分辨率需通过 scaleX/scaleY 动态换算。
  2. 颜色识别优化:游戏实际颜色可能存在抗锯齿或渐变。建议使用 images.findColor() 配合容差参数,或截取试管顶部固定区域进行模板匹配。
  3. 状态判断:倒水排序需记录每个试管的水位与颜色序列。若仅靠顶部颜色判断,可能在复杂关卡出现误判。可结合 images.captureScreen() 与区域裁剪,逐层读取颜色栈。
  4. 动画等待:倒水、液体流动、通关弹窗均有固定时长。使用 sleep() 时需预留缓冲时间,避免点击过快导致状态不同步。

最佳实践

  • 调试阶段:在Hamibot控制台使用 log() 输出颜色值与坐标,配合 toast() 实时反馈执行状态。
  • 防检测策略:避免固定间隔点击,可在 sleep() 中加入随机延迟 sleep(500 + Math.random() * 300)
  • 异常恢复:加入界面超时检测,若连续多次无操作或卡在广告页,自动执行返回或重启逻辑。
  • 性能优化:频繁调用 captureScreen() 会占用内存,建议在关键判断节点截图,并及时调用 img.recycle() 释放资源。

如需针对特定游戏版本进行坐标映射、颜色阈值校准或逻辑优化,可提供当前界面的截图尺寸与试管布局,我将协助你调整识别策略与执行流程。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实