Skip to content
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Collapse
Brand Logo

CELua[RU]

  1. Главная
  2. Общение
  3. MasterGH
  4. Lua генерирует и исполняет код

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

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

    Функция 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

Powered by NodeBB | Contributors
СeLua[RU] 2024©
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы