Author Topic: Массивы  (Read 4583 times)

0 Members and 2 Guests are viewing this topic.

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Массивы
« on: December 29, 2016, 11:26:31 AM »
И снова всем добрый день. Снова вопрос связанный с массивами. добрые люди просветили меня о псевдо многомерном массиве, за что им спасибо
http://crapware.aidf.org/forum/index.php?topic=321.msg2686#msg2686
http://crapware.aidf.org/forum/index.php?topic=1138.msg5115#msg5115
http://crapware.aidf.org/forum/index.php?topic=2909.msg19070#msg19070

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

Code: (clickermann) [Select]

//допустим размер массива 3х4х5
//заполняю его значениями по порядку
$R=5 //символов в строке
$D=4//кол-во строк
$P=3//третий размер массива хз как это называется( глубина ширина)
FOR($a=0, $a < $P) //заполняю по порядку с 10
FOR($b=0, $b < $D)
FOR($c=0, $c < $R)
ARRPUSH($arr, $a*5*4+$b*5+$c)
END_CYC
END_CYC
END_CYC
HALT
//должен заполнить массив числами по порядку

можно использовать один FOR($n=0, $n <5*4*3),но мне для передвижений по экрану массив нужен, заполнять удобней с тремя переменными иначе в IF утону

Code: (clickermann) [Select]
// ищем по значению в массиве размером
$R=5 //символов в строке
$D=4//кол-во строк
$P=3//третий размер массива хз как это называется( глубина ширина)

FOR($i=0, $i < ARRSIZE($arr))
    IF($arr[$i] = 12)
        $a = INT($i / $R/$D)
        $b = INT($i/$R-$a*$D)
        $c = $i - $b*$R-$a*$R*$D
 
        $i = ARRSIZE($arr)
    END_IF
END_CYC
LOGWRITE("a = ", $a, ",  b = ", $b, ",  c = ", $c)
 
HALT

А вопрос в общем то, это работать то будет?формула заполнения и формула нахождения положения в массиве верные?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Массивы
« Reply #1 on: December 29, 2016, 12:39:59 PM »
Да, всё правильно.
Только в кликере есть ошибка
http://crapware.aidf.org/forum/index.php?topic=2874.0

Поэтому, чтоб правильно считало вот эту строку
Code: (clickermann) [Select]
$c = $i - $b*$R - $a*$R*$D
нужно записать так (2 способа):
Code: (clickermann) [Select]
$c = $i - ($b*$R) - ($a*$R*$D)
// или
$c = $i - ($b*$R + $a*$R*$D)


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #2 on: December 29, 2016, 12:43:02 PM »
по твоей задаче
Code: (clickermann) [Select]
$x=3
$y=3
$z=3
FOR($a=1, $a < $z+1)
   FOR($b=1, $b < $y+1)
      FOR($c=1, $c < $x+1)
         ARRPUSH($arr, $c)
         ARRPUSH($arr, $b)
         ARRPUSH($arr, $a)
      END_CYC
   END_CYC
END_CYC


FOR($d=0, $d < ARRSIZE($arr),3)
   print($arr[$d],"x",$arr[$d+1],"x",$arr[$d+2])
END_CYC
HALT

только не вижу применения в простой нумерации "ячеек". может я чтото упускаю.

как по мне, трехмерный массив  - прямое применения в записи координат xyz.
к примеру у нас есть массив с координатами, как же считать из массива координаты xyz именно точки к примеру 28 ?
Code: (clickermann) [Select]
$check = 28

$x = $arr[$check*3]
$y = $arr[$check*3+1]
$z = $arr[$check*3+2]

или пройти по точкам поочереди (к примеру они у нас были записаны заранее, чтото типа маошрута)
Code: (clickermann) [Select]
FOR($d=0, $d < ARRSIZE($arr),3)
   $x = $arr[$d]
   $y = $arr[$d+1]
   $z =  $arr[$d+2]   
END_CYC



