度大师IDE 函数开发文档
面向小白的安卓自动化脚本开发手册。所有函数在手机(真机 / 模拟器 / 打包后的 APK)上由 Lua 引擎提供,按本文调用即可,无需安装任何第三方库。
开始使用
了解项目结构、运行方式与所需权限,3 分钟跑通第一个脚本。
简介与项目结构
一个脚本项目是怎么组成的
在 IDE 点「新建脚本」,填写名字后会自动生成一个项目文件夹,包含入口文件、界面文件和图片目录。
我的脚本/
├── main.lua -- 入口文件:脚本逻辑写在这里(先弹界面、再执行任务)
├── ui.lua -- 界面文件:定义运行前弹出的配置界面(卡密、选项等)
└── image/ -- 图片文件夹:存放找图用的素材 PNG各文件职责
| main.lua | 程序入口。用 showUI 弹出界面、拿到用户填写的值,验证卡密后执行点击、滑动、找图等任务。 |
| ui.lua | 界面描述表,return { pages = {...} }。main.lua 里用 require("ui") 加载。 |
| image/ | 找图素材目录。用「屏幕抓图工具」框选按钮后点「存为找图素材」,会自动裁剪 PNG 存到这里。 |
提示
复杂脚本可以在「项目文件」面板右键新建更多 .lua 文件和文件夹,用
require 拆分加载,便于管理。三种运行方式对比
「运行」「真机测试」「打包APK」有什么区别
IDE 提供三种执行方式,分别用于调试、实测和发布,按需选择。
| 方式 | 在哪执行 | 真实点击/联网 | 费用 | 用途 |
|---|---|---|---|---|
| 运行 | 电脑内置模拟器 | 否,只打印模拟日志 | 免费 | 快速验证逻辑、语法、流程走向 |
| 真机测试 | 手机 / 模拟器 | 是,真实操作设备 | 免费 | 调试阶段实测,自动编译安装 |
| 云端打包 | 云端构建正式 APK | 正式签名、可分发 | 0.1 元/次 | 发布给最终用户安装 |
注意
电脑「运行」不会真正点击手机、也不会真正联网请求服务器,界面按默认值自动确认;要看到真实 UI 弹窗和操作效果,请用「真机测试」。
权限与无障碍说明
运行前需要开启的权限
自动化操作依赖系统的无障碍服务与悬浮窗权限,首次使用按提示开启即可。
| 权限 | 作用 | 哪些函数需要 |
|---|---|---|
| 无障碍服务 | 模拟点击、滑动、按键、输入与屏幕截图 | tap / swipe / key / input / 取色找图 |
| 悬浮窗 | 显示悬浮球、悬浮 Toast 提示 | toast、悬浮球控制 |
| Android 11 及以上 | 无障碍截屏能力(取色 / 找色 / 找图的前提) | getColor / findColor / findImage |
开启步骤
- 安装并打开 App,按首页提示点「开启无障碍服务」,在系统列表中找到度大师并打开。
- 按提示授予「悬浮窗 / 显示在其他应用上层」权限。
- 回到 IDE 或 App 重新运行脚本即可。未开启无障碍时,日志会明确提示「无障碍服务未开启」。
UI 界面开发
运行脚本后在手机上弹出配置界面,让用户填卡密、选参数,确认后再后台执行任务。
showUI弹出参数配置界面
根据控件表在手机上弹出参数表单,用户点「确定」返回填写结果表;点「取消」返回 nil。支持单页与多页 Tab。
函数签名
local r = showUI(spec [, title])参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| spec | table | 是 | 控件描述表。单页直接写一维数组 { {type=...}, ... };多页写 { pages = { {title=, items={...}}, ... } }。 |
| title | string | 否 | 弹窗标题,默认 "参数设置"。 |
返回值
用户点确定 → 结果 table,用
r.键名 取值(各控件返回类型见下表);点取消 → nil。最简单的例子
local r = showUI({
{ type = "text", text = "请填写信息" },
{ type = "edit", key = "name", text = "昵称", default = "小白" },
{ type = "check", key = "agree", text = "我已阅读说明", default = true },
}, "我的设置")
if r == nil then
toast("已取消")
return
end
toast("你好," .. r.name)控件类型总览
8 种 UI 控件及返回类型
每个控件是一个 table,
type 决定控件种类,key 决定结果表里的字段名。text
说明文字,只展示
返回:无(不需要 key)
edit
单行输入框
返回:
字符串password
密码输入框(隐藏字符)
返回:
字符串multiline
多行输入框
返回:
字符串radio
单选按钮组(配 options)
返回:
序号(从 1)check
单个勾选框
返回:
true/falsecheckgroup
多选框组(配 options)
返回:
序号数组spinner
下拉选择框(配 options)
返回:
序号(从 1)控件通用字段
| type | 控件类型,取上面 8 个值之一。 |
| key | 结果键名。main 中用 r.key 取值;text 控件可省略。 |
| text | 控件标签 / 显示文字。 |
| default | 默认值:输入类填字符串,check 填布尔,radio/spinner 填序号,checkgroup 填序号数组 {1,3}。 |
| options | 选项数组,仅 radio / checkgroup / spinner 需要,如 options = {"快速","正常"}。 |
| orientation | 选项排列方向,仅 radio / checkgroup 需要:"vertical" 竖排(默认)、"horizontal" 横排自动换行。 |
多页面与横/竖排
多个页面、选项横排或竖排
界面可以有多个 Tab 页面,顶部左右切换;radio 和 checkgroup 的选项可自由设置横排或竖排。
多页面写法(ui.lua)
return {
pages = {
{
title = "卡密登录",
items = {
{ type = "edit", key = "kami", text = "卡密", default = "" },
}
},
{
title = "任务设置",
items = {
-- 横排单选:选项短、数量少时用
{ type = "radio", key = "mode", text = "模式",
options = { "快速", "正常", "慢速" }, default = 2,
orientation = "horizontal" },
-- 竖排多选(默认,orientation 可省略)
{ type = "checkgroup", key = "tasks", text = "任务",
options = { "签到", "领奖", "打怪" }, default = { 1, 2 },
orientation = "vertical" },
}
},
}
}规则
所有页面控件的
key 不能重复;确定时所有页面的结果会合并到同一张表,main 里用 r.键名 统一取值,不分页。如何获取界面的值
UI 里填的变量,在 main.lua 中怎么拿
这是最核心的一步:showUI 返回结果表 r,不同控件返回不同类型,下面是完整可运行对照。
第一步:ui.lua 定义控件
return {
{ type = "edit", key = "account", text = "账号", default = "test001" },
{ type = "password", key = "pwd", text = "密码", default = "123456" },
{ type = "radio", key = "mode", text = "模式", options = { "快速", "正常", "慢速" }, default = 2 },
{ type = "spinner", key = "server", text = "区服", options = { "一区", "二区", "三区" }, default = 1 },
{ type = "check", key = "vip", text = "开启VIP", default = false },
{ type = "checkgroup", key = "tasks", text = "任务", options = { "签到", "领奖", "打怪" }, default = { 1, 2 } },
}第二步:main.lua 取值
local ui = require("ui")
local r = showUI(ui, "登录与设置")
if r == nil then return end -- 用户取消
-- 输入类:字符串
log("账号 = " .. r.account)
log("密码 = " .. r.pwd)
-- radio / spinner:选中序号(数字,从 1 开始)
log("模式序号 = " .. r.mode) -- 2
log("区服序号 = " .. r.server) -- 1
-- 想把序号转成文字,自己建一个名称表按下标取
local modeNames = { "快速", "正常", "慢速" }
log("模式文字 = " .. modeNames[r.mode]) -- 正常
-- check:布尔值
if r.vip then log("已开启VIP") end
-- checkgroup:序号数组,用 ipairs 遍历
local taskNames = { "签到", "领奖", "打怪" }
for _, idx in ipairs(r.tasks) do
log("需要执行:" .. taskNames[idx])
end返回类型对照表
| 控件 | r.key 的类型 | 示例结果 |
|---|---|---|
| edit / password / multiline | string | r.account = "test001" |
| radio / spinner | number(序号) | r.mode = 2 |
| check | boolean | r.vip = false |
| checkgroup | 序号 table | r.tasks = {1,2} |
输入框 / 确认框 / 消息框
三个轻量对话框
不需要设计完整表单时,用这三个函数快速获取一段文字、一个确认,或提示一条消息。
inputBox —— 单值输入
local s = inputBox([标题, 默认值])
-- 例:
local name = inputBox("请输入昵称", "小白")
if name == nil then return end -- 点取消返回 nil
toast("你好," .. name)| 标题 | string | 否 | 默认 "请输入" |
| 默认值 | string | 否 | 默认空字符串 |
返回:确定 → 字符串;取消 →
nilconfirmBox —— 确认选择
local ok = confirmBox([消息, 标题])
-- 例:
local sure = confirmBox("确定要开始执行吗?", "温馨提示")
if not sure then return end返回:确定 →
true;取消 → falsemsgBox —— 消息提示(无返回值)
msgBox([消息, 标题])
-- 例:
msgBox("任务已全部完成", "提示")参数顺序
inputBox 第一个参数是「标题」;confirmBox 和 msgBox 第一个参数是「消息内容」、第二个才是「标题」,别写反。
触摸与按键
模拟手指点击、长按、滑动,以及系统按键和文本输入,全部依赖无障碍服务。
需无障碍
tap / click单击屏幕坐标
在指定坐标点模拟一次手指单击。tap 和 click 完全等价,用哪个都行。
tap(x, y)
click(x, y)| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| x | number | 是 | 横坐标(像素)。 |
| y | number | 是 | 纵坐标(像素)。 |
-- 先取屏幕尺寸,点屏幕正中间
local s = getScreenSize()
tap(s.width / 2, s.height / 2)
sleep(500)
-- 点固定坐标
tap(444, 412)坐标怎么来
用 IDE「屏幕抓图工具」连接设备后,鼠标移到哪就显示该点坐标,直接填入即可。
需无障碍
longClick长按某坐标
在指定坐标按住一段时间后松开,可用于拖拽触发、弹出菜单等。
longClick(x, y [, duration])| x, y | number | 是 | 长按坐标。 |
| duration | number | 否 | 长按时长(毫秒),默认 800。 |
longClick(500, 800) -- 长按 0.8 秒
longClick(500, 800, 1500) -- 长按 1.5 秒需无障碍
swipe从一点滑到另一点
模拟手指从起点滑动到终点,可控制滑动时长,常用于翻页、拖动滑块。
swipe(x1, y1, x2, y2 [, duration])| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| x1,y1 | number | 是 | 起点坐标。 |
| x2,y2 | number | 是 | 终点坐标。 |
| duration | number | 否 | 滑动时长(毫秒),默认 300。时间越长滑得越慢。 |
local s = getScreenSize()
-- 从右向左滑(翻到下一页)
swipe(s.width * 0.8, s.height / 2, s.width * 0.2, s.height / 2, 300)
-- 从下向上滑(向上滚动)
swipe(s.width / 2, s.height * 0.8, s.width / 2, s.height * 0.2, 400)需无障碍
key模拟系统按键
通过无障碍全局动作模拟常用系统按键,无需 root。
key(name)| name 取值 | 动作 |
|---|---|
| "home" | 回到主屏幕 |
| "back" | 返回上一级 |
| "recent" / "recents" | 打开最近任务(多任务)界面 |
| "notifications" | 下拉通知栏 |
| "quicksettings" | 打开快捷设置面板 |
| "power" | 弹出电源(关机)对话框 |
key("home")
sleep(1000)
key("back")大小写
参数不区分大小写;传入不支持的按键名时,日志会提示「不支持的按键」。
需无障碍
input向输入框输入文本
先把光标聚焦到目标输入框,再调用本函数输入文字;找不到输入框时会自动写入剪贴板。
input(text)| text | string | 是 | 要输入的文字内容。 |
tap(360, 400) -- 先点输入框使其聚焦
sleep(500)
input("我的账号123") -- 输入文字说明
若系统未找到可输入的焦点,函数会把文字写入剪贴板,并在日志注明「未找到输入框,已写入剪贴板」,此时可长按粘贴。
找图找色
基于无障碍屏幕截图,识别屏幕上的颜色或图片,实现“看到按钮再点”的智能操作。需 Android 11 及以上。
Android 11+
getColor读取某点颜色
截取当前屏幕并返回指定坐标点的颜色值(0xRRGGBB)。
local c = getColor(x, y)| x, y | number | 是 | 要取色的坐标。 |
返回:颜色整数
0xRRGGBB;截屏失败或坐标越界时返回 0。local c = getColor(500, 300)
log(string.format("颜色 = 0x%06X", c))
if c == 0xFF0000 then
log("这个点是红色")
endAndroid 11+
findColor在区域内寻找颜色
在指定矩形区域内查找与目标颜色相近的第一个点,返回其坐标。
local p = findColor(color, x1, y1, x2, y2 [, sim])| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| color | number | 是 | 目标颜色,如 0xFF0000。 |
| x1,y1,x2,y2 | number | 是 | 搜索区域左上角与右下角坐标。 |
| sim | number | 否 | 相似度 0~1,默认 0.9。值越大要求越接近。 |
找到 → 坐标表
{ x=, y= };未找到 → { x=-1, y=-1 }。local p = findColor(0x00B96B, 0, 800, 720, 1200, 0.9)
if p.x ~= -1 then
tap(p.x, p.y)
else
log("没有找到该颜色按钮")
end容差
内部按
容差 = 255 × (1 - sim) 计算并限制在 5~60 之间;颜色有轻微差异时可适当调小 sim(如 0.85)。Android 11+
findImage在屏幕上查找图片
用 image 文件夹里的素材图在屏幕(或指定区域)中匹配,返回命中位置的中心点坐标。
local p = findImage(path [, x1, y1, x2, y2 [, sim]])| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 素材相对路径,如 "image/btn.png"。 |
| x1..y2 | number | 否 | 搜索区域;省略则全屏查找。 |
| sim | number | 否 | 相似度阈值 0~1,默认 0.9。 |
找到 →
{ x=, y=, score= }(x/y 为素材中心点,score 为 0~1 相似度);未找到 → { x=-1, y=-1 }。-- 全屏找图
local p = findImage("image/btn.png")
if p.x ~= -1 then
tap(p.x, p.y)
log("相似度 " .. math.floor(p.score * 100) .. "%")
else
log("未找到图片")
end
-- 指定区域 + 相似度
local q = findImage("image/start.png", 0, 600, 720, 1000, 0.85)
if q.x ~= -1 then tap(q.x, q.y) end算法说明
找图为引擎内置的纯 Java 像素匹配,不依赖 OpenCV,采用“粗扫(步长 4)+ 精配(步长 1)”两级模板匹配,速度快且支持 PNG 透明区域(透明像素不参与比对)。
Android 11+
waitImage等待图片出现
在超时时间内反复截图查找,直到素材出现返回 true;适合等待页面加载、按钮弹出。
local ok = waitImage(path [, timeout [, sim]])| path | string | 是 | 素材相对路径。 |
| timeout | number | 否 | 超时时间(毫秒),默认 5000(5 秒)。 |
| sim | number | 否 | 相似度,默认 0.9。内部每 300 毫秒截图查找一次。 |
在超时内出现 →
true;超时仍未出现 → false。-- 最多等 10 秒,直到“进入游戏”按钮出现
if waitImage("image/enter.png", 10000, 0.9) then
local p = findImage("image/enter.png")
tap(p.x, p.y)
else
toast("等待超时,请检查网络")
exitScript()
end素材目录与抓图工具
如何制作并使用找图素材
找图素材是从真实屏幕上裁剪下来的小图(PNG),配合 IDE 的「屏幕抓图工具」一键完成。
- 连接设备后打开 IDE 的「屏幕抓图工具」(独立窗口,可任意拖动,不遮挡编辑区)。
- 工具实时显示设备画面,鼠标移动即显示当前坐标和该点颜色。
- 用鼠标在画面上框选目标按钮 / 图标的范围。
- 点「存为找图素材」,在弹出的确认框命名,工具会自动裁剪成 PNG 存入项目
image/文件夹,并插入对应的 findImage 代码。
抓图工具的功能
| 坐标拾取 | 实时显示鼠标所在点的 (x, y),供 tap 使用。 |
| 取色 | 显示该点 0xRRGGBB 颜色值,供 getColor / findColor 使用。 |
| 框选范围 | 拖出矩形,得到区域坐标,供区域找图 / 找色使用。 |
| 截图 / 存素材 | 保存整屏,或把框选区域裁剪成 PNG 素材。 |
重要
素材必须放在项目
image/ 文件夹并随脚本一起推送 / 打包,否则真机上会提示「找不到找图素材」。素材尽量裁剪紧凑、只保留目标本身,可带透明背景以提高匹配率。设备与系统
延时、提示、日志、屏幕与设备信息、脚本退出等基础能力。
sleep延时等待
让脚本暂停指定的毫秒数,再继续往下执行。等待期间仍可被「暂停 / 停止」即时打断。
sleep(ms)| ms | number | 是 | 等待时长(毫秒)。1 秒 = 1000 毫秒。 |
toast("3 秒后开始")
sleep(3000) -- 等 3 秒
tap(500, 500)
sleep(500) -- 等 0.5 秒可打断
sleep 内部按 50 毫秒切片检查运行状态,所以点悬浮球「暂停 / 停止」时无需等满延时,立即生效。
toast屏幕悬浮提示
在屏幕上短暂弹出一条文字提示。优先走悬浮窗,应用退到后台仍可见,必要时自动回退系统 Toast。
toast(text)| text | string | 是 | 要提示的文字。 |
toast("脚本开始运行")
sleep(2000)
toast("执行完成")与 log 区别
toast 显示在手机屏幕上给最终用户看;log 只输出到 IDE / App 的日志窗口,用户在手机上看不到。
log / print输出日志
把信息输出到日志窗口,便于调试观察。两者等价,可同时传多个参数,参数间用制表符分隔。
log(...)
print(...)log("===== 脚本开始 =====")
local x = 100
log("x 的值是", x) -- 多参数,自动用 tab 分隔
log("结果 = " .. tostring(x))
log("===== 脚本结束 =====")getScreenSize获取屏幕宽高
返回当前设备屏幕的像素宽度和高度,用于按比例计算坐标,适配不同分辨率。
local s = getScreenSize()
-- s.width 屏幕宽度(像素)
-- s.height 屏幕高度(像素)返回表:
{ width=, height= }。local s = getScreenSize()
log("屏幕:" .. s.width .. " x " .. s.height)
-- 用比例而不是固定坐标,换分辨率也不会点错
tap(s.width / 2, s.height * 0.9) -- 水平居中、靠近底部getDeviceId获取设备唯一码
返回本机的唯一设备码,卡密平台用它把卡密和设备绑定(一机一码)。kamiVerify 内部已自动调用,通常无需手动取。
local id = getDeviceId()返回:设备码字符串(基于 Android ANDROID_ID;取不到时回退为
"dudashi-xxxx-xxxx")。local id = getDeviceId()
log("本机设备码 = " .. id)exitScript立即退出脚本
立即终止脚本,后面的代码不再执行。常用于卡密验证失败、条件不满足时提前结束。
exitScript([提示文字])| 提示 | string | 否 | 退出原因,会显示在日志中。 |
if not ok then
exitScript("条件不满足,脚本结束")
end
-- 这里的代码在上面退出后不会执行
log("不会走到这里")与 return 区别
return 只是结束当前函数 / 入口 chunk;exitScript 会强制终止整个脚本运行,效果更彻底,卡密失败场景应使用它。网络与数据
发起 HTTP 网络请求、处理 JSON 数据,用于对接自己的服务器接口。
httpGet / httpPost同步网络请求
发起 HTTP 请求并等待返回,得到响应体和 HTTP 状态码两个结果。连接与读取超时各 12 秒。
local body, code = httpGet(url)
local body, code = httpPost(url, body)| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 完整请求地址,如 "http://api.example.com/data"。 |
| body | string | 否 | 仅 httpPost:提交的内容,默认空字符串。 |
成功 → 返回两个值:响应体(字符串) 和 状态码(数字,如 200);网络异常 / 超时 →
"", 0。-- GET 请求
local ret, code = httpGet("http://api.example.com/info?id=1")
if code == 200 then
log("返回:" .. ret)
else
toast("请求失败,状态码 " .. tostring(code))
end
-- POST 请求
local r2, c2 = httpPost("http://api.example.com/login",
"user=test&pwd=123456")
log(r2, c2)多返回值
两个函数都返回「响应体, 状态码」两个值,必须用两个变量接收;电脑「运行」时不真正联网,只有真机才会真正请求。
jsonLib.decode / jsonLib.encodeJSON 与 Lua 表互转
把服务器返回的 JSON 字符串解析成 Lua 表,或把 Lua 表编码成 JSON 字符串提交。
local t = jsonLib.decode(str) -- JSON 字符串 -> Lua 表
local s = jsonLib.encode(t) -- Lua 表 -> JSON 字符串decode 成功 → Lua 表,格式错误 →
nil;encode 成功 → JSON 字符串,失败 → "{}"。local ret, code = httpGet("http://api.example.com/user")
if code == 200 then
local data = jsonLib.decode(ret)
if data then
log("姓名:" .. data.name)
log("年龄:" .. tostring(data.age))
end
end
-- 把表编码成 JSON
local obj = { name = "小白", vip = true }
log(jsonLib.encode(obj)) -- {"name":"小白","vip":true}对应关系
JSON 对象 → Lua 表(键值对),JSON 数组 → Lua 表(数字下标,从 1 开始);数字、布尔、字符串自动对应。
卡密验证
一键接入卡密登录,自动上送设备码、校验有效期,无需自己编写函数体。
kamiVerify内置卡密验证(一键调用)
传入你的应用 ID 和用户输入的卡密,引擎自动读取设备码并请求卡密平台校验。成功提示到期时间并返回 true;任何失败都会提示原因并自动退出脚本。
local ok = kamiVerify(appid, kami)| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appid | string | 是 | 你在卡密平台申请到的应用 ID(替换 main.lua 顶部的 "你的APPID")。 |
| kami | string | 是 | 用户在界面输入的卡密,通常取 r.kami。 |
验证成功 → 悬浮提示「验证成功!到期时间:…」并返回
true;空卡密 / 卡密错误 / 无网络 / 未配置 APPID → 提示具体原因并 exitScript 终止,返回 false。标准用法(配合默认卡密界面)
local APPID = "你的APPID" -- 改成你在卡密平台的应用 ID
local ui = require("ui")
local r = showUI(ui, "登录")
if r == nil then return end
-- 只要这一行:自动上送设备码、校验卡密、提示到期时间
local ok = kamiVerify(APPID, r.kami)
if not ok then return end
-- 验证通过,下面才是正式任务
toast("登录成功,开始执行")
sleep(1000)设备码
验证时会自动把
getDeviceId() 作为 markcode 上送,卡密后台可看到并绑定该设备;无需手动获取或拼接请求。模块化
把脚本拆到多个 lua 文件,按需加载,便于组织复杂项目。
require加载项目内其他 lua 文件
加载并执行项目中的另一个 lua 文件,返回其 return 值。同一文件多次 require 只执行一次(带缓存)。
local m = require(name)| name | string | 是 | 模块名。可写 "ui"、"ui.lua",点分名 "game.utils" 会按 game/utils.lua 查找。 |
返回被加载文件的
return 值;文件没有 return 时返回 true;找不到模块时日志报错并返回 nil。例子:自定义一个工具模块
-- utils.lua
local M = {}
function M.sayHi(name)
toast("你好," .. name)
end
return M
-- main.lua
local utils = require("utils")
utils.sayHi("小白")
-- 加载界面
local ui = require("ui")新建文件
在「项目文件」面板右键即可新建 lua 文件或文件夹;模块文件放好后用 require 加载,注意名字与文件路径对应。
Lua 语言基础
脚本使用 Lua 语言编写,这里是最常用的语法,零基础也能快速上手。
语法速查
最常用的 Lua 语法
注释、变量与类型
-- 这是单行注释
--[[ 这是
多行注释 ]]
local n = 100 -- 数字
local name = "小白" -- 字符串(单双引号都行)
local ok = true -- 布尔:true / false
local t = nil -- nil 表示空
local s = "你好," .. name -- 两个点 .. 拼接字符串
local len = #name -- # 取字符串长度 / 表元素个数条件判断 if
local score = 80
if score >= 90 then
log("优秀")
elseif score >= 60 then
log("及格")
else
log("不及格")
end
-- 比较:== 等于 ~= 不等于 > < >= <=
-- 逻辑:and 与 or 或 not 非循环 while / for / repeat
-- while 循环(满足条件就一直执行)
local i = 1
while i <= 5 do
log("第 " .. i .. " 次")
i = i + 1
end
-- 数字 for:for 变量=起点,终点,步长
for j = 1, 5 do -- 步长省略默认为 1
log(j)
end
for j = 10, 1, -1 do -- 倒序
log(j)
end
-- 遍历表:pairs 遍历所有键值,ipairs 只遍历数字下标
local arr = { "a", "b", "c" }
for idx, v in ipairs(arr) do
log(idx, v)
end
-- repeat ... until:先执行再判断
local k = 1
repeat
k = k + 1
until k >= 3函数 function
-- 定义函数
function add(a, b)
return a + b
end
local r = add(3, 5)
log(r) -- 8
-- 局部函数(推荐,前面加 local)
local function greet(who)
toast("你好 " .. who)
end
greet("小白")表 table(最常用的数据结构)
-- 数组(数字下标,从 1 开始)
local list = { "签到", "领奖" }
table.insert(list, "打怪") -- 末尾添加
log(list[1]) -- 签到
-- 键值表(类似字典)
local user = { name = "小白", vip = true }
log(user.name)
user.age = 18 -- 新增字段常用内置转换
| tostring(x) | 转成字符串。 |
| tonumber(x) | 转成数字,无法转换返回 nil。 |
| type(x) | 返回类型名字符串,如 "number"、"string"、"table"。 |
| string.format(fmt,...) | 格式化字符串,如 string.format("%d-%.2f", 5, 3.14)。 |
| pcall(f,...) | 保护调用,返回 是否成功, 结果/错误信息,避免脚本直接崩溃。 |
常用代码片段
复制即用的常见模板
以下片段可直接粘贴到 main.lua,按需要修改坐标和参数。
点击测试
log("===== 点击测试开始 =====")
tap(444, 412)
sleep(2000)
tap(551, 412)
log("===== 测试完毕 =====")if 条件判断
local count = 10
if count > 0 then
toast("还有 " .. count .. " 次")
else
toast("次数用完")
endwhile 循环(自己写的循环同样生效)
local i = 1
while i <= 20 do
log("循环第 " .. i .. " 次")
tap(500, 800)
sleep(1000)
i = i + 1
endfor 固定次数循环
for i = 1, 10 do
log("第 " .. i .. " 次执行")
tap(500, 500)
sleep(800)
end自定义函数
local function clickAt(x, y, wait)
tap(x, y)
sleep(wait or 500)
end
clickAt(444, 412, 2000)
clickAt(551, 412, 1000)找到图片再点击(找不到就等待)
if waitImage("image/start.png", 10000, 0.9) then
local p = findImage("image/start.png")
if p.x ~= -1 then
tap(p.x, p.y)
toast("已点击开始")
end
else
toast("没有找到开始按钮")
exitScript("等待图片超时")
end卡密登录(标准三行)
local r = showUI(require("ui"), "登录")
if r == nil then return end
if not kamiVerify("你的APPID", r.kami) then return end
-- 验证通过后写正式任务说明
本文档随度大师IDE v1.1.1 整理,函数以真机 / 打包 APK 内的 Lua 引擎为准。电脑「运行」为逻辑模拟,真机表现请以「真机测试」为准。