Author Topic: Игра монополия, вопрос по логике  (Read 1820 times)

0 Members and 1 Guest are viewing this topic.

Doda

  • Guest
Игра монополия, вопрос по логике
« on: October 28, 2015, 03:42:12 AM »
Пишу бот для игры монополия в вк, игра интересная,но охота автоматизировать процесс игровой.
Написан бот, который умеет:
1.Бросать кубики
2.Покупать  фирмы
3.оплачивает  налоги
4. при недостатке денег выкидывает  фирму на укцион
5 участвует в аукционах
6.строит монополии

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

Code: [Select]
GETSCREEN
IF_PIXEL_IN(424,219, 454,219, 12303604)      //кафе
DEFINE($krasn, 0)
$krasn=$krasn+1
 WAITMS(100)
   else
 IF_PIXEL_IN(424,219, 454,219, 16571048)
 DEFINE($sin, 0)
$sin=$sin+1
 else
  IF_PIXEL_IN(424,219, 454,219, 8257535)
  DEFINE($zelt, 0)
$zelt=$zelt+1
else
 IF_PIXEL_IN(424,219, 454,219, 7338922)
  DEFINE($zele, 0)
$zele=$zele+1
else
IF_PIXEL_IN(424,219, 454,219, 14796284)
 DEFINE($roz, 0)
$roz=$roz+1
 else
IF_PIXEL_IN(424,219, 454,219, 13697023)
 DEFINE($zzelt, 0)
$zzelt=$zzelt+1
 else
IF_PIXEL_IN(424,219, 454,219, 16708320)
 DEFINE($zsin, 0)
$zsin=$zsin+1
else
IF_PIXEL_IN(424,219, 454,219, 15132667)
 DEFINE($zkras, 0)
$zkras=$zkras+1
else
IF_PIXEL_IN(424,219, 454,219, 16050942)
 DEFINE($zroz, 0)
$zroz=$zroz+1
else
IF_PIXEL_IN(424,219, 454,219, 13369056)
 DEFINE($zzel, 0)
$zzel=$zzel+1
else
DEFINE($bel, 0)
$bel=$bel+1


IF_PIXEL_IN(512,219, 542,219, 12303604)       //бар
DEFINE($krasn, 0)
$krasn=$krasn+1
 WAITMS(100)
   else
 IF_PIXEL_IN(512,219, 542,219, 16571048)
 DEFINE($sin, 0)
$sin=$sin+1
 else
  IF_PIXEL_IN(512,219, 542,219, 8257535)
  DEFINE($zelt, 0)
$zelt=$zelt+1
else
 IF_PIXEL_IN(512,219, 542,219, 7338922)
  DEFINE($zele, 0)
$zele=$zele+1
else
IF_PIXEL_IN(512,219, 542,219, 14796284)
 DEFINE($roz, 0)
$roz=$roz+1
 else
IF_PIXEL_IN(512,219, 542,219, 13697023)
 DEFINE($zzelt, 0)
$zzelt=$zzelt+1
 else
IF_PIXEL_IN(512,219, 542,219, 16708320)
 DEFINE($zsin, 0)
$zsin=$zsin+1
else
IF_PIXEL_IN(512,219, 542,219, 15132667)
 DEFINE($zkras, 0)
$zkras=$zkras+1
else
IF_PIXEL_IN(512,219, 542,219, 16050942)
 DEFINE($zroz, 0)
$zroz=$zroz+1
else
IF_PIXEL_IN(512,219, 542,219, 13369056)
 DEFINE($zzel, 0)
$zzel=$zzel+1
 else
 DEFINE($bel, 0)
$bel=$bel+1
else
IF_PIXEL_IN(557,219, 587,219, 12303604)  //ресторан
DEFINE($krasn, 0)
$krasn=$krasn+1
//1
   else
 IF_PIXEL_IN(557,219, 587,219, 16571048)
 DEFINE($sin, 0)
$sin=$sin+1
 else
  IF_PIXEL_IN(557,219, 587,219, 8257535)
  DEFINE($zelt, 0)
