Netriviální implementace tic-tac-toe pro Android. Další Tic Tac Toe pomocí Java Swing

Bůh Alex 9. prosince 2013 ve 23:09

Netriviální implementace tic-tac-toe pro Android

  • Vývoj hry

Tento článek bude hovořit o tic-tac-toe v Javě pro Android ve 30 řádcích kódu, pěti a půl tisících řádcích kódu a o tom, proč přesně před rokem, 9. prosince, bylo potřeba tolik kódu , zveřejnil jsem svou hru na Google Play. Nyní chci mluvit o tom, co se letos stalo, jak popularita hry rostla, co fungovalo a co ne Uvidíte čisté statistiky stažení a smazání za rok existence hry, čísla. Zjistíte, kolik uživatelů můžete získat z Google Play, jak hra vznikala, jak byla testována. Zjistíte, zda je možné vytvořit indie hru s nulovým rozpočtem, jaké potíže může mít malá hra ve velkém světě Pokud máte zájem, jste vítáni.

Zavedení

Už dlouho se snažím vyrábět hračky, většinou jednoduché. Po studiu Javy jsem se rozhodl zkusit v tomto jazyce vytvořit něco užitečného. Když jsem se dozvěděl, že můžete psát hry v Javě pro Android, rozhodl jsem se zkusit udělat něco jednoduchého, abych se naučil vytvářet aplikace pro chytré telefony.

Nápad

Nyní potřebuji nápad, který je příliš jednoduchý, aby neztrácel čas, pokud selže, a příliš jedinečný, aby aplikace nezůstala jen jiným názvem na mnohamilionovém seznamu aplikací, které jsem si vybral Tic Tac Toe. Příliš snadné? Existuje mnoho takových her? Teď jsme museli přijít s něčím unikátním. Proč nyní všechny počítačové systémy piškvorek fungují na principu klikni? Tak jsem se rozhodl, že je nechám nakreslit figurky a hra sama určí, co se nakreslí. Nyní, jak provést implementaci? Možnosti:
  • Každá buňka je rastrový obrázek. Nevýhoda: v zahraničí nemůžete kreslit, jinak to vypadá křivě a plýtvá to pamětí. Výhody: jednoduchost. Na internetu obdoba již existuje, ale ne pro mobily.
  • Celé pole je rastrový obrázek. Nevýhoda: hledejte tvary v celém obrázku, pravděpodobně je snazší rozpoznat tištěný text než najít křivé tvary, problém oddělování slepených tvarů, velké zatížení procesoru. Výhoda: můžete nakreslit kříž tak, že přeběhnete do sousední buňky.
  • Tvary jsou vektorové. Nevýhody: překreslování může trvat dlouho (ale to lze vyřešit pomocí vyrovnávací paměti). Výhody: figurky, které se navzájem srazily, můžete oddělit, snadno můžete měnit polohu jednotlivých figurek.
Po troše googlování jsem nic podobného nenašel. Proč je nápad dobrý: Kreslení figurek dává hře svobodu volby; tvar figurky si určuje sám hráč. Proto je myšlenkou hry poskytnout svobodu kreslení, svobodu „podvádět“ - skicovat soupeřovy kusy a svobodu nastavení a pravidel hry (velikost pole atd.). křížek nebo nula trvá mnohem déle než pouhé kliknutí na buňku. Ne každému se proto tato hra líbí, než jsem hru vytvořil, rychle jsem hledal podobné hry. Žádné podobné hry pro Android jsem nenašel. Napadlo mě nazvat hru „tic-tac-toe“ + kreslení. Vzhledem k tomu, že na Androidu je tolik Tic Tac Toes, rozhodl jsem se tuto obtížnou krátkou fázi tvorby hry odložit a přijít s konečným názvem poté, co byl připraven pracovní prototyp. Poté, co jsem začal psát název hru. Poté, co jsem přeložil „tic-tac-toe“ do angličtiny a přidal k němu slovo „Draw“, našel jsem snad jediného konkurenta piškvorkám s kreslením. Potřeboval jsem do názvu hry zahrnout „kreslení“. Po přemýšlení o slově Draw a potřebě zahrnout do názvu hry slovo o kreslení, bylo rozhodnuto hru nazvat „Tic-Tac-Toe Drawing!“. Pokud říkáte, že název je velmi podobný ostatním, jak tedy můžete nazvat hru piškvorky, pokud je na GooglePlay více než 250 placených piškvorek a více než 1000 bezplatných?

Implementace

UPD: Vlastnosti hry, které bylo třeba implementovat:
  • Kreslení figurek hráčem, rozpoznávání nakreslených figurek
  • Různé velikosti herního pole: od 3x3 do 12x12 (je možné více, ale omezení jsou dána velikostí obrazovky mnoha zařízení)
  • V souladu s tím je hra nejen 3 v řadě, ale také 4, 5, 6 v řadě
Zde vyvstaly problémy: protože můžete kreslit kdekoli, můžete měnit nepřátelské figurky, zakrývat, skicovat, mazat, dokonce se pohybovat v tahu, který není váš (ano, to lze provést, když nakreslíte dva křížky na ve stejnou dobu). Co dělat v takových případech? Zakázat nebo povolit? Bylo rozhodnuto to povolit, ponechat možnost vyhrát v jakékoli možnosti, ale po výhře zobrazit stížnost na podvádění, například: „Nespravedlivé vítězství“.
Výběr vývojového prostředí a obecného plánu tvorby
Zatímco jsem hledal něco, na co bych mohl psát pro Android, stahoval Eclipse, studoval dokumentaci, rozhodl jsem se začít tím, co na mě bylo nainstalováno – NetBeans. Myslel jsem, že v Androidu je Java stejná jako jednoduchá Java, měly by být téměř stejné, což znamená, že logiku (engine) lze psát samostatně Podle mého plánu měla být hra rozdělena do dvou balíčků: Engine a GUI . Engine - herní engine, herní logika, tento balíček je téměř nezávislý na GUI a implementaci OS, má rozhraní pro interakci s GUI: přijímání příchozích událostí a výstupů. GUI – záleží na OS. Chcete-li portovat na Android, musíte pouze vyměnit GUI, aniž byste se dotkli enginu, nebo téměř bez dotyku. To byl můj plán. Nápad to byl dobrý, ale při překladu na Android nastal problém s adaptací (popsáno níže).

