Farmerama bot 1.

Famerama je online webová hra, která je myslím velice populární. I u nás doma se před časem hrála. Nicméně politika hry je taková, že šikovné vlastnosti a pomocníci ve hře se musí platit skutečnými penězi. Například funkce kombajn a sečka. Pokud hráč této hry nemá kombajn, je odkázaný na klikání. Kdo hru hrál, ví, že sklidit a zasadit je skutečně stereotypní činnost. Řekl bych, až nezáživná činnost.

Proto jsem zkusil naprogramovat vlastní kombajn a vlastní sečku. Nejprve bylo potřeba učinit rozbor, jak ta hra vlastně funguje a jak je postavená. Jde o flashovou hru, kdy celá hrací plocha je jedna flash plocha. Z pohledu Windows API jde o obyčejné okno s canvasem.
Z toho plynou 2 důležité informace:

  • aplikace bude muset umět najít správné okno s hrou
  • vše co je ve hře vidět je již jedna velká bitmapa

Farmerama

Tato zmíněná bitmapa se skládá z desítek menších bitmap, které logika hry šikovně skládá přes sebe a tak vzniká celkem povedený dojem.
Kdo by chtěl v takové bitmapě něco najít, musí rozhodně pracovat s rastry a pixely. Kdo to již někdy zkoušel ví, že indexovat bitmapu a vůbec práce s pixely může být náročná a rychlost aplikace může jít rapidně dolu.

Vypadá to na zajímavé téma a tak jsem se rozhodl, že zkusím napsat takovou aplikaci, která:

  • bude mít funkci kombajnu
    • rozpozná na obrázku jednotlivé plodiny v jejich dozrálém stavu
    • bude umět oklikat dialog, na kterém se sklizení potvrzuje
    • rozpozná chovné farmy, že mají dokončený chov zvířat
    • bude umět "sklidit" zvíře a spustit nový chov, což je série dialogů (nakrmit, dát vodu)
  • bude mít funkci sečky
    • rozpozná prázné políčko, na které lze něco zasadit
    • zasadí zvolenou plodinu, což je opět nějaké dialogové flow

Z bodů uvedených výše vyplývá, že se celá věc zkomplikuje tím, že pro sklizení a zasetí je potřeba rozpoznat nějaké dialogy, pomocí kterých hra s hráčem komunikuje. Když se člověk dívá na okno hry, v kterém vyskočí dialog, přirozeně pozná, že je tam dialog navíc a kde je, jakého je typu (podle vzhledu, rozložení tlačítek). Pro počítač je to stále jen bitmapa, která se změnila. Co tam přibylo? Jak poznám dialog?
V můj prospěch hraje fakt, že vím, jak hra funguje, že jde podle stejného scénáře dokola. Stereotyp úkonů se stále opakuje ať seju oves, nebo zelí.
Dialogy s nabídkami kombajnu nebo sečky se objevují poblíže místa, kde hráč klikne, ale pole v blízkosti okrajů hrací plochy (bitmapy) se posouvají dovnitř hrací plochy, aby byl dialog vidět celý a nyvyjížděl tak z hrací plochy. Takže se nedá odvodit přesné pravidlo, kde očekávat dialogy a jejich tlačítka. Navíc Farmerama některé dialogy záměrně vyhazuje na náhodných souřadnicích.

Do tohoto mechanizmu navíc vstupuje asynchroní notifikační mechanizmus hry, který zobrazuje nejrůznější dialogy, kterými hráče informuje o různých událostech, které přímo nesouvicí s aktuálně vykonávanou činností. Například vyskakují dialogy informující o dárcích, které zasílají jiní hráči. Nebo, že ve hře jsou dostupné nové funkčnosti, nebo že jsem jako hráč někam postoupil.

Chci aby se můj bot s tím vším dokázal vypořádat. Je jasné, že to nebude úplně snadné a že budu potřebovat vyvinout jistý druh počítačkového vidění. Vše jde ale založit na primitivním principu.
Budu hledat obraz v obrazu. Indexování bitmapy je myslím mimo hru, protože zdrojová bitmapa se mi mění téměř každým snímkem. A indexovaní bitmapy v takové frekvenci je je ještě náročnější, než daleko jednodušší způsob hledání. Po ruce je brutální lineární procházení po řádcích a sloupcích. Porovnáváním pixelů zdrojové bitmapy proti předloze je správné řešení.

Jistě vás napadne, že to musí být brutálně pomalé. Ale pokud do mechanizmu vložím sérii optimalizací, bude to naopak brutálně rychlé.
Vezměte si, jaké máme požadavky na hledací algorytmus. Rozměry hrací plochy jsou 996 x 600. Měl by rozpoznat na 30 plodin.
Také by bylo dobré, kdyby kombajn mohl kromě sklízení plodin sklízet také chovaná zvířata. Tech je při nejmenším dalších 10.

Sklidit zvíře znamená, že se vyzvedne z farny, vykydá se, dá se nové krmivo a voda. To je proces skládající se hned z několika dialogů.

Zde dávám ukázku jak kombajn a sečka pracuje v reálu a v dalším díle vypíchnu nějaké pěkné fragmenty kódu o kterých vám povím.

FUVI0111ADANAUL
FREE Joomla! template "Adana"
joomla 1.6 templates by funky-visions.de