$zelt=$zelt+1
else
 IF_PIXEL_IN(557,219, 587,219, 7338922)
  DEFINE($zele, 0)
$zele=$zele+1
else
IF_PIXEL_IN(557,219, 587,219, 14796284)
 DEFINE($roz, 0)
$roz=$roz+1
 else
IF_PIXEL_IN(557,219, 587,219, 13697023)
 DEFINE($zzelt, 0)
$zzelt=$zzelt+1
 else
IF_PIXEL_IN(557,219, 587,219, 16708320)
 DEFINE($zsin, 0)
$zsin=$zsin+1
else
IF_PIXEL_IN(557,219, 587,219, 15132667)
 DEFINE($zkras, 0)
$zkras=$zkras+1
else
IF_PIXEL_IN(557,219, 587,219, 16050942)
 DEFINE($zroz, 0)
$zroz=$zroz+1
else
IF_PIXEL_IN(557,219, 587,219, 13369056)
 DEFINE($zzel, 0)
$zzel=$zzel+1
 else
 DEFINE($bel, 0)
$bel=$bel+1
else
Я сделал вот так. теперь у меня определяет  фирмы какого цвета на клетке,  определяет сама через логические операторы - покупать или нет фирму.  единственное с чем у меня косяк,  это... после выбора цвета она пишет код, осталось обозвать его нормально или цифрами от до 5(количество игроков) ну и я работаю над оптимизацией кода. подскажите что можно добавить для сокращеният.к. всего фирм 30, а у меня код для 3. и то заготовочка),тему написал днем, пока  редактировал  - полазал по сайту и  нашел много ответов на свои вопросы

Code: [Select]
Getscreen

$cvet[0] =  12303604
$cvet[1] = 16571048               
$cvet[2] = 8257535
$cvet[3] = 7338922
$cvet[4] = 14796284
$cvet[5] = 13697023
$cvet[6] = 16708320
$cvet[7] = 15132667
$cvet[8] = 16050942
$cvet[9] = 13369056
$cvet[10] = 15066597


for($e, $e < 11)   
    IF_PIXEL_IN(424,219, 454,219,  $cvet[ $e1 ])//кафе
print($cvet[ $e1 ])
Arrpush($eda, $cvet[ $e1 ])
  else
  $e1=($e1+1)
end_cyc
end_if
UNDEFINE($e)
UNDEFINE($e1)
for($e, $e < 11)
IF_PIXEL_IN(512,219, 542,219, $cvet[ $e1 ])       //бар
print($cvet[ $e1 ])
  Arrpush($eda, $cvet[ $e1 ])
else
  $e1=($e1+1)
end_cyc
end_if
UNDEFINE($e)
UNDEFINE($e1)
for($e, $e < 11)
IF_PIXEL_IN(557,219, 587,219, $cvet[ $e1 ])       //ресторан
print($cvet[ $e1 ])
  Arrpush($eda, $cvet[ $e1 ])
else
  $e1=($e1+1)
end_cyc
end_if
switch($eda)
case(0) | (16708320)
  print("покупай фирму")
case(0) | (8257535)

  print("бери, иначе проиграешь")
  case(16708320) & (8257535)
  print("не трать деньги")
halt    

[spoiler][/spoiler]

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Игра монополия, вопрос по логике
« Reply #1 on: October 28, 2015, 08:26:38 AM »
на счет второго кода, куча ошибок.
В каждом цикле перепутаны строки
Code: (clickermann) [Select]
end_cyc
end_if

но самое забавное началось когда мы дошли до свитча
Вот это полнейшая бредятина
Code: (clickermann) [Select]
switch($eda) // у массива не указан номер ячейки памяти
case(0) | (16708320) // нельзя комбинировать условия!
   print("покупай фирму")
case(0) | (8257535)
   
   print("бери, иначе проиграешь")
case(16708320) & (8257535)
   print("не трать деньги")
   halt
END_SWITCH
Вообще не пойму что ты этим хотел добиться. Чтобы switch каким то волшебным образом извлек из массива то что ты хочешь?
Массив это таблица в один столбик.