Vývoj hry

Cyklus vývoje programu
Abych přesně věděl, co mám dělat, rozhodl jsem se bod po bodu sepsat, co má moje hra dělat, co je potřeba implementovat. Nejprve jsem si vzal papír, na který jsem si napsal hlavní sekce: Engine, AI, Graphics, Bugs atd., pak jsem si pro každou kategorii napsal problémy, které bylo potřeba vyřešit. Když jsem problém vyřešil, odškrtával jsem, co se udělalo, při nečinnosti jsem přidával nové nápady do seznamů a při ladění jsem zvětšoval sekci „chyby“ a někdy i další sekce. Pak mi došel druhý list, ale stačily dva listy Vzhledem k tomu, že vývoj a podpora se plánovala ne za pár dní, ale na dlouhé období, pro plánování a lepší podporu se nepoužívaly jen listy s body. se také rozhodl dobře komentovat kód (viz Javadoc). Vývoj hry byl rozdělen do 2 fází: vytvořit verzi pro PC, přenést ji na Android První verze (alfa) byla vytvořena pro PC. Byla implementována ve fázích:
  1. jednoduché GUI, kreslení čar myší, buněk. Rozpoznejte linie jako kříže a prsty. (Vybarvování tvarů podle rozpoznaného tvaru bylo provedeno pro odladění rozpoznávání tvarů, a protože to dopadlo dobře, bylo to ponecháno ve hře)
  2. pravidla vítězství, hra muže proti muži.
  3. herní AI, režim počítačové hry.
Životní cyklus každé z výše uvedených fází:
  1. sestavení seznamu základních požadavků
  2. programování
  3. kontrola výsledku a ladění. Pokud jsou zjištěny chyby, které nejsou kompatibilní s životností programu, přejděte ke kroku 1)
V další fázi byly algoritmy dovedeny k dokonalosti Cyklus těchto vylepšení je podobný tomu popsanému výše:
  1. sestavení seznamu problémů
  2. programování
  3. kontrola výsledku a ladění. Teď jsme hledali, co by se dalo zlepšit.
Tato vylepšení se týkala především rozpoznávání postav a hraní botů, o kterých bude napsáno později. Ve druhé fázi byla hra portována na Eclipse a začalo se vytvářet GUI pro Android. Zde nastaly problémy s kompatibilitou motor s Androidem. V běžné Javě jsou souřadnice plátna (Graphics) int, v Androidu jsou float. Lišily se také názvy mnoha kreslicích funkcí a tříd (Canvas = Drawable atd.) a datová struktura pro drawLine. Musel jsem napsat „převaděč formátů“ (berličku) a nahradit názvy datových typů. To vše jsem stihl za něco málo přes hodinu, protože tam byly rozdíly hlavně v názvech, ne v logice. Poté další vylepšení, kreslení obrázků Po dokončení integrace enginu a nového GUI začalo testování a ladění Cyklus těchto vylepšení je podobný tomu popsanému výše:
  1. Testování hry: spuštění hry na emulátoru s různými velikostmi obrazovky.
  2. Vytvoření seznamu problémů
  3. Oprava problémů
Tento proces pokračoval, dokud nebylo rozhodnuto, že hra nemá žádné chyby. Vyšlo první vydání, verze 1.0.

Jak byla napsána AI

Vyvinout robota (ve hře se termín AI používal pro zkratku) pro jednoduché piškvorky vypadá jako snadný úkol. Ale chtěl jsem, aby tato umělá inteligence byla univerzální: aby fungovala na poli libovolné velikosti, a to nejen ve hře 3 za sebou, ale i v n-řadách. Některé implementace umělé inteligence fungovaly dobře na velkém hřišti, ale snadno se ztratily na malém hřišti nebo naopak. Protože každá implementace umělé inteligence vyžadovala testování nejen kvůli nějakému výkonu, ale také kvůli schopnosti vyhrát hru, musel jsem nejprve provést test. otestujte AI ručně - prostě si s tím hrajte. Bylo to ale příliš pomalé a úspěšnost měření byla subjektivní, takže jsem našel jiný způsob, jak AI otestovat. Umělá inteligence byla zcela implementována jako třída, takže byl vytvořen samostatný program pro testování umělé inteligence: byly spuštěny dvě různé třídy umělé inteligence, které se hrály na virtuálním hřišti, výsledky byly výstupem do konzole (kdo vyhrál, v kolika pohyby). V případě potřeby byla také data pro každý pohyb zobrazena v textovém formátu (herní situace, co si AI myslí o ziskovosti každé buňky). Standardem pro dobře hrajícího soupeře bylo vzít si open-source AI ze hry 5 v řadě, kterou jsem našel na launchpadu. Testy byly provedeny několikrát, aby se snížil vliv náhodnosti, takže byly provedeny 2 AI: normální a komplexní. V implementaci se velmi lišily: komplexní umělá inteligence fungovala na principu sledování možných cest a průměrná na jednoduchém principu: třídění buněk, kam umístit, abyste vyhráli nebo neprohráli, nebo alespoň něco blízko, jinak náhodný. Proto, dokud jsem neoptimalizoval algoritmus analýzy vítězství (verze 1.5), byla komplexní AI mnohonásobně rychlejší než průměrná a snadná ve hrách s polem větším než 3x3. Po vyřazení spousty průměrné AI se objevila snadná úroveň obtížnosti.

Kód

