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

 
Ответить в эту темуОткрыть новую тему
> Работа с массивом, необходима помощь по получению результата поиска в массиве
fabbeg
сообщение 24.5.2018, 6:19
Сообщение #1


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



Доброго дня!
Есть текстовая игра, где результат выводится в форме сообщения каждый раз при вводе команды.
пишу такой скрипт

Код
log mode compact
showwindow
wait 1000
left 837, 794 abs
sendex ^{A}
sendex ^{C}
send esc
get clipboard %a string
for #i 1 size(%a)                
   set $regexp "fab has \d*/\d*,\d{2,3}"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
       log $hitstring
   end_if
end_for


выдается 1 результат (собственно и должен быть один).
После этого пытаюсь забрать результат в переменную командой
Код
set $a $hitstring

и выдать уже
Код
log $a

лог выдает -1
что не так делаю?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 24.5.2018, 7:55
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Для воспроизведения проблемы предоставьте, пожалуйста:
1) Входной текст.
2) Промежуточый вывод $hitstring
3) Собственно присвоение переменной.
Т.е. код одним куском, чтобы его можно было запустить и увидеть ошибку без редактирования.

Предварительный вариант: в распарсенной строке содержется текст идентичный именам функций пилота, что приводит к попыткам преобразования.

В зависимости от того, что именно вам нужно можно:
1) Попросить кнайта сделать неформатируемый вывод в лог (я уже упрашиваю, например, сейчас (IMG:style_emoticons/default/wink.gif) )
2) Использовать луа для форматирования строк и вывода результата в файл.
3) Разбивать текст на куски и присваивать его массиву:
set %a[1 1] мам
set %a[1 2] а мы
set %a[1 3] ла р
set %a[1 4] аму
log %a[1]
Обратите внимание на индексы. Присвоение идет двумерному массиву, а вывод, как одномерного.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 24.5.2018, 11:38
Сообщение #3


**********

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



Цитата
left 837, 794 abs
sendex ^{A}
sendex ^{C}

Неплохо быть ставить паузы хотя бы 100-200 мсек, текст может не успеть выделиться и скопироваться.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
fabbeg
сообщение 24.5.2018, 18:04
Сообщение #4


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



Код
 log mode compact
showwindow
left 837, 794 abs
sendex ^{A}
sendex ^{C}
send esc
get clipboard %a string
for #i 1 size(%a)              
   set $regexp "Афанасий Фет has \d*/\d*,\d{2,3}"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
       log $hitstring
   end_if
end_for
  set $b $hitstring
log $b
end_script