Чтобы сократить повторяющийся код нужно использовать подпрограммы
Code: (clickermann) [Select]
$cvet[0] = 12303604
$cvet[1] = 16571048
$cvet[2] = 8257535
$cvet[3] = 7338922
$cvet[4] = 14796284
$cvet[5] = 13697023
$cvet[6] = 16708320
$cvet[7] = 15132667
$cvet[8] = 16050942
$cvet[9] = 13369056
$cvet[10] = 15066597

SUB(analiz,$pxl_x,$pxl_y)
   $e1 = 0
   GETSCREEN
   FOR($e=0,$e<11)
      IF(PXL($pxl_x,$pxl_y) = $cvet[$e1]) // на самом деле при совпадении в массив до 11 раз может быть записано одно и тоже
         print($cvet[$e1])
         ARRPUSH($eda, $cvet[$e1])
      ELSE
         INC($e1,1)
      END_IF
   END_CYC
END_SUB

analiz(424,219) // кафе
analiz(512,219) // бар
analiz(557,219) // ресторан

LOGWRITE ("== Массив ==")
FOR($a=0,$a<ARRSIZE($eda))
   LOGWRITE ($eda[$a]) // вывод значений массива в лог
END_CYC

HALT

Может быть правильно будет так?
Code: (clickermann) [Select]
$cvet[0] = 12303604
$cvet[1] = 16571048
$cvet[2] = 8257535
$cvet[3] = 7338922
$cvet[4] = 14796284
$cvet[5] = 13697023
$cvet[6] = 16708320
$cvet[7] = 15132667
$cvet[8] = 16050942
$cvet[9] = 13369056
$cvet[10] = 15066597

SUB(analiz,$pxl_x,$pxl_y)
   GETSCREEN
   FOR($e=0,$e<11)
      IF(PXL($pxl_x,$pxl_y) = $cvet[$e]) // прогоняем все цвета и записываем совпадения
         print($cvet[$e])
         ARRPUSH($eda, $cvet[$e])
      END_IF
   END_CYC
END_SUB

analiz(424,219) // кафе
analiz(512,219) // бар
analiz(557,219) // ресторан

LOGWRITE ("== Массив ==")
FOR($a=0,$a<ARRSIZE($eda))
   LOGWRITE ($eda[$a]) // вывод значений массива в лог
END_CYC

HALT

Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
Re: Игра монополия, вопрос по логике
« Reply #2 on: October 28, 2015, 01:26:57 PM »
почему люди начинают писать дефайны в интерпретируемом языке кликера? откуда они берут это?

ну и имена переменных отличные у автора, сразу понятно где что

Doda

  • Guest
Re: Игра монополия, вопрос по логике
« Reply #3 on: October 31, 2015, 10:06:46 PM »
Oraven, спасибо тебе огромное! я  разбирал твой код, он безусловно хорош! спасибо огромное. два дня мучался как из предложенных трех фирм путем анализа  определять - нужно ли покупать /закладывать фирму? даже кликер снес, но я упорный.. сейчас листал форум и меня осенило!)

вот набросок(не под игру, а попытка понять алгоритм) осталось прикрутить алгоритм под 11 монополий по 2-3 фирмы с запоминанием позиций фирм в массив, чтобы выдавать результат не так
Quote
бери, твоих фирм в монополи нет
а так
Quote
бери фирмы 2,3, твоих фирм в монолии нет
ну и само собой, смысл не в записи в лог, а в клике по кнопкам купли/продажи и наверн  для удобства сделаю подпрограммы для нижеприведенного кода



Code: (clickermann) [Select]
$pustoi=0 //пустые фирмы
$moi=1  //мои фирмы
$vrag=2 //противник
for($i=0,$i<3)
   arrpush($ttt, rnd(0,2))//обычно в монополии 2-3 фирмы-создаем рандомный массив на 3 элемента. от 0 до 2(мои, пустые фирмы, противника
    print($ttt[$i]) //кидаем его в лог
end_cyc



for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($moi=$q)//если есть мои фирмы,  $mu=1
      $mu=1
         end_if
end_cyc