или я както подругому понимаю многомерные массивы? если винт написал что там всё правильно, то я хз  :-\


Code: (clickermann) [Select]
//допустим размер массива 3х4х5
//заполняю его значениями по порядку
$R=5 //символов в строке
$D=4//кол-во строк
$P=3//третий размер массива хз как это называется( глубина ширина)
FOR($a=0, $a < $P) //заполняю по порядку с 10
FOR($b=0, $b < $D)
FOR($c=0, $c < $R)
ARRPUSH($arr, $a*5*4+$b*5+$c)
END_CYC
END_CYC
END_CYC
//должен заполнить массив числами по порядку
 
 
FOR($d=0, $d < ARRSIZE($arr),3)
   print($arr[$d],"x",$arr[$d+1],"x",$arr[$d+2])
END_CYC
halt

Code: [Select]
12:55:41 0x1x2
12:55:41 3x4x5
12:55:41 6x7x8
12:55:41 9x10x11
12:55:41 12x13x14
12:55:41 15x16x17
12:55:41 18x19x20
12:55:41 21x22x23
12:55:41 24x25x26
12:55:41 27x28x29
12:55:41 30x31x32
12:55:41 33x34x35
12:55:41 36x37x38
12:55:41 39x40x41
12:55:41 42x43x44
12:55:41 45x46x47
12:55:41 48x49x50
12:55:41 51x52x53
12:55:41 54x55x56
12:55:41 57x58x59
« Last Edit: December 29, 2016, 12:52:27 PM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Массивы
« Reply #3 on: December 29, 2016, 12:51:10 PM »
Да, да. удобней "вывернуть" размерности.
В представлении получив двумерный массив, в каждом поле которого три значение -  3-я размерность.

Но это смотря какая задача. Если там не координаты, то может быть удобней первый вариант.
Например, имеем несколько двумерных полей x,y... допустим храним несколько шахматных досок.
Тогда 3-я размерность - номер доски.
Второй вариант по аналогии с XYZ не подходит. Нафиг нам хранить рядом трио поля E4 с разных досок? Незачем. Лучше пусть каждая доска будет сама по себе
Code: [Select]
// 0   1   2   3   4
// 5   6   7   8   9
//10  11  12  13  14
//15  16  17  18  19

//20  21  22  23  24
//25  26  27  28  29
//30  31  32  33  34
//35  36  37  38  39

//40  41  42  43  44
//45  46  47  48  49
//50  51  52  53  54
//55  56  57  58  59

Короче, применение мы не знаем и автору выбирать где какая размерность.
« Last Edit: December 29, 2016, 12:59:30 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #4 on: December 29, 2016, 12:59:09 PM »
Code: (clickermann) [Select]
//допустим размер массива 3х4х5
//заполняю его значениями по порядку
$R=5 //символов в строке
$D=4//кол-во строк
$P=3//третий размер массива хз как это называется( глубина ширина)
FOR($a=0, $a < $P) //заполняю по порядку с 10
FOR($b=0, $b < $D)
FOR($c=0, $c < $R)
ARRPUSH($arr, $a*5*4+$b*5+$c)
END_CYC
END_CYC
END_CYC
//должен заполнить массив числами по порядку

halt
просто если чесно, я пока не вижу смысла в простом пронумировывании, просветите меня если не лень ???

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Массивы
« Reply #5 on: December 29, 2016, 01:00:33 PM »
просто если чесно, я пока не вижу смысла в простом пронумировывании, просветите меня если не лень ???
Для отладки. Проверить правильно ли все формулы работают.

Конечно, потом данные там будут разные. Иначе зачем бы мы там искали значение  :o


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #6 on: December 29, 2016, 01:02:04 PM »
Например, имеем несколько двумерных полей x,y... допустим храним несколько шахматных досок.
Тогда 3-я размерность - номер доски.
Второй вариант по аналогии с XYZ не подходит. Нафиг нам хранить рядом трио поля E4 с разных досок? Незачем. Лучше пусть каждая доска будет сама по себе
Code: [Select]
// 0   1   2   3   4
// 5   6   7   8   9
//10  11  12  13  14
//15  16  17  18  19