Krátce ke kódu hry v Javě: celkem čistý zdrojový kód zabírá 275 kB, z toho 75 % tvoří Engine. Kód je rozdělen do tří balíčků, používá se asi 22 tříd. Existuje pouze 5670 řádků kódu, ale je tam spousta komentářů, zakomentovaných částí a prázdných řádků, takže čistého kódu je asi 4000, v průměru 250 řádků na třídu (soubor). Hlavní engine byl napsán za pár týdnů, bylo možné jej zrychlit až na jeden týden. Při psaní kódu jsem označil nebezpečná místa, kde by mohla nastat chyba (např. design se ukázal jako příliš nepřehledný). s komentáři // FIXME a // TODO. Koncentrace komentářů: jeden FIXME na 400 řádků kódu a asi 1 TODO na 60 řádků kódu. Když byly během testovacího procesu zjištěny chyby, buď jsem okamžitě pochopil, co opravit, nebo byly chyby umístěny přesně v těchto řádcích. Před každým vydáním jsem hru testoval a hrál jsem 5-10krát s různými nastaveními.

Spoiler o testu

Při šamanském testování multi-touch jsem místo chyb ve hře našel chybu v Androidu, je možné ji opakovat pomocí všech 10 prstů a dělat složité pohyby na obrazovce. Chcete-li poté obnovit funkčnost zařízení, je vyžadován restart.

Výsledkem je spolehlivá aplikace, jak dokládá zpráva Crashes and ANR.
Existují však i další vysvětlení: byly použity bloky try-catch, což není příliš dobré, ale v některých případech, pokud dojde k selhání, aplikace by měla automaticky deaktivovat „experimentální“ funkce a přejít na jejich starší verze; buď tato stránka nefunguje pro Google; nebo hru používá příliš málo lidí.

Vydání a překlady

Překlad aplikací pro Android je velmi jednoduchý: všechny řetězce jsou uloženy v souboru strings.xml, který se nachází ve složce values ​​​​. Výchozí jazyk je angličtina. Chcete-li přidat ruský jazyk (a další), musíte vytvořit složku values-ru a vytvořit kopii souboru strings.xml, který bude obsahovat přeložené náhrady řetězců. Všechny řetězce v aplikaci se získávají přes API Pro urychlení překladu můžete použít elektronické překladače, já jsem například použil Google Translator. Před překladem hry jsem si nebyl jistý svou znalostí anglického jazyka, po překladu se nejistota ve znalostech angličtiny přenesla na Google Translator. Při překladu se snažte minimálně přeložit výsledné věty do výchozího jazyka. Ještě lépe si slova dodatečně přeložte sami a porovnejte je s tím, jak je přeložil překladatel. Vyskytly se případy, kdy počítačový překladač příliš zkreslil význam a připustil, že některá slova mají jiný význam. Aplikace byla přeložena do angličtiny, takže podporuje dva jazyky. Dále budu mluvit o vlivu překladů na stahování První vydání hry bylo 9. prosince 2012. Hned druhý den jsem ve statistikách viděl, že první den bylo 1 stažení Před vydáním jsem přemýšlel jaké číslo dát první verzi: 0,99 nebo 1,0? Vzhledem k tomu, že jsem se rozhodl, že na emulátoru funguje téměř vše a mohu na něm hrát, mám právo dát číslo 1.0. Tehdy jsem se velmi mýlil, protože mnoho uživatelů si stěžovalo, že tuto hru nemohou hrát Uživatelé si stěžovali, že mají ve hře velké brzdy, jiní, že se jim nezobrazuje správně grafika. A měli pravdu, na 90% reálných zařízení se nedalo hrát Problém s brzdami byl způsoben tím, že grafika se kreslila překreslováním celého Drawable canvasu a na tohle bylo vynaloženo hodně prostředků. Musel jsem rychle hledat řešení a bylo nalezeno. Ne, ne přes OpenGL. Překreslování lze provést buď jako celé plátno (repaint(), onPaint()) nebo jako fragmenty (repaintCliping(), onPaint(rect)). Musel jsem naučit hru určovat požadované oblasti překreslení a předem naplánovat zóny překreslení (kombinovat protínající se zóny, oddělit oddělené zóny překreslení). Všechna tato vylepšení a rady od některých lidí byly shromážděny v nové verzi, která vyšla o týden později. Při každé aktualizaci jsem si myslel, že každá předchozí verze je špatná a nehratelná, ale ta nová je nejlepší a žádná neexistuje. jediná chyba v něm. Testování vydání bylo zpočátku prováděno pouze na emulátoru. Toto zařízení mi bylo užitečné pouze pro dva účely: 1) abych si uvědomil, jak křivá byla kresba, kterou emulátor neukázal; 2) test multi-touch Zatímco jsem hru tak dlouho vyvíjel a testoval, byl jsem zvyklý kreslit sudé figury a nevšiml jsem si, že ne všichni hráči kreslí takto sudé figury, takže figurky často nebyly rozpoznány. Proto, když jsem nechal hrát kamarády, byl jsem překvapen, že program téměř nerozuměl jejich kresbám. Znovu jsem musel vylepšit rozpoznávání Vzhledem k tomu, že seznam změn je na stránce o hře, uvedu, jaké hlavní problémy vyřešily aktualizace Verze 1.1: protože povrch byl implementován jako přetížený View a bylo překresleno celé Canvas , grafika byla pomalá. Byla implementována podpora PaintClipping(), která umožnila překreslit ne celou obrazovku, ale pouze měnící se část, což výrazně zrychlilo kreslení Další aktualizace: opraveny problémy s animací pohybu jejím zakázáním; design; multitouch; evidence. První optimalizace: Všiml jsem si, že jsem omylem zkopíroval render dvakrát a dvakrát nakreslil to samé; optimalizace pomocí cache.

Chyby kompilátoru? existují?