for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($vrag=$q)//ищем фирмы врага в массиве,
      $muvrag=1
   end_if
end_cyc

for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($pustoi=$q)//ищем фирмы пустые
      $mupustoi=1
   end_if
end_cyc
//ну а тут пошел анализ ситуаций
if ($mu=0)
   if ($muvrag=0)
      print(" Все пусто ")
   end_if
end_if
if ($mu=0)
   if ($muvrag=1)
      if ($mupustoi=0)
         print(" Все  у врага ")
      end_if
   end_if
end_if
if ($mu=1)
   if ($muvrag=0)
      if ($mupustoi=0)
         print(" Все  у меня ")
      end_if
   end_if
end_if
if ($mu=1)
   if ($muvrag=1)
      if ($mupustoi=1)
         print(" не трать финансы ")
      end_if
   end_if
end_if
if ($mu=0)
   if ($muvrag=1)
      if ($mupustoi=1)
         print(" бери, твоих фирм в монолии нет ")
      end_if
   end_if
end_if
if ($mu=1)
   if ($muvrag=1)
      if ($mupustoi=0)
         print(" пустых нет, все поровну")
      end_if
   end_if
end_if
if ($mu=1)
   if ($muvrag=0)
      if ($mupustoi=1)
         print(" фирмы мои, но есть пустые.покупай чтоб строить монополию ")
      end_if
   end_if
end_if

halt


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

Code: (clickermann) [Select]
sub(poisk,$firma,$parametr,$qn)
for ($o=0, $o<arrsize($ttt))
   $qn=$ttt[$o]
   if  ($firma=$qn)
      $parametr=1
//      arrpush($q,$moi)
   end_if
end_cyc
end_sub

poisk($moi,$mu,$q1)
poisk($vrag,$muvrag,$q2)
poisk($pustoi,$mupustoi,$q3)

без подпрограмм работает отлично
 а вот уже с оптимизацией

Code: (clickermann) [Select]
$pustoi=0
$moi=1
$vrag=2
for($i=0,$i<3)
   arrpush($ttt, rnd(0,2))
   print($ttt[$i])
   
end_cyc


for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($moi=$q)
      $mu=1
      //      arrpush($q,$moi)
   end_if
end_cyc

for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($vrag=$q)
      $muvrag=1
   end_if
end_cyc

for ($o=0, $o<arrsize($ttt))
   $q=$ttt[$o]
   if  ($pustoi=$q)
      $mupustoi=1
   end_if
end_cyc

sub(infa,$mu1,$muvrag1,$mupustoi1,$tekst)
   if ($mu=$mu1)
      if ($muvrag=$muvrag1)
         if ($mupustoi=$mupustoi1)
            print($tekst)
         end_if
      end_if
   end_if
end_sub
infa(0,0,1," Все пусто ")
infa(0,1,0, " Все  у врага ")
infa(1,0,0, " Все  у меня ")
infa(1,1,1, " не трать финансы ")
infa(0,1,1, " бери, твоих фирм в монолии нет ")
infa(1,1,0, " пустых нет, все поровну")
infa(1,0,1, " фирмы мои, но есть пустые.покупай чтоб строить монополию ")

halt
« Last Edit: November 01, 2015, 02:36:26 AM by Doda »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Игра монополия, вопрос по логике
« Reply #4 on: November 02, 2015, 10:47:50 AM »
подскажите, почему подпрограмма не хочет работать?на выходе все по нулям

Code: (clickermann) [Select]
sub(poisk,$firma,$parametr,$qn)
for ($o=0, $o<arrsize($ttt))
   $qn=$ttt[$o]
   if  ($firma=$qn)
      $parametr=1
//      arrpush($q,$moi)
   end_if
end_cyc
end_sub

poisk($moi,$mu,$q1)
poisk($vrag,$muvrag,$q2)
poisk($pustoi,$mupustoi,$q3)

Где по нулям и что именно?
Твоя подпрограмму меняет только локальную переменную $parametr которая при завершении уничтожается. Больше она ничего не делает.
Ты наверное думал, если передаёшь $muvrag то после обработки изменения и присвоятся $muvrag? Нет.