такой скрипт
Код
!========[ Афанасий Фет's Adventure ]========!
% Rolled a 3
- Lost 79 HP.
+ Dealt 50 HP Damage
+ Killka dealt 41 HP damage.
- Killka took 40 HP Damage.
+ Killka has 373/712 HP left
+ Афанасий Фет has 843/1,150 HP left.
+ The enemy Rectex has 768/950 HP left.
!=============================================!

это копируется в буфер

Код
Афанасий Фет has 843/1,150
-1

это выдает в лог
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 24.5.2018, 18:21
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
843/1,150

Проблема тут. Пытается математику провернуть. Рекомендую разбить строку на несколько кусков, как самый простой варимант.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
fabbeg
сообщение 24.5.2018, 18:32
Сообщение #6


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



DarkMaster, а как ее разбить если он ее в переменную даже не загоняет? (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 24.5.2018, 20:03
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Я бы регекспом бил.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
fabbeg
сообщение 24.5.2018, 21:30
Сообщение #8


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



Код

log mode compact
showwindow
wait 2000
left 392, 980
wait 100
send !clear 100
wait 100
send enter
wait 3000
left 392, 980
wait 100
send #!adv
wait 100
send enter
wait 3000


left 837, 794 abs
wait 100
sendex ^{A}
wait 100
sendex ^{C}
wait 100
   send esc
   wait 100
  get clipboard %a string
  //анализ игрока начало//
   for #i 1 size(%a)
   set $regexp "Фет has \d*"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
           set $hp $hitstring
         end_if
end_for

get word $myhp 3 $hp
log у тебя $myhp жизней
wait 1000
//анализ игрока кончало//


//анализ пэта начало//
  for #i 1 size(%a)
   set $regexp "Killka has \d*"
   set #n regexp (#position $hitstring %a[#i] $regexp)
   if #n = 1
           set $hp $hitstring
         end_if
end_for

get word $pethp 3 $hp
log у пэта $pethp жизней
wait 1000
//анализ пэта кончало//

//исполнение хила начало//
if ($myhp > 800) or ($myhp = 1)
log у тебя все норм
wait 1000
else
log хиляюсь
left 392, 980
    wait 100
send #!heal auto
wait 100
send enter
wait 100
end_if
end_if
//исполнение хила конец//

//исполнение хила пэта начало//
if ($pethp > 600) or ($pethp = 1)
log у пэта все норм
wait 1000
else
log хиляю пэта
wait 100
left 392, 980
wait 100
send #!pheal auto
wait 100
send enter
wait 100
end_if
end_if
//исполнение хила конец//


вот так получилось в итоге

анализирует вот это:
Код
!========[ Афанасий Фет's Adventure ]========!
% Rolled a 4
- Lost 29 HP.
+ Dealt 50 HP Damage
+ Killka dealt 37 HP damage.
- Killka took 15 HP Damage.
+ Killka has 649/712 HP left
+ Афанасий Фет has 1,028/1,150 HP left.
+ The enemy Deldu has 446/625 HP left.
!=============================================!


теперь интересует как упростить при анализе массива он получал оба значения в регэкспе и присваивал им переменные, чтобы не гонять массив 2 раза для поиска разных значений
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.5.2018, 2:23
Сообщение #9


**********

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



код
Код
log clear
log mode compact

// то что в буфере
set %a [1] "Killka has 373/712 HP left"
set %a [2] "Афанасий Фет has 1,028/1,150 HP left."
set %a [3] "The enemy Deldu has 446/625 HP left."
//////////////
//get clipboard %a string

set $regexp1 "(?<=has\s).+(?=\s*HP)"   // ищем всё что находится между 'has ' и ' HP'
set $regexp2 "\d+"    // число
set $regexp3 "(?<=\/)\d+"   // число после /

set #my indexOf (%a noabs (Фет has))   // номер строки с Фет
set #pet indexOf (%a noabs (Killka has))  // номер строки с петом

/// хп Фет
set #n regexp (#position $hitstring %a[#my] $regexp1)
if  #n > 0
    set $hitstring string_replace($hitstring "," "" "all")   // удаляем из строки запятые
    log $hitstring

    set #n regexp (#pos $hp1 $hitstring $regexp2)
    if  #n > 0
        log $hp1
    end_if

    set #n regexp (#pos $hp2 $hitstring $regexp3)
    if  #n > 0
        log $hp2
    end_if
end_if
log

// хп Killka
set #n regexp (#position $hitstring %a[#pet] $regexp1)
if  #n > 0
    set $hitstring string_replace($hitstring "," "" "all")   // удаляем из строки запятые
    log $hitstring

    set #n regexp (#pos $pet_hp1 $hitstring $regexp2)
    if  #n > 0
        log $pet_hp1
    end_if

    set #n regexp (#pos $pet_hp2 $hitstring $regexp3)
    if  #n > 0
        log $pet_hp2
    end_if
end_if
log
log $hp1   $hp2          $pet_hp1   $pet_hp2
end_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
fabbeg
сообщение 25.5.2018, 6:09
Сообщение #10


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



cirus, это гениально!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
fabbeg
сообщение 2.6.2018, 17:53
Сообщение #11


**

Neophyte
Сообщений: 15
Регистрация: 24.5.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.951



Привет! Возвращаюсь к теме.
Очень редко, но бывает, что "Killka has" не выдается (бывает что моб не наносит повреждения)
тогда скрипт не находит этой строки и выдает ошибку "Проверьте правильность..."
Как можно этого избежать?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 2.6.2018, 18:07
Сообщение #12


**********

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



Надо добавить проверку что строка найдена.
Код
// хп Killka
if  #pet > 0   // проверка что нужная строка найдена
    set #n regexp (#position $hitstring %a[#pet] $regexp1)
    if  #n > 0
        set $hitstring string_replace($hitstring "," "" "all")   // удаляем из строки запятые
        log $hitstring

        set #n regexp (#pos $pet_hp1 $hitstring $regexp2)
        if  #n > 0
            log $pet_hp1
        end_if

        set #n regexp (#pos $pet_hp2 $hitstring $regexp3)
        if  #n > 0
            log $pet_hp2
        end_if
    end_if
end_if  //  конец условия
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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