//20  21  22  23  24
//25  26  27  28  29
//30  31  32  33  34
//35  36  37  38  39

//40  41  42  43  44
//45  46  47  48  49
//50  51  52  53  54
//55  56  57  58  59

Короче, применение мы не знаем и автору выбирать где какая размерность.

ну да, немного начал догонять, просто задачи такой ниразу не встречал. спс, буду знать.


просто я както и не обратил внимане на вторую часть
Code: (clickermann) [Select]
FOR($i=0, $i < ARRSIZE($arr))
   IF($arr[$i] = 5)
      $a = INT($i / $R/$D)
      $b = INT($i/$R-$a*$D)
      $c = $i - $b*$R-$a*$R*$D
      LOGWRITE("a = ", $a, ",  b = ", $b, ",  c = ", $c)
   END_IF
END_CYC

так как первая меня сразу смутила..

а так вроде даже и применимо, но сложнее для понимания . еще раз спасибо за разъяснение  :D
« Last Edit: December 29, 2016, 01:25:08 PM by dramster »

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #7 on: December 29, 2016, 01:29:30 PM »
совершенно верно этот для отладки, а нужен он мне для двумерного поля 12 х 5 клеток, но на экран помещается только 4 из 12, так что третья размерность мне для определения на какую часть доски тащить экран (вернее какую часть доски тащить на экран  но по другому представить легче) а в сам массив я буду записывать значения соответствующие содержанию клеток, а потом менять перепроверять, в общем думаю оправдана будет морока.
Да, всё правильно.
Только в кликере есть ошибка
http://crapware.aidf.org/forum/index.php?topic=2874.0
  :D не поверишь, пока ждал ответа, как раз зашел в ошибки, прочел твою тему и сижу уже правлю то что наваял до этого. и снова спасибо тебе за ответ

или пройти по точкам поочереди (к примеру они у нас были записаны заранее, чтото типа маошрута)
Code: (clickermann) [Select]
FOR($d=0, $d < ARRSIZE($arr),3)
   $x = $arr[$d]
   $y = $arr[$d+1]
   $z =  $arr[$d+2]   
END_CYC

еще не сталкивался с трехмерными координатами, да и разве кликер может по трехмерным работать? он же экран аналезирует :o
но твою идею понял, оценил и запомню, вдруг пригодиться
вдруг всетаки начну каким путевым языком заниматься и что то полезное делать...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #8 on: December 29, 2016, 01:45:01 PM »
да и разве кликер может по трехмерным работать? он же экран аналезирует :o
еще как может  :). и кроме как анализировать экран, кликер еще умеет читать из памяти :D. да и по анализу экрана применимо - размер обьекта к примеру или считывание какихлибо (числовых или еще каких) данных с экрана.

пример - контра на денди 2-й уровень  :D (это просто пример, в контре конечно не применимо, там совсем по другому) . идем по туннелю, нужно определить координаты противника. в начале определяем положение его на экране (2 измерения). после - смотрим на его размер, вот его и третье измерение, в пространстве.

еще пример - летим на вертолете (самолете). смотрим на карту - видим положение себя в двух измерениях. смотрим на панель приборов, видим высоту - третье измерение.
« Last Edit: December 29, 2016, 02:10:38 PM by dramster »

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #9 on: December 29, 2016, 02:09:46 PM »
еще как может  :). и кроме как анализировать экран, кликер еще умеет читать из памяти :D. да и по анализу экрана применимо - размер обьекта к примеру или считывание какихлибо (числовых или еще каких) данных с экрана.
да проститься мне мое невежество, считывать из памяти? то-есть анализировать параметры которые получает приложение? я правильно вас понял? или вы про считывание и запись в файлы (TFWRITE ("file", "str", [str_n]) - записывает строку в файл. типо этого) в любом случае.
не будете ли так добры послать меня по ссылочке :D почитать об этом


