Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Задачка, Lua
Levo222
сообщение 16.4.2021, 10:49
Сообщение #1


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Если цвет в точке определённый дольше определённого времени цикл прерывается, если нет, продолжается.
Код

while 1==1 do
if color (1, 1) == 0 then
    timeout = os.clock()
     Timeleft = 0
elseif (color (1, 1) ~= 0 and Timeleft = 0) then
     timeout = os.clock() + 6
    Timeleft = 1
   else
  end
end
if timeout < os.clock() then
   break
  else
end
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 16.4.2021, 11:53
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Код
--lua
log 'clear' log 'mode compact'

while true do
    if color(338, 493) == 5384704 then  -- если цвет совпадает
        local t = os.clock() + 6  -- ожидать цвет 6 секунд
        while os.clock() < t and color(338, 493) == 5384704 do  -- пока не вышло время и цвет совпадает
            log('Цвет совпадает   ' .. tostring(t - os.clock()) )
            wait (100)
        end
        if os.clock() >= t then break end     -- если прошло заданное количество времени, то выход из цикла
    end
    wait (10)
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 16.4.2021, 14:48
Сообщение #3


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(cirus @ 16.4.2021, 15:53) *

Код
--lua
log 'clear' log 'mode compact'

while true do
    if color(338, 493) == 5384704 then  -- если цвет совпадает
        local t = os.clock() + 6  -- ожидать цвет 6 секунд
        while os.clock() < t and color(338, 493) == 5384704 do  -- пока не вышло время и цвет совпадает
            log('Цвет совпадает   ' .. tostring(t - os.clock()) )
            wait (100)
        end
        if os.clock() >= t then break end     -- если прошло заданное количество времени, то выход из цикла
    end
    wait (10)
end


Тут вопрос вот в чём. У меня уже внутренний цикл прописан во внешнем. Т.е. дальше при разрыве этого цикла идут некоторые действия, поэтому внутри заново писать их это усложнение кода. Но проходя каждый раз через
Код
if color(338, 493) == 5384704 then  -- если цвет совпадает
local t = os.clock() + 6
скрипт заново присваевает t + 6 секунд, и он никогда не заканчивается, поэтому возникла необходимость использования дополнительных переменных, а так
os.clock() < t
Что-то я не подумал что от времени можно переменную отнять.
Но при проверке этих переменных какая-то сложность возникает: Если "Переменная = 1" это вызывает ошибку.
Т.е., теперь, если я пишу

Код
while 1==1 do
if color (1, 1) == 0 then
    timeout = os.clock()
     Timeleft = 0
elseif (color (1, 1) ~= 0 and Timeleft = 0) then
     timeout = os.clock() + 6
    Timeleft = 1
   else
  end
end
if os.clock() > timeout then
   break
  else
end
end

То скрипт вызывает ошибку на строке
elseif (color (1, 1) ~= 0 and Timeleft = 0) then
Т.е. скрипту не нравится именно формат записи Timeleft = 0, хотя если я писал Timeleft ~= 0 или Timeleft == 0 это не имело никакого эффекта.
Локальные переменные в данном случае не использую, потому что насколько я помню они не в области видимости за пределами внутреннего цикла.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 16.4.2021, 19:58
Сообщение #4


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Цитата(Levo222 @ 16.4.2021, 14:48) *

То скрипт вызывает ошибку на строке
elseif (color (1, 1) ~= 0 and Timeleft = 0) then
Т.е. скрипту не нравится именно формат записи Timeleft = 0, хотя если я писал Timeleft ~= 0 или Timeleft == 0 это не имело никакого эффекта.
Локальные переменные в данном случае не использую, потому что насколько я помню они не в области видимости за пределами внутреннего цикла.

Потому что ты присваиваешь 0 а не сравниваешь с ним == должно быть. И end лишний в конце. А вообще ошибку прикрепи.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 16.4.2021, 21:21
Сообщение #5


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(Madeus @ 16.4.2021, 23:58) *

Потому что ты присваиваешь 0 а не сравниваешь с ним == должно быть.

Ну, "t = os.clock()" тоже операция сравнения проводится, однако это не мешает.
Цитата(Madeus @ 16.4.2021, 23:58) *

А вообще ошибку прикрепи.

Короче я чёт запутался. Lua числа и выражения они разве не по-разному присваиваются?
если =
expected near '='
Syntax Error During /
если == то
attemt to compare nil with number
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 16.4.2021, 23:44
Сообщение #6


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Цитата(Levo222 @ 16.4.2021, 21:21) *

Ну, "t = os.clock()" тоже операция сравнения проводится, однако это не мешает.

Это не сравнение, а присваивание переменной t значение функции os.clock(), сравнение равенства делается через ==
Цитата(Levo222 @ 16.4.2021, 21:21) *

attemt to compare nil with number

на какую строчку эта ошибка?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 1.5.2021, 3:52
Сообщение #7


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(Madeus @ 17.4.2021, 3:44) *

Это не сравнение, а присваивание переменной t значение функции os.clock(), сравнение равенства делается через ==

на какую строчку эта ошибка?

Хрен его знает:
Вот код, и он не работает.
Код

