示例:模糊搜索缩小范围
本示例代码演示了如何使用 memory.search 多次搜索缩小范围,最终找到计数器指定的内存地址进行修改。
准备工作
你需要先从 App Store 中搜索 "Vivid Counter",安装并打开此应用,方可运行本示例。
示例代码
--
-- 获取运行中的 App 的进程号
local pid = memory.get_process_id("info.pwfmfx.VividCounter")
assert(pid > 0, "找不到正在运行的 "Vivid Counter"。")
sys.msleep(1000)
--
-- 通过光学字符识别,获取当前计数器的数值
local texts = screen.ocr_text { top = 60, bottom = -60 }
local counter = tonumber(texts[1])
assert(counter, "无法识别当前计数器的数值。")
assert(counter > 0, "当前计数器的数值为 0,请先随便点击几次屏幕后再试。")
assert(counter < 9999, "当前计数器的数值已达上限,请重置计数器再试。")
sys.alert("屏幕识别到当前计数器数值为:" .. tostring(counter) .. ",如果正确,请点击 "好" 继续。")
sys.msleep(1000)
--
-- 在内存中搜索出当前计数器的数值
local data, err
data, err = memory.search(
pid,
true, -- 开始新的搜索
0, -- 从头开始搜索
{ { lv = counter } }, -- 普通搜索
"U64",
0 -- 不限制最大返回结果数量
)
assert(data, err)
sys.alert("开始新的搜索,找到 " .. #data .. " 个结果。")
sys.msleep(1000)
--
-- 开始缩小范围
local loopTimes = 0
while #data > 1 and loopTimes < 5 do
--
-- 随便点击几次屏幕,增加计数器的数值
local tapTimes = math.random(20)
for i=1,tapTimes do
touch.tap(100, 100)
sys.msleep(500)
end
sys.msleep(1000)
counter = counter + tapTimes
sys.alert("当前计数器数值应该为:" .. tostring(counter) .. ",如果正确,请点击 "好" 继续。")
--
-- 在内存中再次搜索当前计数器的数值
data, err = memory.search(
pid,
false, -- 继续上次的搜索
0, -- 从头开始搜索
{ { lv = counter } }, -- 普通精确搜索
"U64",
0 -- 不限制最大返回结果数量
)
assert(data, err)
sys.alert("第 " .. tostring(loopTimes + 2) .. " 轮搜索,找到 " .. #data .. " 个结果。")
sys.msleep(1000)
--
loopTimes = loopTimes + 1
end
--
-- 检查并确保搜索结果只有一个
sys.msleep(1000)
assert(#data == 1, "无法定位到计数器所在的内存地址。")
--
-- 读取并打印搜索到的内存地址数值是否和预期一致
local value
value, err = memory.read(pid, data[1], "U64")
assert(value, err)
assert(value == counter, "计数器数值与预期不符。")
sys.alert("计数器数值符合预期,点击 "好" 以修改它。")
sys.msleep(1000)
--
-- 写入新的数值为 9998
local ok
ok, err = memory.write(pid, data[1], "U64", 9998)
assert(ok, err)
sys.alert("计数器内存数值已被修改为 9998,点击 "好" 以点击屏幕使其刷新显示。")
sys.msleep(1000)
--
-- 再次点击屏幕,使得写入的数值生效
touch.tap(100, 100)
sys.msleep(1000)
--
-- 此时,计数器的数值应该是 9999
-- 通过光学字符识别,获取当前计数器的数值
texts = screen.ocr_text { top = 60, bottom = -60 }
counter = tonumber(texts[1])
assert(counter == 9999, "计数器数值与预期不符。")
sys.alert("屏幕识别到当前计数器的数值与预期相符,点击 "好" 以结束本示例。")