да и еще вопрос не по этой теме но он маленький и боюсь что ответ очевиден
функция IF_PICTURE_IN  никаким чудесным образом масштабирование учитывать не может? ну тоесть в игре есть объект, но в зависимости от настроения азиатского носорога и положения марса относительно венеры при прохождения пояса верности дарьи ивановны, размер объекта меняется, нужно сидеть и ловить на скрины все возможные размеры или есть какойнибудь чудодейственный способ задать ему искать такой объект но побольше или поменьше

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #10 on: December 29, 2016, 02:16:07 PM »
да проститься мне мое невежество, считывать из памяти? то-есть анализировать параметры которые получает приложение? я правильно вас понял? или вы про считывание и запись в файлы (TFWRITE ("file", "str", [str_n]) - записывает строку в файл. типо этого) в любом случае.
не будете ли так добры послать меня по ссылочке :D почитать об этом

имеется ввиду считывание из памяти процесса READMEM (pid, "addr", [size]). есть еще и запись, но в онлайн играх не применима. естественно, нужно в начале найти адрес нужного значения в памяти, проги по сканированию, поиску и отсеивания думаю знаешь.




да и еще вопрос не по этой теме но он маленький и боюсь что ответ очевиден
функция IF_PICTURE_IN  никаким чудесным образом масштабирование учитывать не может? ну тоесть в игре есть объект, но в зависимости от настроения азиатского носорога и положения марса относительно венеры при прохождения пояса верности дарьи ивановны, размер объекта меняется, нужно сидеть и ловить на скрины все возможные размеры или есть какойнибудь чудодейственный способ задать ему искать такой объект но побольше или поменьше
IF_PICTURE_IN  тупо сверяет попиксельно твою заготовку с буфером (областью). такчто с масштабированием не прокатит.


lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #11 on: December 29, 2016, 02:38:00 PM »
естественно, нужно в начале найти адрес нужного значения в памяти, проги по сканированию, поиску и отсеивания думаю знаешь.


ты обо мне слишком хорошего мнения, но пока не надо а после гугл мне в помощь
Quote
считывание из памяти процесса READMEM (pid, "addr", [size])

о такой тоже слышу впервые, и в хелпе ее не видел))) чувствую нашел что поискать и почитать на выходных

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #12 on: December 29, 2016, 02:48:38 PM »
подсказываю.
 простейший вариант - артмани. есть русская справка (что и как искать), по началу может быть сложновато со всеми этими указателями смещениями и прочим. в браузерных приложениях у тебя врядли чтото получится найти, а вот в клиентских - без проблем. вот только не забывай про защиты, античиты. все манипуляции только на тестовых аккаунтах.

справка - скрипты и плагины

Синтаксис
READMEM (pid, "addr", [size]) - считывает целое значение из памяти процесса


Параметры
pid - идентификатор процесса
addr - строка, адрес памяти
size - тип значения (1,2,4,8)



Возвращаемые параметры
$_return1 - прочитанное значение


вот отличный пример работы с памятью кликера (с указателем и со смещением) http://crapware.aidf.org/forum/index.php?topic=2134.msg12725#msg12725
меняем изображение в графическом буфере кликера самим же кликером.

 ;D только всё это зря было. как аказалось, в кликермане есть процедура которая это всё делает, но в тот момент от нас ее скрывали.  ;D
« Last Edit: December 29, 2016, 02:55:26 PM by dramster »

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #13 on: December 29, 2016, 04:10:14 PM »
подсказываю.
спасибо, попробую вникнуть, задачу посмотрел, мозг поплыл.

но вернусь к первоначальной теме. трехмерный массив, появилась потребность припереборе откатываться на значение назад по столбцу и по строке, есле по строке у меня худо бедно работает через GOTO то по столбцу полный калапс, назад он вроде откатывается но потом пропускает  строку или не доходит до конца .
Code: (clickermann) [Select]


