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

3 страниц V  1 2 3 >  
Ответить в эту темуОткрыть новую тему
> Алгоритм решения задач типа mаtch three, 3 в ряд. поиск наилучшего хода.
dimоn
сообщение 9.4.2016, 16:32
Сообщение #1


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Основная цель: решение задач, типа mаtch three. Анализ и поиск наилучшего хода.
Для начала постараюсь описать идею.
Сколь не ломал голову над быстрым решением подобных задач, кроме замудренных условий и путаницы, ничего не выходило.
Тогда я решил пойти по пути создателя. То есть воссоздать алгоритм самой игры и уже после этого, найти оптимальный алгоритм решения.
И так, для начала задаем массив, размерностью %аrr[#ver #gor] и заполняем случайными числами, от 1 до 5,

В нашем случае это %а[6 6]


Код

set #v 6
set #g 6
set size (%a[#v #g])
for #i 1 #v
  for #j 1 #g
      set %а[#i #j] 1 + rаndom(4)
  end_for
end_for
]


И сразу же сталкиваемся с первой проблемой, при создании игры - создание начального поля, без линий.
Для этого создаем функцию поиска.
Замечу, что, проще всего создать два поиска - пробежаться по горизонталям и по вертикалям, а затем эти два поиска сложить.
Ну и если мы проверяем горизонтали, на наличие трех, последовательно находщихся, одинаковых элемента, последние два проверять нет необходимости.
Аналогично и с вертикалями.



Код

for #i 1 #v
  for #j 1 #g - 2
      if %а[#l #j] = %а[#i #j+1] аnd %а[#l #j] = %а[#i #j+2]   //если 3 элемента
          if %а[#l #j] = %а[#i #j+3]                           //если 4
              if %а[#l #j] = %а[#i #j+4]                      //5
                  if %а[#l #j] = %а[#i #j+5]                 //6
              //заменяем нулями
              return
                   end_if
               //
               end_if
          end_if
        else
return
        end_if
   end_for
end_for



for #j 1 #g
  for #i 1 #v - 2
      if %а[#l #j] = %а[#i+1 #j] аnd %а[#l #j] = %а[#i+2 #j]   //если 3 элемента
          if %а[#l #j] = %а[#i+3 #j]                           //если 4
               if %а[#l #j] = %а[#i+4 #j]                      //5
                    if %а[#l #j] = %а[#i+5 #j]                 //6
              //заменяем нулями
              return
                   end_if
               //
               end_if
          end_if
        else
return
        end_if
   end_for
end_for


Учитывая направленность программы и забегая не много вперед, массив будет заполняться элементами с экрана, а значит проверять его нет необходимости, но вот функция, несомненно, нам пригодится.



ps ужасно извиняюсь, что-то глюкануло и вторая половина написанного не сохранилась. (((
сейчас попробую написать еще раз
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 9.4.2016, 17:07
Сообщение #2


**********

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



Цитата
Замечу, что, проще всего создать два поиска - пробежаться по горизонталям и по вертикалям, а затем эти два поиска сложить.

В чём смысл этого действия? Можно сделать один findcolor на 5 цветов с шагом 41 и через 50 мс имеем в массиве сетку 6*6.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.4.2016, 17:11
Сообщение #3


***********

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



Цитата
В чём смысл этого действия? Можно сделать один findcolor на 5 цветов с шагом 41 и через 50 мс имеем в массиве сетку 6*6.

Кстати учитывая появление третьего столбца в результате финдколора сейчас можно даже цвета не задавать, а точнее задавать диапазон 0x000000-0xFFFFFF. Все цвета автоматом упадут в третью колонку и собирать без приоритета можно будет даже в таком виде.


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


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



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



Цитата(cirus @ 9.4.2016, 17:07) *

В чём смысл этого действия? Можно сделать один findcolor на 5 цветов с шагом 41 и через 50 мс имеем в массиве сетку 6*6.


Смысл этого действа в том, что бы находило линии не только в одном направлении, а одновременно и горизонталь и вертикаль
Если не уточнить этот момент, то после поиска и перемещения в одном направлении, просчет второго будет уже не корректным, либо условие слишком закрученное.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 9.4.2016, 18:09
Сообщение #5


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



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

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

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

Затем запускаем поиск линий.

После заполняем новый массив, убирая пустые ячейки и заменяя их элементами, находившимися выше.

В цикл добавляем счетчик того, что ушло с поля.
Опять поиск линий и т.д. Повторяем поиск, пока результат поиска true. (цикл while, как никогда, кстати)))

После окончания работы цикла, возвращаем элементы исходного массива, закидываем результаты счетчиков в результирующий массив и возвращаемся к поиску других вариантов хода.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 10.4.2016, 16:15
Сообщение #6


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Поиск хода

Код
for #i 1 #v
  for #j 1 #j - 1
    if (%а[#i #j] = %а[#i #j+1]) аnd ((%а[#i #j] = %а[#i-1 #j-1]) or (%а[#i #j] = %а[#i+1 #j-1]) or (%а[#i #j] = %а[#i #j-2]) or (%а[#i #j] = %а[#i-1 #j+2]) or (%а[#i #j] = %а[#i+1 #j+2]) or %а[#i #j] = %а[#i #j+3])
          gosub //обмен фишек (перемещ)
     end_if
  end_for
end_for



Обмен фишек

Код
if %а[#i #j] = %а[#i-1 #j-1]
     set %b[#i-1 #j-1] %а[#i #j-1]
     set %b[#i #j-1] %а[#i #j]
           gosub //проверка на линии
     set %b[#i #j-1] %а[#i #j-1]
     set %b[#i-1 #j-1] %а[#i-1 #j-1]
  return
end_if
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 10.4.2016, 16:32
Сообщение #7


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Проскочила только что мысля..
А может ли пилот обмениваться значениями переменных, между вкладками?
То есть, мы нашли две одинаковые фишки, надо проверить третью и мы отправляем, например, проверку и просчет одной диагонали на одну вкладку, вторую диагональ на другую вкладку и т.д., что бы все эти просчеты выполнялись одновременно.
Таким образом, можно будет одновременно отрыть 6 потоков и просчитать одновременно 6 комбинаций.
Получится ли выиграть что-нибудь от этого?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.4.2016, 16:56
Сообщение #8


***********

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



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

После имени переменной/массива(до индекса) ставится точка и пишется номер вкладки.
%arr.3 [1 2]


Цитата
Получится ли выиграть что-нибудь от этого?

Из тестов получалось выжать примерно 120-150% дополнительной мощи. Т.е. если мы просчитывали 10 комбинаций за единицу времени, то будем 22-25. Но должен заметить, что это были полностью синтетические тесты, которые правда очень близки к работе с массивами.


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


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



В общем, слегка подредактировал полностью переписал код.. и, то ли у меня чайник уже перекипел, то ли у пилота.. а может и у всех вышеупомянутых (IMG:style_emoticons/default/biggrin.gif)
Что-то упускаю, а что, не могу сообразить, никак(((

Как то так...
Код
 set size (%arr 6 6)
  set size (%ar 6 6)
  set size (%ar1 6 6)
set #v 6 //(%arr)
set #g 6 //(%arr)
set size (%arr 6 6)

   for #i 1 #v
for #j 1 #g
   set %arr[#i #j] 1 + random(4)
   set %ar[#i #j] %arr[#i #j]
   set %ar1[#i #j] %arr[#i #j]
  end_for
end_for                                           //генерирует, заполняет массив

set logging home
set logging %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6]
set logging %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6]
set logging %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6]
set logging %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6]
set logging %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6]
set logging %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6]
                                                          //выводит, так.. на всякий случай)))

gosub find_line           //поиск на линии
gosub new                 //заполнение массива, после отброса линий

set logging home                                

                          //для сравнения - начальный

set logging %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6]
set logging %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6]
set logging %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6]
set logging %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6]
set logging %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6]
set logging %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6]

set logging  end

                         //для сравнения - после обработки

set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6]
set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6]
set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6]
set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6]
set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6]
set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]


end_script
:find_line
set #find 0
for #i 1 #v
  for #j 1 #g - 2
      set #j1 #j + 1
          set #j2 #j + 2
      if (%arr[#i #j] = %arr[#i #j1]) and (%arr[#i #j] = %arr[#i #j2]) and %arr[#i #j] <> 0 //если 3 элемента
          set %ar[#i #j] 0
          set %ar[#i #j1] 0
         set %ar[#i #j2] 0
          set #j3 #j + 3
           set #find 1
          if %arr[#i #j] = %arr[#i #j3]
             set %ar[#i #j3] 0
               set #j4 #j + 4                          //если 4
              if %arr[#i #j] = %arr[#i #j4]
                set %ar[#i #j4] 0
                      set #j5 #j + 5                   //5
                  if %arr[#i #j] = %arr[#i #j5]
                    set %ar[#i #j5] 0                //6
                  end_if
                end_if
           end_if
         end_if
   end_for
end_for
for #j 1 #g
  for #i 1 #v - 2
      set #i1 #i + 1
      set #i2 #i + 2
        if (%arr[#i #j] = %arr[#i1 #j]) and (%arr[#i #j] = %arr[#i2 #j]) and %arr[#i #j] <> 0
           set %ar1 [#i #j] 0
           set %ar1[#i1 #j] 0
           set %ar1 [#i2 #j] 0  //если 3 элемента
           set #i3 #i + 3
           set #find 1
          if %arr[#i #j] = %arr[#i3 #j]
             set %ar1[#i3 #j] 0       //если 4
               set #i4 #i + 4
               if %arr[#i #j] = %arr[#i4 #j]
                set %ar1[#i4 #j] 0
                 set #i5 #i + 5                         //5
                    if %arr[#i #j] = %arr[#i5 #j]
                     set %ar1[#i5 #j] 0                           //6
                    end_if
               end_if
           end_if
       end_if
   end_for
end_for

     for #i 1 #v                        //складываем результаты поисков в один массив
for #j 1 #g
  if %ar1[#i #j] = 0
     set %ar[#i #j] 0
  end_if
  if %ar[#i #j] = 0
     set %ar1[#i #j] 0

end_if
end_for
end_for



  set logging gor                    //выводим эти результаты

set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6]
set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6]
set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6]
set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6]
set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6]
set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]

set logging ver

set logging %ar1 [1 1] %ar1 [1 2] %ar1 [1 3] %ar1 [1 4] %ar1 [1 5] %ar1 [1 6]
set logging %ar1 [2 1] %ar1 [2 2] %ar1 [2 3] %ar1 [2 4] %ar1 [2 5] %ar1 [2 6]
set logging %ar1 [3 1] %ar1 [3 2] %ar1 [3 3] %ar1 [3 4] %ar1 [3 5] %ar1 [3 6]
set logging %ar1 [4 1] %ar1 [4 2] %ar1 [4 3] %ar1 [4 4] %ar1 [4 5] %ar1 [4 6]
set logging %ar1 [5 1] %ar1 [5 2] %ar1 [5 3] %ar1 [5 4] %ar1 [5 5] %ar1 [5 6]
set logging %ar1 [6 1] %ar1 [6 2] %ar1 [6 3] %ar1 [6 4] %ar1 [6 5] %ar1 [6 6]

return

:new




for #i  #v  1  -1  
for #j #g  1 -1   //пробегаемся по элементам, начиная с последнего и влево, вверх

if %ar[#i #j] = 0  //если находим 0
  for #ii #i 2 -1       //запускаем цикл по смещению ряда, по одной позиции, за проход..
    set #ii1 #ii - 1    // прям почта россии))))
    set %ar[#ii #j] %ar[#ii1 #j]
    set %ar[#ii1 #j] 0

  end_for
end_if
  end_for
end_for






  set logging gor new

set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6]
set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6]
set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6]
set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6]
set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6]
set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]


return


И вроде находит линии, но не всегда справляется с отсыланием нулей, в самую ж..
..желанную область))) (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.4.2016, 10:56
Сообщение #10


***********

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



Цитата
set logging

олдскульненько так (IMG:style_emoticons/default/smile.gif) попробуй:
log text

касательно самого кода даже не знаю, что сказать... Подобный код проще переписать, чем разобрать. Не в смысле, что написано плохо, подобные алгоритмы всегда так. Это надо вечер просидеть провтыкать. Чуть позже попробую разобрать, если не опередят (IMG:style_emoticons/default/smile.gif)


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


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Возможно (IMG:style_emoticons/default/biggrin.gif)

(IMG:http://c2n.me/3wNYSHs.jpg)

Из всего остального, из этого, вообще ничего путного не получилось)))))) (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 12.4.2016, 15:20
Сообщение #12


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



А по поводу кода, это была ситуация у меня, такая, когда учился, на 1-2 курсе была информатика. Ну и, знач, зачет, препод раздала задания, типа как домой и подходит ко мне однокурсница, помоги, говорит, программку, напиши.
Задание, на самом деле не сложное, чет типа, найти сумму пяти наименьших элементов массива, чето такое..
В общем, накидал ей программку, та ее переписала, работает, без проблем, препод, да, говорит, вижу, переписывать умеешь.. Объясни, только, как она работает...
У меня автоматом зачет отлетел и я в этот день приехал, под самый конец, зачетку втюхать и, знач, рассказывают, собралось, чуть ли не пол-группы, пока помогали ей разобраться и сами полтора часа вдупляли, что же там написано)))
Я, конечно же, съязвил, ну, говорю, вы и кофейники.. что бы понять, достаточно было условие прочитать - там по другому не сделаешь.. но факт остается фактом)))) (IMG:style_emoticons/default/laugh.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 12.4.2016, 15:21
Сообщение #13


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Цитата
log text
Скажу по секрету "олдскульненько" работает на пару тактов быстрее (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.4.2016, 15:23
Сообщение #14


***********

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



Можно поподробнее, что в нем не работает?
Цитата
set logging

тоже самое, что и просто:
log


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


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



(IMG:http://c2n.me/3wP23DB.jpg)

Но опять же, не всегда..

(IMG:http://c2n.me/3wP1jDO.jpg)

Вот, например, нормально обработал.
Какая-то мелочь засела((((

Кстати, время, довольно-таки приличное..
В среднем, около 3-4 сек (IMG:style_emoticons/default/smile.gif)
(IMG:http://c2n.me/3wP2RYI.jpg)

Если потом убрать все эти выводы в логи, наверное, еще пару сек получится выиграть))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 13.4.2016, 12:55
Сообщение #16


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Может баг?
Еще раз пробежался по коду. Ну вот, хоть очки выписывай, хоть биноклю, не вижу косяка..
До мелочей..
Запускаем циклы от послкднего эл. к первому, с шагом (-1)
for #i #v 1 -1
for #j #g 1 -1
Если значение текущего элемента равно 0
if %ar[#i #j] = 0
for #ii #i 2 -1
Берем текущее значение #i и задаем его, как начальное, для цикла. Конечным можно считать 2, потому что, обмен будет происходить с первым. шаг (-1)
set #ii1 #ii - 1
set %ar[#ii #j] %ar[#ii1 #j]
set %ar[#ii1 #j] 0
Присваиваем текущему элементу, значение элемента, находящегося над ним, а тому, 0.
end_for
end_if
end_for
end_for
Все..
Ничего замудренного.. Но почему работает через раз?
Может у меня версия пилота корявая, какая? Запустите, кто-нибудь у себя?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 13.4.2016, 13:16
Сообщение #17


**********

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



Включи пошаговое выполнение скрипта и посмотри где и в какой момент ошибка.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 13.4.2016, 13:41
Сообщение #18


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Плин.. косяк, наверное, в том, что с конца иду, к началу...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimоn
сообщение 15.4.2016, 17:36
Сообщение #19


***

Novice
Сообщений: 97
Регистрация: 24.10.2014
Группа: Пользователи
Наличность: 0
Пользователь №: 17.079
Возраст: 27



Цитата(DarkMaster @ 12.4.2016, 15:23) *

тоже самое, что и просто:
log


Пробовал тестировать на set logging и на log.
До миллисекунд, конечно, не вымерял, но, на однотипном массиве, действительно, дает одни и те же результаты, по времени, с точностью до секунды.
Повторюсь, миллисекунды не вымерял.


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

Поиск линий
Код

set size (%ar 6 6)
  set size (%ar1 6 6)
set #v 6 //(%arr)
set #g 6 //(%arr)
set size (%arr 6 6)


   for #i 1 #v
for #j 1 #g
   set %arr [#i #j] 1 + random(4)
   set %ar[#i #j] %arr[#i #j]
   set %arr[#i #j]  %arr[#i #j]
  end_for
end_for

log Начальный
log %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6]
log %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6]
log %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6]
log %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6]
log %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6]
log %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6]


gosub find_line


end_script
:find_line
while_not #find = 0
set #find 0
set #find1 0
for #i 1 #v
  for #j 1 #g - 2
      set #j1 #j + 1
          set #j2 #j + 2
      if (%ar[#i #j] = %ar[#i #j1]) and (%ar[#i #j] = %ar[#i #j2]) and %ar[#i #j] > 0 //если 3 элемента
             set #j3 #j + 3
          if %ar[#i #j] = %ar[#i #j3]
               set #j4 #j + 4                       //если 4
              if %ar[#i #j] = %ar[#i #j4]
                      set #j5 #j + 5          //5
                  if %ar[#i #j] = %ar[#i #j5]
                    set %ar[#i #j5] 0                //6
                  end_if
                set %ar[#i #j4] 0
                end_if
             set %ar[#i #j3] 0
           end_if

          set %ar[#i #j] 0
          set %ar[#i #j1] 0
         set %ar[#i #j2] 0

           set #find 1
            end_if
   end_for
end_for
for #j 1 #g
  for #i 1 #v - 2
      set #i1 #i + 1
      set #i2 #i + 2
        if (%ar1[#i #j] = %ar1[#i1 #j]) and (%ar1[#i #j] = %ar1[#i2 #j]) and %ar1[#i #j] > 0 //если 3 элемента
           set #i3 #i + 3
          if %ar1[#i #j] = %ar1[#i3 #j]  //если 4
               set #i4 #i + 4
               if %ar1[#i #j] = %ar1[#i4 #j]
                 set #i5 #i + 5                         //5
                    if %ar1[#i #j] = %ar1[#i5 #j]
                     set %ar1[#i5 #j] 0                           //6
                    end_if
                set %ar1[#i4 #j] 0
               end_if
             set %ar1[#i3 #j] 0
           end_if
           set %ar1 [#i #j] 0
           set %ar1[#i1 #j] 0
           set %ar1 [#i2 #j] 0
           set #find1 1
       end_if
   end_for
end_for

     for #i 1 #v
for #j 1 #g
  if %ar1[#i #j] = 0
     set %ar[#i #j] 0
  end_if
  if %ar[#i #j] = 0
     set %ar1[#i #j] 0
    end_if
end_for
end_for
      log  нашли линии, заменили на 0

log  %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6]
log %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6]
log %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6]
log %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6]
log %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6]
log %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]

  set #find #find + #find1

if #find > 0
   gosub new
   end_if
   end_while
return

:new
for #i 1 #v
for #j 1 #g

if %ar[#i #j] = 0
  for #ii #i 2 -1
    set #ii1 #ii - 1
    set %ar[#ii #j] %ar[#ii1 #j]
    set %ar[#ii1 #j] 0
    set %ar1[#ii #j] %ar1[#ii1 #j]
    set %ar1[#ii1 #j] 0

  end_for
end_if
  end_for
end_for

   log убрали 0, опустили вниз

log %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6]
log %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6]
log %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6]
log %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6]
log %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6]
log %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]


return


Признаюсь, на самом деле, на первый взгляд, казалось все это дело, намного проще))) (IMG:style_emoticons/default/smile.gif)
Ну что же, если уже взялся, не бросать же на пол-пути))) (IMG:style_emoticons/default/sad.gif)
Расчитываю на посильную помощь (IMG:style_emoticons/default/rolleyes.gif)


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

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

(IMG:http://c2n.me/3wYjSiQ.jpg)

Если позиции находятся рядом, условно возьмем координаты [0 0] и [0 1]
то проверять надо [-1][-1], [-2][0] или [-1][1]. А также с другой стороны [2][-1], [2][1] и [3][0].

Таким образом нужно обработать 6 возможных позиций

(IMG:http://c2n.me/3wYmV59.jpg)

Можно попробовать сделать это, путем замены в исходном массиве, затем просчете в следующей вкладке, после, обратная замена и поиск другой комбинации.
Но вот, как организовать, что бы дождаться ответа от каждой из вкладок и в каком виде получать результат? в виде кол-ва убранных элементов? или в виде образовавшегося массива?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 15.4.2016, 18:14
Сообщение #20


***********

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



А прошлый код был разве не по поиску? Мде. Тяжело втыкать в такой код, когда думаешь, что он о другом) Это ты заполнение делал что ли?

По поводу как лучше делать - я рекомендую пробежать те несчастные страницы. Там посты короткие, 90% быстро отметешь. Я старался подвести все под математику и там были интересные выкладки. В частности точно помню наличие куска который был выдан с идеей "засунь в код и не заморачивайся". В общем смысле - смотри суммы координат, дели суммы координат, смотри остаток, смотри целую часть, анализируй это.

Вкладки тебе не нужны. Ну имхо не нужны. Распараллелить оно конечно круто, все такое, но как минимум на этапе первого поиска тебе точно не надо этого делать. Делить поле на куски будет очень тяжело, т.к. надо будет учитывать возможнось сбора фигуры с соседним полем. Т.е. придется перекрытия диапазонов корячить. В поле 6 на 6 имхо не актуально, хотя какой-то небольшой прирост при правильной реализации(тут есть тонкости) может дать. А вот для просчета возможных последствий и просчета получившейся ситуации при различных вариантах сбора линий - можно.

// Ты забыл диагонали.

убери код под спойлеры, а то форум растягивает.


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

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

 

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