带有错误检测的 Lua 循环无法正常工作
Posted
技术标签:
【中文标题】带有错误检测的 Lua 循环无法正常工作【英文标题】:Lua Loop with error detection not working correctly 【发布时间】:2015-04-04 19:01:57 【问题描述】:我在一两个星期前编写了一个简单的机器人程序,随着我的理解加深,我一直在用新知识构建它。
local B = 1 --Boss check 1 = true, 2 = false
repeat
function bossCheck()
local rgb1 = getColor(x,y)
if rgb1 == (rgb) then
touchDown(x,y)
usleep(time)
touchUp(x,y)
end
local D = 1 --Delay, corrective action when script is out of sync with loading times
repeat
if rgb1 ~= (rgb) then
D = D + 1
usleep(time)
end
until D == 5
end
if D == 5 then
B = B + 1
end
until B == 2
if B == 2 then
alert("No Boss")
end
这实际上是循环工作的,直到我添加了更正检查延迟。如果function bossCheck()
失败,那么在我看来应该是repeat
。假设这是可行的,我错了,还是我放错了一些循环语句?
在我用local D = 1 --for delay
实现这个新代码之前,我会尝试触摸我的ios 屏幕两次,它会返回not true
结果,然后我的循环将结束。但截至目前,我运行我的脚本并没有任何反应,而且脚本似乎无限期地运行。
这很混乱。我不希望我应该在此处包含逐字逐句,但会提示我正确的方向。
编辑 - 示例
'函数bossCheck() 如果 (getColor(x,y) == "color1") 那么 返回真; 结尾 返回假; 结束
函数onBoss() 触摸(x,y) 睡眠(时间) 返回真; 结束
函数fightBoss() 触摸(x2,y2) 睡眠(时间) 返回真; 结束
函数bossReturn() 触摸 (x3,y3) 睡眠(时间) 返回真; 结束
函数bossLoop() while (bossCheck) 做 上司(); 战斗老板(); 老板返回(); 结尾 结束
重复 老板循环(); 直到(bossCheck == false)
如果 (bossCheck == false) 那么 alert("Boss 循环结束") 结束
'
【问题讨论】:
从您发布的代码中,您定义了一个函数bossCheck
,但它从未被调用过。
什么是rgb
? bossCheck
函数之外的 rgb1
是什么?
我还有一点要了解的功能。根据我的阅读,功能可以在本地块中设置,是的。
Rgb1 只是一个调用函数 getColor
的字符串,当我有 5 个左右的颜色检查时,它有助于对它们进行不同的标记。
【参考方案1】:
好的,repeat until
一遍又一遍地执行给定的脚本,直到它到达一个语句。
您的脚本,将 bossCheck 重新定义为函数并检查 D 是否等于 5(D 为零)。
您不会在任何地方调用 bossCheck,因此 B 仍然为 1。
这个脚本应该可以工作。
local noBoss = false;
function bossCheck()
noBoss = false;
local rgb1 = getColor(x,y);
if (rgb1 == rgb) then
touchDown(x,y)
usleep(time)
touchUp(x,y)
return -- if it's true, stop the function here;
end
noBoss = true;
usleep(time * 5); -- no point delaying application action 5 times, when we call just multiply the sleep amount by 5;
end
repeat
bossCheck();
until noBoss;
if (noBoss) then
alert("No Boss");
end
编辑:
我如何按顺序调用多个函数的示例
function bossCheck()
if (getColor(x,y) == rgb) -- instead doing rgb1= ..
touchDown(x,y)
usleep(time)
touchUp(x,y)
return true;
end
return false;
end
while true do
if (not bossCheck()) then
alert("No Boss");
break; -- break out of the loop
end
if ((function () return true)()) then
alert("This local function return true.. so alert message is shown\nYou can do the same with any other functions");
end
end
根据您的示例,您可以这样做
function bossCheck()
if (getColor(x,y) == rgb) -- instead doing rgb1= ..
return true;
end
return false;
end
while true do
if (bossCheck()) then
touch(x,y)
usleep(time)
touch(x2,y2)
usleep(time)
touch(x3,y3)
usleep(time)
else
alert("No Boss");
break; -- break out of the loop
end
end
【讨论】:
所以你可以将任何逻辑块设置为function
?当您调用until noBoss
时,这意味着检查语句是否已更改为=true
。
所以这个脚本有效,if (noBoss) then
提醒了我。如果支票返回false
并且确实有老板,我可以添加else
。
如果有boss,你可以添加else并打印,虽然它永远不会被打印,因为一旦你打破循环就意味着noBoss是真的,所以它会提醒'no boss',到打印有boss,在bossCheck函数中添加alert即可。
如果函数返回true
,则返回alert
。但是如果它是false
,并且如果它返回false
,它将一直循环到alert("No Boss")
。如何在'bossCheck`之后立即添加另一个函数以按顺序调用?
向 OP 添加了一个示例,不确定如何在移动设备上形成代码块。但我的问题是,该代码会正确循环吗?以上是关于带有错误检测的 Lua 循环无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 在带有 anaconda 的 Linux 上无法与 python 一起正常工作。收到未实现 cv2.imshow() 的错误
带有嵌套for循环的Javascript多维数组-无法正常工作