FOR ($i=0, $i<$B) //перебираю строки
strk://метка, куда возвращаюсь если откатываю счетчик назад постолбцу

FOR ($j=0, $j<$D) //перебераю столбцы
stlb: //метка, куда возвращаюсь если откатываю счетчик назад по строке

//........тут еще куча всякой ерунды к делу не относящейся

migk($i,$j) //процедура в отдельном файле проверяет есть мигающий пиксель в центре квадрата или нет($m=1:есть $m=0:нет)

IF ($m=1)
WAITMS(50)
print ("кликаю")
LCLICK($xkz+$dlk*$j,$ykz-$dlk*$i)//открываю клетку если пиксель мигает
WAITMS(50)


//........тут еще куча всякой ерунды к делу не относящейся


IF($i!0)
migk($i-1,$j)//если строка не нижняя проверяю с низу квадратик не начал мигать?
IF ($m=1)
$i=$i-1//если начал то счетчик откатываю на 1
goto(strk)
END_IF
END_IF

IF($j!0)
migk($i,$j-1)//если строка не нижняя проверяю с низу квадратик не начал мигать?
IF ($m=1)
$j=$j-1//если начал то счетчик откатываю на 1
goto(stlb)
END_IF
END_IF
END_IF
END_CYC
END_CYC
такое впечатление что вот этому FOR ($i=0, $i<$B) глубоко пофиг что я сделал с $i  когда сного доходит до него он юзает старое значение увеличенное на один, и шагов у него ровно $B а если приходиться пару раз проходить goto(strk) унего шаги оп закончились и все до конца не идет :( я его и вежливо и не очень вежливо просил...

кажется отчасти лечиться если заменить строки
Code: [Select]
FOR ($i=0, $i<$B) //перебираю строки
strk://метка, куда возвращаюсь если откатываю счетчик назад постолбцу

на строки
Code: [Select]
$i=0
strk:
FOR ($i, $i<$B) //перебираю строки
но как то не красиво получается и почему не работает первый вариант понять не могу

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #14 on: December 29, 2016, 04:54:16 PM »
в первую очередь нужно избавиться от гото. выскакивать из цикла по гото категорически запрещено.
Code: (clickermann) [Select]
$j = 99999

FOR ($i=0, $i<$B)
   
   //strk:
   IF($j=$D)
      $j=99999
   END_IF
   WHILE($j = 99999)
     
     
      FOR ($j=0, $j<$D)
         //stlb:
         $stlb = 1
         WHILE($stlb = 1)
           
            migk($i,$j)
           
            IF ($m=1)
               WAITMS(50)
               print ("кликаю")
               LCLICK($xkz+$dlk*$j,$ykz-$dlk*$i)
               WAITMS(50)
               
               IF($i!0)
                  migk($i-1,$j)
                  IF ($m=1)
                     $i=$i-1
                     // goto(strk)
                     //тут ламаем цикл   FOR ($j=0, $j<$D)    и возвращаемся назад в цикле   FOR ($i=0, $i<$B) не наращивая  $i
                     $j = 99999
                     $stlb = 0    //и ламаем цикл  WHILE($stlb = 1)
                  END_IF                                   
               END_IF
               
               IF(($j!0)&($j ! 99999))
                  migk($i,$j-1)
                  IF ($m=1)
                     $j=$j-1
                     //goto(stlb)
                     //возвращаемся назад в текущем цикле, не наращивая j
                     $stlb = 1
                  else
                     $stlb = 0
                  END_IF                 
               END_IF
               
            END_IF
           
         END_CYC
      END_CYC
   END_CYC
END_CYC


перепроверь, я всё правильно понял? мог что нибудь упестить, или не правильно понять.



немного подправил, нашел ошибочку.


бляха, нечаянно не тот пост отредактировал >:(, не актуален уже 
« Last Edit: December 29, 2016, 11:29:50 PM by dramster »