Někde jsem četl článek o tom, že chyby kompilátoru jsou vlastně chyby programátorů. Ale narazil jsem na skutečné chyby, samozřejmě ne chyby kompilátoru samotné, ale chyby SDK a pluginů:
  • Emulátor emuluje „ideální“ zařízení. Při testování vypadala grafika v emulátoru normálně. Na některých zařízeních to také vypadalo dobře. Ale na většině skutečných zařízení při animaci figurek vypadala grafika hrozně: figurky se rozdvojovaly a pohybovaly se k sobě (pravděpodobně důvodem bylo použití Matrix transformačních matic, pro Javu je to AffineTransform).
  • Chyba kompilátoru? Strávil jsem pěkných pár hodin laděním výstupu herního času: herní čas byl zobrazen uvnitř tlačítka, jako jeho název, a ne v textovém poli. Řešení: ukázalo se, že jste před kompilací museli stisknout tlačítko „čistý projekt“ a poté bylo vše opraveno (v oficiální dokumentaci od Google se doporučuje stisknout toto tlačítko pokaždé před sestavením apk, ale kdo to čte?) . To může být způsobeno aktualizací SDK, ale zaměňování názvů zdrojů lze připsat chybám kompilátoru.
  • Vyskytly se také chyby API, některé zastaralé funkce se opět chovaly podle očekávání v emulátoru, ale na skutečném zařízení vrátily podivné hodnoty.