if color (11, 91) == 0 then
TS = os.clock()
St1 = 0
else
if (color (11, 91) ~= 0 and St1 ~= 0) then
TS = os.clock() + 6
St1 = 1
wait (1000)
else
end
end
wait (100)
if (BlaBlaBla (11, 124) == 16579836 or ((os.clock() > TS))
then
какие-то действия
end

Но это не работает, end-ов там дальше хватает, все циклы и операции закрыты, и почему то где-то не тот знак присваивания или сравнения
Там формат времени какой-то странный: он то 4-х значный, то 6-ти, то 5-ти, как будто то минуты то секунды. В результате, когда я присваиваю несколько секунд он их по-разному воспринимает в разные моменты времени.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 1.5.2021, 9:20
Сообщение #8


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Но это не работает

Выкладывать куски кода нет смысла.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 1.5.2021, 9:39
Сообщение #9


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(cirus @ 1.5.2021, 13:20) *

Выкладывать куски кода нет смысла.

Да он работает. Проблема лишь в присваивании и сравнении а также в формате времени - из-за чего в этом фрагменте выдаёт ошибку.
Хорошо, вот вам не "кусок кода"
скрипт
Код
local St1 = 0 --заранее создаём переменную чтобы код не считал её "несуществующей"
while true do

if color (11, 91) == 0 then
   TS = os.clock() --обнуляем время, если условия не выполняются.
    St1 = 0 --вводим переменную чтобы избежать повторной проверки
   else
    St1 = 1
end

if (color (11, 91) ~= 0 and St1 == 1) then  --если условия соблюдаются и переменная =1
  TS = os.clock() + 6 --засекаем 6 сек
   St1 = 1 --изменяем переменную чтобы время повторно не засекалось до изменения главного условия
    wait (100)
   else
end

if (BlaBlaBla (11, 124) == 16579836 or ((os.clock() > TS)) --если какое-то условие или с момента засечения времени прошло 6 секунд(при этом главное условие не менялось, потому что переменная St1 обнулила бы время)
  then
   break --выйти из цикла
end

end

Я уже разбил на простые блоки его, но это не помогает.

Вобще-то наверное вот так лучше:
скрипт
Код
local St1 = 0 --заранее создаём переменную чтобы код не считал её "несуществующей"
while true do

if color (11, 91) == 0 then
   TS = os.clock() --обнуляем время, если условия не выполняются.
    St1 = 0 --обнуляем переменную чтобы избежать повторной проверки
   else
    St1 = 1
end

if (color (11, 91) ~= 0 and St1 == 0) then  --если условия соблюдаются и переменная = 0
  TS = os.clock() + 6 --засекаем 6 сек
   St1 = 1 --изменяем переменную чтобы время повторно не засекалось до изменения главного условия
    wait (10)
   else
end

if (BlaBlaBla (11, 124) == 16579836 or ((os.clock() > TS)) --если какое-то условие или с момента засечения времени прошло 6 секунд(при этом главное условие не менялось, потому что переменная St1 обнулила бы время)
  then
   break --выйти из цикла
end

end


Сообщение отредактировал Fors1k - 1.5.2021, 14:58
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 1.5.2021, 10:04
Сообщение #10


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
если какое-то условие или с момента засечения времени прошло 6 секунд

Выше есть пример такого кода.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 1.5.2021, 14:13
Сообщение #11


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Глянул мельком на вашу задачу. Если я её правильно понимаю, вот пример реализации.
Обратите внимание, что я использую булевы переменные для определения событий. Так и понятней и правильней. Можно определять сколько угодно таких событий и сколько угодно временных "засечек" для событий - гораздо понятнее чем использование разных таймаутов.
код
Код
while true do          -- Внешний цикл
  local colorNot = true         -- изначально считаем что цвет в точке не обнаружен (флаг установлен)
  local timeYes
  while true do                 -- Цикл ожидания присутствия цвета дольше 6 секунд
    if color (11, 91) ~= 0 then   -- Если цвет в точке обнаружен
        if colorNot then              -- если установлен флаг, что цвет пока не был обнаружен
          timeYes = os.clock()          -- засекаем время когда был обнаружен цвет
          colorNot = false              -- сбрасываем флаг (цвет обнаружен)
        end
      else                          -- Иначе, цвета в точке нет
        colorNot = true               -- установка флага на необходимость обнаружения цвета
    end
    if not(colorNot) and os.clock()-timeYes > 6 then  -- если флаг отсутствия цвета сброшен и это длится уже долее 6 секунд
      break                                             -- прерывание цикла ожидания цвета
    end
    -- ...                        действия внутреннего цикла
    -- BlaBlaBla
    -- ...
  end                           -- конец цикла ожидания присутствия цвета дольше 6 секунд
  -- ...                        действия внешнего цикла
  -- BlaBlaBla
  -- ...
end


Сообщение отредактировал Fors1k - 1.5.2021, 14:59
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 1.5.2021, 23:29
Сообщение #12


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Всё понятно. Я не могу понять почему не работает неравенство
os.clock() > переменная содержащая ранее засечённое время + дополнительное время ???
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 1.5.2021, 23:59
Сообщение #13


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Я не могу понять почему не работает неравенство
os.clock() > переменная содержащая ранее засечённое время + дополнительное время ???

Выводить значения в лог и посмотреть что не так.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 2.5.2021, 0:24
Сообщение #14


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Фу блин. Пока эту задачу решил - 3-х коров родил. Нужно было присваивать каждой проверке новую переменную, иначе время сбрасывалось на 0 при любом прохождении. Ну с булевыми переменными это вы конечно загнули. У меня с обычными то голова кипит. Может как-нибудь соберусь и освою всю их суть, но пока что половина кода уже написано в обычном стиле и его изменение в серьёз затрудняет прочтение.
Завтра выложу решение с костылями, которое работает.
код

Код
local St = 0
while 1=1 do
if color (11, 91) == 0 then
TS = os.clock()
St = 0
else
if (color (11, 91) ~= 0 and St == 0) then
  St = 1
else
end
end

if (color (11, 91) ~= 0 and St == 1) then
TS = os.clock() + 6
  St = 2
else
end

if (os.clock() > TS and St1 == 2)
then
  break
end

end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 1:34
Designed by Nickostyle