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

0 Members and 1 Guest are viewing this topic.

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #15 on: December 29, 2016, 10:12:06 PM »
перепроверь, я всё правильно понял? мог что нибудь упестить, или не правильно понять.



немного подправил, нашел ошибочку.
даже такая версия кода не рабочая
если я что то понимаю то вот этот цикл
Code: [Select]
WHILE($stlb = 1) бесконечен при условии что $m не равен 1 а такой вариант тоже может быть
 $stlb = 0 у тебя после второй проверки на $m а если не проходит первую проверку то крутит его бесконечно.
и насколько я понимаю код то задачу которую я решал, объяснил я не очень четко.
попытка 2
у меня есть поле 5 на 4 клеток
начинаю проверку с нижнего левого квадрата по горизантали и вверх двигаюсь, если нахожу мигающий то проверяю если это не первая строка и внизу квадратик замигал то спускаюсь вниз на предидущую строку  и начинаю проверять предидущую, если внизу не замигал то проверяю слева квадратик, если он замигал, то возращаюсь на квадратик влево открываю его и проверяю опять низ и лево.
ну а если после открытия не слева и не внизу не замигал просто проверяю дальше.
 
как я понял в твоем коде ты задерживаешь на том же месте проверку а не откатываешь назад.

Но свою ошибку я понял,гото уберу, завтра попробую написать что то путевое либо по твоему примеру вайлы либо $i=$i-2  и иф еще один
 

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #16 on: December 29, 2016, 10:46:18 PM »
я всеравно всю суть "попытки 2" не понял. специально оставил твои гото и метки для наглядности, вроде всё как по меткам должно работать.
Code: (clickermann) [Select]
                  migk($i,$j-1)
                  IF ($m=1)
                     $j=$j-1
                     //goto(stlb)
                     //возвращаемся назад в текущем цикле, не наращивая j
                     $stlb = 1
                  else
                     $stlb = 0
                  END_IF
вот тут, если м!0 то какраз таки из цикла WHILE($stlb = 1) должно выскочить, и $j наращивается, и дальше опять в цикл. чтото с логикой не то. может кто другой поможет. я на этом всё.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы
« Reply #17 on: December 29, 2016, 10:50:28 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)
           
            $stlb = 0
            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)
                  else
                     IF($j!0)
                        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_IF
            END_IF
           
         END_CYC
      END_CYC
   END_CYC
END_CYC

так больше вероятность, что не зависнет в цикле WHILE($stlb = 1)  ;D

 ;D это я просто наугад решил так..... но попытка не пытка :D

или так
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)
           
            $stlb = 0
            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
               else
                  IF($j!0)
                     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_IF
           
         END_CYC
      END_CYC
   END_CYC
END_CYC
« Last Edit: December 29, 2016, 11:32:29 PM by dramster »

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Массивы
« Reply #18 on: December 30, 2016, 04:31:41 PM »

так больше вероятность, что не зависнет в цикле WHILE($stlb = 1)  ;D

 ;D это я просто наугад решил так..... но попытка не пытка :D


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


если сможешь объясни мне следующий поворот программы
( , я как неграмотный юзверь выскакивал по гото минуя конец цыкла и мои значения $j=$j-1 не просто не наращивались а уменьшались почему я и ввел условие IF($j!0) что бы в минус не уйти) ты  $j=$j-1 а потом давал пройти ей дальше по циклу WHILE($stlb = 1) Она у тебя в итоге уменьшалась на 1 или ты уменьшил, цикл увеличил, а итого не изменилось?


1 вариант скрипта: строка №28-№33 выгледит все логично но если я правильно понял глюк $j = 99999 а потом оно всетаки проходит через конец цыкла и становиться 100000 и ломает цикл WHILE($j = 99999) и FOR ($i=0, $i<$B) прокручивается до конца в бездействии, менял в твоей программе 99998 стала работать лучше. ближе к результату ( жаль что слишком рано слил все попытки теста а ждать еще час немного лень) свой писал уже не прокатило, в этом моменте я тоже запутался



в обоих циклах условие  IF($j!0) и вся последующая проверка $j-1 зависит от IF($i!0) в первом все кроме первой строки срабатывает во втором наоборот только первая( если я правильно ифы распусал)


во втором еще какой то глюк был с прирыванием преждевременным, может тот же самый что в первом, но поймал я его только раз ( и анализировать доконца не смог)

зато понял две вещи на твоих примерах, вопервых твой принцип использования WHILE (интересно и позновательно, много новых идей) второе объяснять надо проще доходчевей и наглядно, а то я помоему с идеей сам перемудрил




итог №1 случайно вышел код, работает не совсем по плану но не плохо
Code: (clickermann) [Select]
FOR ($i=0, $i<$B) //перебираю строки
print ("строка",$i)
FOR ($j=0, $j<$D) //перебераю столбцы
print ("столбец",$j)


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       
$j=$j-1//сдесь я уменьшаю цикл дальше увеличит на 1 в итоге не измениться

END_IF
END_IF

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

END_IF
END_IF
END_IF
END_CYC
END_CYC
   
итог №2 вроде то что надо
Code: (clickermann) [Select]

FOR ($i=0, $i<$B) //перебираю строки

print ("строка",$i)


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

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-2//если начал то счетчик откатываю на 1       
$j=$D

END_IF
END_IF

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

END_IF
END_IF
END_IF
END_CYC
END_CYC
итог №3 это на основе твоих  кодов, твоей идеи. протестил еще не чательно но вроде работает
Code: (clickermann) [Select]
$j=99999
FOR ($i=0, $i<$B) //перебираю строки

print ("строка",$i)

   IF($j=$D)
      $j=99999
   END_IF

   WHILE($j = 99999)
$j=0
FOR ($j=0, $j<$D) //перебераю столбцы
$stlb = 1
    WHILE($stlb = 1)
   
$stlb = 0
print ("столбец",$j)

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         
$j = 9999
$stlb = 0
END_IF
END_IF

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

END_IF
END_IF
END_IF
END_CYC
        END_CYC
END_CYC
END_CYC
P.S. дальше я 3 измерение буду добавлять дальше еще веселее станет. буду выбирать один из трех способов прохождения
и что бы внести наконец ясность алгоритм делаю прохождения вот этой игрушки игровой локации
https://vk.com/app5683079_60421822