Rád bych také řekl o vestavěném ProGuard. Na rozdíl od toho, co si většina lidí myslí, to funguje, ale s podmínkami: v cestě k SDK, domovské složce, složce s projektem a jeho názvem by neměly být žádné mezery ani azbuka. Pak to funguje (nezapomeňte odkomentovat potřebné řádky v project.properties. Obfuskaci můžete provést ručně (musel jsem to udělat, dokud jsem nenastavil ProGuard). Chcete-li to provést, nejprve vytvořte kopii projektu. Poté přejdeme do nastavení projektu (kam přidat) a zrušíme zaškrtnutí nepotřebných políček v části „Java Compiler“ ve skupině „Generování souborů třídy“. Dále pomocí nástrojů “Refractor>Move...” a “Refractor>Rename...” změníme kód v něco nesrozumitelného. Během tohoto procesu nezapomeňte zkontrolovat zbývající funkčnost kódu.

Grafika

Pro kreslení grafiky jsme použili: GIMP - rastrový editor a Inkscape - vektorový editor Na první pohled se mi GIMP zdál mnohem horší než Photoshop, nemá některé funkce (nebo jsem je nenašel). Zpočátku se to zdá velmi nepříjemné a máte pocit, že na tom nemůžete ani nakreslit čáru. Časem si na to ale zvyknete a uvědomíte si, že je to jako poprvé otevřít Photoshop, když jste předtím viděli pouze Malování. Můžete kreslit v GIMPu, Inkscape je také jednodušší než CorelDraw, ale nic víc jsem od něj nepotřeboval. Poměrně jednoduchý, srozumitelný editor Povedený design se nepovedl hned.

Další obrázky

Statistika a marketing

Nečekal jsem, že na hře vydělám, proto jsem ji nikde nereklamoval. Také jsem se rozhodl sbírat skutečné statistiky v nepřítomnosti reklamy, takže jsem to někdy ani nepropagoval, ale stále existovaly nějaké pokusy o propagaci.

Podpora

V prvním týdnu jsem se o hře pokusil napsat na stránky 4PDA. Napsal jsem do některých vláken na fóru (nárůst počtu stažení +15 - +40), aniž bych si přečetl jejich pravidla, za což jsem dostal na pár dní ban. Pak jsem napsal do vláken jejich fóra pro vývojáře, odkud jsem získal cenné rady, pár instalací navíc (+10) a několik dobrých recenzí na Google Play (+2). Měli projekt na podporu herních vývojářů ze zemí SNS, spočíval v tom, že napíšete recenzi na hru a oni ji zdarma hostují, prý teď tento projekt uzavřeli. Ale z nějakého důvodu mě do tohoto projektu nepřijali, buď se jim web s „.com“ nelíbil, nebo na webu nenašli můj e-mail.

Recenze na Google Play

Říká se, že se nemusíte starat o jednotlivé recenze a hodnocení na Google Play. To je pravda – lidé jsou různí, mají různé názory, někteří očekávají něco úplně jiného, ​​než si myslíte. Nečtou popis hry, čímž si stahují něco, co někdo nepotřebuje, nebo jim chybí zajímavá hra.
Pokud však několik lidí píše, že „nelze hrát“, nebo dokonce podrobněji popisují „neexistující“ chyby („kříž je nakreslen o 2 cm výše“), není to jen tak. Emulátor vás může klamat, vaše zařízení se také může chovat jinak než ostatní. V tomto případě byste si neměli nechat ujít takové recenze, ale zkuste zjistit, co se děje na zařízeních uživatelů a vypořádat se s tím, rád bych poznamenal, že za rok s více než 5 000 staženími a 1 000 uživateli pouze 5 písmen. byly přijaty e-mailem: 4 z nich - spam (nabídli mi, že mohu inzerovat svou hru a získat dobré hodnocení, za to požadovali od 100 do 60 000 $). A jeden dopis z obchodu Opera Mobile Store (apps.opera.com), ve kterém stálo, že do jejich obchodu můžete umístit aplikace zdarma, ale rozhodl jsem se zatím zůstat pouze na Google Play.

Konkurence a SEO

Konkurence na prvních pozicích je vysoká, zvláště v žánru her, jako je tic-tac-toe. Existují tisíce, tisíce stejných piškvorek s téměř stejnými jmény. Je jich tolik, protože jejich psaní je o něco těžší než „Ahoj světe“. Je jasné, že uživatelé se při hledání nejlepší hry nebudou obtěžovat procházením déle než dvacátou sekundou stránek a celkem existuje více než (3000/20=100...) stránek konkurence mezi tisíci tic-tacu -toe... Moje hra je na prvních dvaceti stranách (na 20 stránce), není to tak špatné jako u více než 70% ostatních konkurentů. Stojí za zmínku, že stejně jako ve vyhledávačích je pozice hry určuje nejen zvolená kategorie, ale také při vyhledávání různých klíčových dotazů. Takže pro dotaz „tic-tac-toe“ je moje hra na straně 20 a pro dotaz „nakreslete piškvorky“ je na první stránce mezi tuctem konkurentů, ale málokdo to píše. Pro dotaz „tic-tac-toe pro dva“, který se objeví v nápovědě při psaní fráze „tic-tac-toe“, však existují pouze dvě stránky soutěže, a to je výsledek přidávání klíčové slovo „pro dva“ k popisu hry bylo zvýšení zatížení rusky mluvících uživatelů na 3 636 krát (na základě stažení anglicky mluvící části uživatelů, stojí za zmínku, že nepotřebujete). spamovat všemi možnými klíčovými slovy, protože když napíšete něco, co hráči očekávají, že to uvidí, ale ve hře to nevidí, tak hru jen tak nesmažou, ale přidají i špatnou recenzi, jak už možná někteří tuší vyhledávání je tak ovlivněno konkrétními frázemi, tic-tac-toe se budou v různých jazycích nazývat různě. Nabízí se otázka: do kolika jazyků je třeba aplikaci přeložit? Hlavní počet uživatelů nainstaloval hru v následujících jazycích: ruština (58 %), angličtina (USA 20 % + Spojené království 11 % + ostatní angličtina 2 % = 33 %), španělština (3 %), zbytek 6 %. Proto můžeme dojít k závěru, že musí existovat angličtina; jazyk, kterým mluvíte dobře; Níže jsou uvedeny jazyky podle oblíbenosti, které vaši přátelé znají.
Na grafu jsou rusky mluvící uživatelé zobrazeni zeleně, další dva řádky jsou anglicky mluvící. Prudkým nárůstem pro rusky mluvící uživatele je přidání „pro dva“ do popisu hry Průměrné statistiky o používání jazyka v sekci „Hádanky“ (poskytované ve vývojářské konzoli Google Play): Jak se lidé dostanou na stránku hry, kdo si ji stáhne a kdo hru opustí? To ukáže následující obrázek.
Video
Vzhledem k tomu, že někteří odpůrci psali komentáře ve smyslu „můžete hrát na papíře“, dospěl jsem k závěru, že mnozí, kteří si hru instalují, nečtou její popis. Obrázky (screenshoty) nevysvětlují dobře rys této hry - kreslení. Proto jsem se rozhodl natočit video. Ne proto, abych přilákal nové hráče, ale abych ukázal hru a vyřadil ty, kterým se hra nebude líbit (abych nezkazil hodnocení hry, jak je navrženo v dokumentaci google play, natočil jsem video ukazující funkci). hru. Snažil jsem se natočit video bez jakýchkoliv speciálních efektů, protože jsem předpokládal, že se na něj moc lidí nepodívá. Ale nemohl jsem zkrátit 15 minut videa zachyceného z obrazovky pomocí ffmpeg na 1,5 minuty. Ale marně, výsledek videa byl nejednoznačný. Přibližně 2 zhlédnutí denně, 1 zhlédnutí trvalo 48 sekund (podsledováno). Z toho můžeme usoudit, že s ohledem na čas strávený přetáčením videa je nejlepší délka videa 1 minuta. Změny v počtu odinstalací/instalací byly nevýznamné.

Stáhněte si statistiky

Obecné statistiky za rok: 5113 instalací, 4017 smazání (78 %), 1096 uživatelů za prvních 10 dní (první verze): 56 stažení, 22 smazání, 34 zbývajících (+3,4 uživatelů za den). Takové dobré statistiky jsou způsobeny tím, že v prvních týdnech byla hra diskutována na w3bsit3-dns.com Během různých období se počet stahování a mazání rovnoměrně měnil. Stahování a mazání v létě je méně než 10 za den, od ledna více než 20 za den bude měřen a zaúčtován efekt habra. Pravděpodobně dojde k prudkému nárůstu stahování, pak k podobnému nárůstu mazání. UPD: Po 2 dnech nasbíral článek 13 000 zhlédnutí, pak vám povím o „efektu habra“ Ve zkratce: ze všech 13 000 zhlédnutí se o hru začalo zajímat jen necelé 1 % lidí a stáhlo si ji. přidal do hry spoustu dobrých recenzí Číst dále: Počet stažení hry za dva dny vzrostl o +180 (1,38 % zobrazení článku). Většinou se jednalo o zařízení s Androidem 4.1 a 4.2. Přibylo i mazání, ve dnech vydání článku jich bylo 50. V průměru bylo v těchto dnech smazáno 43 % všech instalací (40 % smazali čtenáři článku, 70 % ostatní uživatelé Počet uživatelů hry za pár dní vzrostl z 1110 na 1230, což je nárůst o 120). (z toho podíl lidí, kteří si článek přečetli, se ukázal jako 0,8 % zobrazení článku). Pro srovnání, obvyklý růst za pár dní je 3-4 uživatelé Pár dní po zveřejnění článku se všechny ukazatele začaly blížit normálu.

Jak čtenáři ovlivnili stahování, v grafech

Nastavení
Odstranění
Růst uživatelů

Všiml jsem si, že pokud jsou někteří uživatelé přitahováni k produktu prostřednictvím osobní komunikace (vlákna na fóru, články), zvyšuje se počet komentářů a hodnocení. Kvůli zveřejnění tohoto článku se na Google Play objevilo mnoho recenzí hry a recenze byly pozitivní, a to i přes kritiku reálných nedostatků, které bude potřeba opravit.

Průměrné hodnocení aplikace se zvýšilo z 2,13 na 3,81.

Počet zhlédnutí videí vzrostl pouze o 7 za den, všechna zhlédnutí z mobilních zařízení. Kupodivu si stránku o hře na mém webu prohlédlo více lidí než video První dva dopisy od těch, kteří se pokusili hru nainstalovat, dorazily e-mailem. Předtím byl přijímán pouze spam.

Seznam programů použitých k vytvoření hry a dalších materiálů

Vývojová prostředí:
  • NetBeans
  • Eclipse (+ Android SKD)
Obrázky a videa:
  • GIMP - editor rastrové grafiky
  • Inkscape - vektorový editor
  • OpenShot - editor videa
  • ffmpeg – slouží k zachycení videa z obrazovky
Vývoj byl proveden v Linuxu Všechny tyto programy jsou zdarma.

Náklady

0 (nula) za vývoj, grafiku, software Více než ~30 $ za podporu webu, bankovní transakce a platby za účet vývojáře GooglePlay: 0 rublů, zkušenosti s vývojem aplikace pro Android, statistiky instalací her na Google Hraj, dobrý článek.

Na závěr

S počítačem, 30 dolary a časem můžete vytvořit jednoduchou a dobrou hru. Pro dobrou hru potřebujete jak hratelnost (nápad), tak krásnou implementaci (grafiku) zároveň. Chcete-li vydělat peníze a získat mnoho uživatelů, musíte dělat to, co uživatelé potřebují, i když ani netuší, že to existuje, a dělat to, co ještě neexistuje, v méně konkurenční oblasti, než jsou tisíce piškvorek. . Teď je to hra zdarma, žádné reklamy, nevyžaduje žádná další oprávnění (například shromažďování osobních údajů, zasílání placených SMS apod.). (kliknutím na stránku hry na Google Play)

Štítky:

  • gamedev
  • google play
  • Jáva
  • indie
  • indy hry
Přidejte značky

Vytváříme síťovou multiplayerovou tic-tac-toe hru s využitím PHP, XML technologií a sady nástrojů pro vývoj aplikací na platformě Android

Online multiplayerové piškvorky

Běžně používané zkratky
  • API: aplikační programovací rozhraní
  • HTTP: Hypertext Transfer Protocol
  • IP: Internetový protokol
  • SDK: Software Development Kit
  • SQL: Structured Query Language
  • UI: Uživatelské rozhraní
  • XML: Extensible Markup Language

Neformální počítačové hry (hry pro širokou škálu uživatelů, které se hrají příležitostně) jsou extrémně oblíbené a velmi výnosné, což je snadné pochopit. Ne každý, bez ohledu na věk, má zájem o interaktivní střílečky z pohledu první osoby proti hordám nepřátel, které vyžadují bleskurychlé reakce. Někdy je zábavnější hrát hry, které vám dají čas na přemýšlení a strategii, nebo které k vítězství vyžadují kooperativní strategii.

Z pohledu vývojáře se neformální hry vyvíjejí mnohem snadněji než grafické střílečky z pohledu první osoby nebo sportovní hry. Proto je pro vývojáře nebo skupinu vývojářů jednodušší vytvořit novou originální hru.

Tento článek popisuje základy vytváření příležitostné online hry piškvorky pro více hráčů. Herní server je webová aplikace s XML rozhraním využívající MySQL a PHP. Klient je standardní Android aplikace běžící na Android telefonech.

Vytvoření serverové části

Backend využívá jednoduchou databázi MySQL se dvěma tabulkami. B ukazuje schéma databáze.

Výpis 1. db.sql
DROP TABLE IF EXISTS hry; CREATE TABLE games(id INT NOT NULL AUTO_INCREMENT, primární klíč (id)); DROP TABLE IF EXISTS se pohybuje; CREATE TABLE se pohybuje (id INT NOT NULL AUTO_INCREMENT, hra INT NOT NULL, x INT NOT NULL, y INT NOT NULL, barva INT NOT NULL, primární klíč (id));

V reálné aplikaci by se pravděpodobně použila tabulka uživatelů a herní tabulka by obsahovala ID obou hráčů. Aby to nebylo jednoduché, opustil jsem tento přístup a zaměřil jsem se na ukládání herních dat, interakci mezi klientem a serverem a vytváření klientské strany.

Druhá tabulka, tahy, obsahuje jednotlivé tahy hry a skládá se z pěti sloupců. První sloupec je jedinečný identifikátor pohybu. Druhý sloupec je identifikátor hry, ke které tah patří. Pak jsou zde pozice x a y tahu. Tyto hodnoty musí být mezi 0 a 2, protože herní plán je tři na tři. Poslední pole je „barva“ tahu, což je celé číslo označující X (kříž) nebo O (prst).

Chcete-li vytvořit databázi, nejprve spusťte program mysqladmin a pomocí příkazu mysql spusťte skript db.sql, jak je uvedeno níže:

% mysqladmin --user=root --password=foo vytvořit ttt % mysql --user=root --password=foo ttt< db.sql

Tato akce vytvoří novou databázi ttt obsahující herní vzor tic-tac-toe.

Po vytvoření schématu musíte vytvořit způsob, jak hru spustit. Chcete-li to provést, použijte skript s názvem start.php, který je uveden v .

Výpis 2. start.php
připravit($sql); $sth->execute(pole()); $qid = $dd->lastInsertId(); $doc = new DOMDocument(); $r = $doc->createElement("hra"); $r->setAttribute("id", $qid); $doc->appendChild($r); tisk $doc->saveXML(); ?>

Skript začíná připojením k databázi. Poté se na herním stole provede příkaz INSERT a vrátí se vygenerované ID. Poté se vytvoří dokument XML, do štítku hry se přidá identifikátor a exportuje se XML.

Pro vytvoření hry v databázi je nutné tento skript spustit, protože naše jednoduchá aplikace pro Android nemá rozhraní pro vytváření her. Zde je kód:

$ php start.php $

Tak máme za sebou první zápas. Chcete-li zobrazit seznam her, použijte skript games.php uvedený v .

Výpis 3. games.php
připravit($sql); $q->execute(pole()); $doc = new DOMDocument(); $r = $doc->createElement("hry"); $doc->appendChild($r); foreach ($q->fetchAll() jako $row) ( $e = $doc->createElement("hra"); $e->setAttribute("id", $row["id"]); $r- >appendChild($e); tisk $doc->saveXML(); ?>

Tento skript, stejně jako skript start.php, začíná připojením k databázi. Poté se provede dotaz na herní stůl, aby se zobrazily dostupné hry. Poté se vytvoří nový dokument XML, přidá se herní štítek a poté se přidají herní štítky pro každou dostupnou hru.

Po spuštění skriptu z příkazového řádku byste měli vidět následující informace:

$ php games.php $

Tento skript můžete také spustit z webového prohlížeče.

úžasné! Nyní, když máme herní rozhraní, můžeme začít psát serverový kód pro zpracování tahů. Tento kód začíná vytvořením pomocného skriptu show_moves, který získá aktuální tahy pro danou hru a exportuje je do XML. B ukazuje PHP kód pro tuto pomocnou funkci.

Výpis 4. show_moves.php
připravit($sql);

Skript používá popisovač databáze a ID hry. Poté spustí SQL dotaz, aby získal seznam tahů. Poté vytvoří dokument XML s pohyby pro danou hru.

Tuto pomocnou funkci používají dva skripty. První je moves.php, který vrací aktuální tahy zadané hry. Tento skript je uveden v .

Výpis 5. moves.php

Tento jednoduchý skript zapojí pomocný kód, připojí se k databázi a vyvolá funkci show_moves se zadaným ID hry. Chcete-li tento kód otestovat, použijte příkaz curl ke spuštění skriptu na serveru z příkazového řádku:

$ curl "http://localhost/ttt/moves.php?game=1" $

Zatím nebyly provedeny žádné tahy, takže se nezobrazuje nic zajímavého. Chcete-li situaci napravit, musíte do rozhraní serveru přidat poslední skript. Níže je skript move.php.

Výpis 6. move.php
připravit($sql); $sth->execute(pole($_REQUEST["hra"], $_REQUEST["x"], $_REQUEST["y"])); $sql = "INSERT INTO pohybuje HODNOTY (0, ?, ?, ?, ?)"; $sth = $dbh->prepare($sql); $sth->execute(pole($_REQUEST["hra"], $_REQUEST["x"], $_REQUEST["y"], $_REQUEST["barva"])); show_moves($dbh, $_REQUEST["hra"]); ?>

Tento skript začíná připojením pomocné funkce a připojením k databázi. Poté se provedou dva příkazy SQL. První odstraní všechny tahy, které by mohly být v konfliktu s tahy odeslanými ve druhém požadavku. Druhý příkaz SQL vloží nový řádek do tabulky přesunů pro zadaný přesun. Seznam tahů se poté vrátí klientovi. Tato akce eliminuje potřebu, aby klient při každém přesunu zadával dva požadavky. Šířka pásma není levná, takže požadavky by měly být agregovány, kdykoli je to možné.

Pro testování můžete provést následující krok:

$ curl "http://localhost/ttt/move.php?game=1&x=1&y=2&color=1"

Jakmile dokončíte vytváření kódu serveru, můžete začít vytvářet rozhraní systému Android pro tuto online hru pro více hráčů.

Vytvoření rozhraní Android

Nejprve nainstalujte Android SDK, několik verzí platformy Android a nakonec Eclipse a plugin Android Eclipse. Naštěstí je to vše dobře popsáno na webu Android (odkazy jsou uvedeny v sekci). Podrobný popis nastavení vývojového prostředí by zabral celý článek a pravděpodobně více než jeden.

Po nastavení vývojového prostředí spusťte Eclipse a spusťte nový projekt Android. Na obrazovce by se měly zobrazit informace zobrazené na.

Výpis 11. BoardView.java
balíček com.jherrington.tictactoe; importovat android.content.Context; importovat android.graphics.Canvas; importovat android.graphics.Color; importovat android.graphics.Paint; importovat android.graphics.Rect; import android.util.AttributeSet; importovat android.view.MotionEvent; importovat android.view.View; veřejná třída BoardView rozšiřuje zobrazení ( private int _color = 1; public void setColor(int c) ( _color = c; ) public BoardView(Context context) ( super(context); GameService.getInstance().startGame(0); ) public BoardView(Kontext kontextu, AttributeSet attrs) ( super(context,attrs); GameService.getInstance().startGame(0); ) public BoardView(Kontext kontextu, AttributeSet attrs, int defStyle) ( super(context,attrs,defStyle); GameService.getInstance().startGame(0); veřejné booleovské onTouchEvent(událost MotionEvent) ( if (event.getAction() != MotionEvent.ACTION_UP) vrátí hodnotu true; int offsetX = getOffsetX(); int offsetY = getOffsetY(); int; lineSize = getLineSize(); for(int x = 0; x< 3; x++) { for(int y = 0; y < 3; y++) { Rect r = new Rect((offsetX + (x * lineSize)), (offsetY + (y * lineSize)), ((offsetX + (x * lineSize)) + lineSize), ((offsetY + (y * lineSize)) + lineSize)); if (r.contains((int)event.getX(), (int)event.getY())) { GameService.getInstance().setPosition(0, x, y, _color); invalidate(); return true; } } } return true; } private int getSize() { return (int) ((float) ((getWidth() < getHeight()) ? getWidth() : getHeight()) * 0.8); } private int getOffsetX() { return (getWidth() / 2) - (getSize() / 2); } private int getOffsetY() { return (getHeight() / 2) - (getSize() / 2); } private int getLineSize() { return (getSize() / 3); } protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(), paint); int size = getSize(); int offsetX = getOffsetX(); int offsetY = getOffsetY(); int lineSize = getLineSize(); paint.setColor(Color.DKGRAY); paint.setStrokeWidth(5); for(int col = 0; col < 2; col++) { int cx = offsetX + ((col + 1) * lineSize); canvas.drawLine(cx, offsetY, cx, offsetY + size, paint); } for(int row = 0; row < 2; row++) { int cy = offsetY + ((row + 1) * lineSize); canvas.drawLine(offsetX, cy, offsetX + size, cy, paint); } int inset = (int) ((float)lineSize * 0.1); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10); for(int x = 0; x < 3; x++) { for(int y = 0; y < 3; y++) { Rect r = new Rect((offsetX + (x * lineSize)) + inset, (offsetY + (y * lineSize)) + inset, ((offsetX + (x * lineSize)) + lineSize) - inset, ((offsetY + (y * lineSize)) + lineSize) - inset); if (GameService.getInstance().positions[ x ][ y ] == 1) { canvas.drawCircle((r.right + r.left) / 2, (r.bottom + r.top) / 2, (r.right - r.left) / 2, paint); } if (GameService.getInstance().positions[ x ][ y ] == 2) { canvas.drawLine(r.left, r.top, r.right, r.bottom, paint); canvas.drawLine(r.left, r.bottom, r.right, r.top, paint); } } } } }

