Lua генерирует и исполняет код
-
Функция loadstring позволяет исполнять текст как код. Попробуем генерировать числа, сравнения чисел и логику И, ИЛИ.
Цель: просто пример.
Создать пары случайных чисел А и Б.
Случайно сравнить попарно.
Создать случайно логику "И, ИЛИ" и сравнить результаты сравнения до тех пор, пока не будут истинныfunction CheckTrue(parameter, strue, sfalse) if parameter then print(strue) else print(sfalse) end end ProgrammCompare_AxB = {} function ProgrammCompare_AxB:New(_name, _tableStringCondition) local obj = {} obj.programmName = _name obj.tableStringCondition = _tableStringCondition obj.stringCondition = '' obj.randomProgramm = '' function obj:MakeProgramm() obj.stringCondition = obj.tableStringCondition[math.random(1, #obj.tableStringCondition)] print(obj.stringCondition) obj.randomProgramm = 'function ' ..obj.programmName..'(a, b) return a '..obj.stringCondition..' b end' end function obj:RunProgramm(a, b) loadstring (obj.randomProgramm)() result = nil loadstring (string.format('result = %s(%s,%s)', obj.programmName, a, b))() CheckTrue ( result, string.format('a = %s, b = %s, result = true', a, b), string.format('a = %s, b = %s, result = false', a,b) ) return result end setmetatable(obj, self) obj.__index = ProgrammCompare_AxB return obj end compareProgramm1 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_1', { '>', '<', '>=', '<=', '==', '~=' }) compareProgramm2 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_2', { 'and', 'or' }) repeat compareProgramm1:MakeProgramm() compareProgramm2:MakeProgramm() -- Подбирать значения local a = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local b = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local c = compareProgramm2:RunProgramm(a, b) until c
Пример вывода в Cheat Engine:
>= or a = 83, b = 75, result = true a = 18, b = 86, result = false a = true, b = false, result = true
Т.е.
(83 >= 75 or 18 >= 86) == true, т.к. первое условие верное 83 >= 75 83 >= 75 = true 18 >= 86 = false