CELua[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    Lua генерирует и исполняет код

    Запланировано Прикреплена Закрыта Перенесена MasterGH
    loadstringгенерация кода
    1 Сообщения 1 Posters 767 Просмотры 1 Watching
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • MasterGHM Не в сети
      MasterGH Администраторы
      отредактировано MasterGH

      Функция 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
      
      1 ответ Последний ответ Ответить Цитировать 0

      • 1 / 1
      • Первое сообщение
        Последнее сообщение
      Powered by NodeBB | Contributors
      СeLua[RU] 2025©