Většinu práce odvede metoda onTouch, která reaguje na stisknutí konkrétní buňky hracího pole uživatelem, a metoda onDraw, která vykreslí hrací pole pomocí kreslícího enginu Android.

Metoda onTouch používá funkce pro změnu velikosti k výpočtu pozičního obdélníku každé buňky. Poté zavolá metodu obsahuje na obdélníku, aby zjistil, zda uživatel kliknul na buňku. Pokud ano, aktivuje se požadavek na herní službu k provedení tahu.

Funkce onDraw využívá funkce pro změnu velikosti jak k nakreslení čar hracího pole, tak k vykreslení všech umístěných X a O. Herní server singleton se používá pro pole pozic, které ukládá aktuální stav každého čtverce hracího pole.

Poslední třídou, kterou potřebujeme, je UpdateTimer, který využívá herní službu k aktualizaci pozic na hracím poli nejnovějšími daty. Zdrojový kód časovače je uveden níže.

Výpis 12. UpdateTimer.java
balíček com.jherrington.tictactoe; import java.util.TimerTask; public class UpdateTimer rozšiřuje TimerTask ( public BoardView boardView; @Override public void run() ( GameService.getInstance().startGame(0); boardView.post(new Runnable())( public void run())( boardView.invalidate( );)))))

Časovač je inicializován třídou TicTacToeActivity během spouštění aplikace. Časovač implementuje mechanismus dotazování. Toto není nejefektivnější způsob komunikace mezi klientem a serverem, ale je nejjednodušší a nejspolehlivější. Nejúčinnějším způsobem je použít verzi 1.1 protokolu HTTP, aby bylo připojení aktivní a aby server při přesunu zasílal aktualizace klientovi. Tento přístup je mnohem složitější; vyžaduje podporu pro protokol 1.1 ze strany klienta i serveru a má omezení na počet připojení. Zvažování tohoto přístupu přesahuje rámec tohoto článku. Pro jednoduché demo hry, jako je ta naše, je mechanismus dotazování skvělý.

Po napsání zdrojového kódu můžete aplikaci otestovat. Chcete-li to provést, musíte spustit emulátor. Po spuštění by se na obrazovce měly zobrazit informace zobrazené na obrázku 3.

Obrázek 3. Spuštění emulátoru Android
Obrázek 5.

V závislosti na stavu vašeho serveru buď uvidíte pohyby, nebo ne. V našem případě hra ještě nezačala. Tlačítka Play X a Play O jsou umístěna nad hracím polem uprostřed obrazovky. Klepněte na tlačítko Hrát X a pak na centrální náměstí. Objeví se obrazovka podobná té na obrázku.

Můžete hrát jak s křížky, tak s nulami. Aplikace se připojí k serveru a uloží stav hry na veřejně přístupné místo. A díky časovači aktualizace může každý hráč vidět tahy jiného hráče.

Závěr

Je tato hra hotová? Samozřejmě že ne. Nedochází k ověřování podmínky vítězství, hráči mohou opakovaně obsazovat stejná pole a neexistuje žádná kontrola nad pořadím tahů. Hlavní technologické bloky jsou však přítomny: herní server s uloženým stavem hry dostupný všem hráčům a standardní grafická aplikace na mobilním zařízení, která se připojuje k hernímu serveru a poskytuje herní rozhraní. Tuto hru můžete použít jako výchozí bod pro svou vlastní herní aplikaci a vytvořit si z ní, co chcete. Nezapomeňte, aby hra byla stále zajímavá a zábavná, a můžete skončit vytvořením konkurenta Words With Friends nebo multiplayerové verze Angry Birds.

Když jsem byl požádán, abych pomohl vyrobit/najít tic-tac-toe hru v Javě s grafickým uživatelským rozhraním (pro dva hráče), první věc, kterou jsem udělal, bylo, že jsem Google zjistil, zda existuje hotový a slušně implementovaný předmět. Možná jsem se špatně díval, ale všechno, na co jsem narazil, bylo špatně udělané. Někde je velikost herního plánu nastavena rigidně, ve většině příkladů nalezených v Java Swing - veškerá herní logika je nevhodně smíchána s uživatelským rozhraním. Existuje mnoho implementací této hry zveřejněných online, ale proč nepřidat ještě jednu?

Tento příklad tedy používá Swing k vytvoření uživatelského rozhraní. Rozměr herního plánu 5x5:

Chcete-li vyhrát, musíte vytvořit souvislou řadu křížků nebo nul o délce 5 prvků. Velikost pole a délku čáry, kterou je třeba k vítězství nakreslit, lze však snadno změnit. Jak můžete vidět na snímku obrazovky, používá téma Nimbus, které je součástí JRE od Java SE 6 Update 10. Struktura projektu vypadá takto:

V balení ru.spbstu.tictactoe- třídy potřebné k vytvoření grafického rozhraní; v balíčku ru.spbstu.tictaktoe.běžné- třídy potřebné k vytvoření tic-tac-toe hry, která nevázaný do prezentace (UI). Třída GameBoard představuje herní pole pro hraní piškvorek a také obsahuje všechny metody potřebné k implementaci hry:

Pomocí konstruktoru GameBoard(int) můžete vytvořit hrací pole libovolné velikosti. Můžete změnit velikost již vytvořeného hracího pole, nastavit prvek (X nebo O) na danou pozici a také získat prvek na dané pozici pole. Zde je třeba věnovat pozornost metodě getNextWinner, která se volá pokaždé, když se změní stav hracího pole, aby se našel vítěz:

/** * Vypočítejte další výherní kombinaci podle aktuálního stavu herního plánu.

* Kombinace nalezená na herním plánu je označena jako vypočítaná.

// velikost herního plánu private final int VELIKOST BOARD_SIZE = 5; // velikost buňky herního plánu, px private final int FIELD_WIDTH = 40; // počet křížků nebo nul v souvislém řádku, při kterém // se počítá výhra private final int WIN_COUNT = 5; // rozměry okna, px private final int FRAME_DEFAULT_WIDH = 250; private final int FRAME_DEFAULT_HEIGTH = 220;




Nahoru