Mobileszközök programozása Java nyelven

Példaprogramok

Tilitoli játék

Nyílván sokan ismerik azt a játékot, amikor egy kép fel van osztva n*m egyforma darabra és ezek közül egy darab hiányzik (általában a jobb alsó) A képet egy keret határolja körül, így a képkockák elcsúsztathatóak: azaz valamely képkocka az üres lyukra csúsztatható. A játék lényege, hogy az összekevert képszeletek csúsztatásával állítsuk helyre az eredeti képet. Eredetileg ez a játék fizikailag létező műanyag vagy fa formában volt kapható, de számos Flash és egyéb alkalmazásban köszön vissza.

A feladat tehát: készítsünk Tilitoli játékot J2ME-ben

Az elvi megoldás

Valósítsuk meg a képernyőre kirajzolandó mezők osztályát, amelyekből építkezve megvalósíthatjuk a játéktábla osztályát!
A mező osztály tartalmazza a kirajzolandó képet és annak bal felső sarkának pixelben mért koordinátáit. A játéktábla osztály a példányosításkor kapott képszeletek alapján állítsa össze a táblát egy kétdimenziós mátrixba, melynek elemei az egyes mezők (nyilván mezőre mutató pointerek). A játéktábla az egyes mezőknek azok példányosításakor minden a játékhoz szükséges információt meg tud adni, hiszen a képernyő mérete és a képméretek alapján ki tudja számolni a mező pozícióját, illetve ismeri az odakerülő képszelet elérési útvonalát. Ilyen formán a nem megfelelő számú vagy méretű képszeletekről a játéktábla osztály figyelmeztet, míg az érvénytelen elérési útvonal (vagy jogosultsági problémák) a mező szintjén derülnek ki.
A példányosítás során a képszeletek a megfelelő helyükre kerülnek, és minden mező feljegyzi, melyik képobjektumot kapta eredetileg. Ezt követően egy metódus valamely lyuk melletti kép véletlenszerű eltolásával gondoskodik az összekeverésről. A mozgatásokhoz szükséges, hogy a játéktábla ismerje a hiányzó kép pozícióját.

Fontos, hogy ha véletlen sorrendben helyezzük el a képszeleteket, akkor csak 50% a valószínűsége, hogy a játék megoldható!

Ennek elkerülése céljából egy véletlen hosszúságú eltolási sorozat mentén keverjük össze a képet, ezzel garantálva annak összeállíthatóságát. Ha a felhasználó rossz mozgatást alkalmaz, akkor is lesz olyan mozgatási sorozat, amellyel összeállítható az eredeti kép.

Szerző

Jelen példaprogramot Door András 2010 tavaszi félévében készítette oktatási célból az Eötvös Loránd Tudományegyetem Informatikai Karán megtartott Programozási nyelvek és paradigmák címet viselő szemináriumára. A forráskódok és a futtatható állományok (oktatási célból) elérhetőek itt (184 KB).

Implementációs környezet

A megvalósítás Windows 7 (Ultimate Edition) operációs rendszer alatt készült, NetBeans 6.1 segítségével, JDK 6.11 felhasználásával. Az emulátoros tesztelés Sun Java Wireless Toolkit 2.5.2 (Windows) felhasználásával történt, a telefonos tesztelés pedig Sony Ericsson U10i, Nokia N70 és egyéb Nokia készülékeken történt.

A megvalósítás részletei

Szálbiztos futtatás

A játéktábla osztály implementálja a Runnable interfészt, azaz a játéktábla objektum futtatható önálló szálban is. Ez garantálja, hogy az AMS bármely körülmények között meg tudja szakítani a MIDlet futását - hiszen az csak a leszármazott processzre vár. A MIDlet alkalmazás leállításával egyidejűleg annak leszármazottai is biztosan leállnak.

Várakozás a képernyőfrissítéskor

A tapasztalat azt mutatja, hogy a telefonokon (különösebben a régebbi típusokon), a képernyő frissítés során a hardver reakciója nem elhanyagolható időt vehet igénybe. Ez azt jelentené, hogy a szoftver és a hardver nem lennének szinkronban, mert még pl. a szoftver az 5. kirajzolásra utasítaná a képernyőt, az még csak a 3.-nál tartana. Ennek elkerülése érdekében célszerű a kirajzolást követően 60 ms-ig várni (a gyakorlatban a frissítési időt szokás kiegészíteni 60 ms-ra).

Mikor van vége a játéknak?

Minden mező eltárolja, hogy melyik képet kapta eredetileg (ez csak +1 pointer), így minden mező el tudja dönteni, hogy az aktuálisan tárolt kép a megfelelő kép-e. A játéktábla minden egyes mozgatás után minden egyes mezőtől lekérdezi ezt és ez alapján tudja eldönteni, hogy vége van-e a játéknak.

Mozgató billentyűk

A játéktábla osztály egyben származik a Canvas osztályból is, így a Paint() absztrakt metódus kötelező megvalósítását követően máris képes a pixeles megjelenítésre, illetve a keyPressed() metódus felüldefiniálásával a billentyűlenyomások érzékelésére.

Felhasználói utasítások

A játéktábla osztály egyben leszármazottja a CommandListener osztálynak, ezáltal képes a készülék speciális funkcióbillentyűihez egyedi interakciót rendelni. Commandokon keresztül valósul meg a kilépés, a játék feladása és az új játék kezdeményezése. Ezek a Commandok a Canvas osztály gombnyomásaitól teljes mértékben függetlenek.

Feladás és új játék

Amennyiben a megfelelő Commandon keresztül a felhasználó kezdeményezi a játék feladását vagy új játék kezdeményezését, a játéktábla objektum utasítja az egyes mezőket, hogy az eredeti képet mutassák. Ezzel megvalósul a feladás, hiszen az eredeti kép kerül kirajzolásra a következő képernyőfrissítés alkalmával. (A játék kiterjeszthető lenne így is, hogy megmutassa a felhasználónak, milyen lépéseken keresztül kellett volna kirakni az adott képet). Ezek után az új játék indítása csak a képszeletek újbóli összekeverését jelenti.

Tilitoli másképp

A feladat ugyanaz, mint az előzőekben csak itt nem egy kép kirakása, hanem számok sorbarendezése a cél.

Az elvi megoldás

Ahogyan az előzőekben, itt is külön osztály felel egy mező, ill. a játéktábla kezeléséért.
A játék során számontartjuk a lépés számot. (Vagyis, hogy a játékosnak hány lépésen keresztül sikerült kiraknia az adott pályát.) Amennyiben a játékos rekordot döntött az eddigi rekord felülírásra kerül. A rekordok tárolása és kezelése RMS segítségével történik.

Szerző

A példaprogramot Mészáros Zsófia készítette 2011 tavaszi félévében az ELTE IK Programozási nyelvek és paradigmák című tárgyához. A forráskódok és a futtatható állományok elérhetőek itt.

Implementációs környezet

A megvalósításhoz a NetBeans 6.9 fejlesztői környezetet, az emulátoros teszteléshez Sun Java Wireless Toolkit-et, míg a telefonos teszteléshez Nokia készüléket használtam.

HttpTester

A mobiltelefonos világban gyakran felmerül az igény, hogy az alkalmazás képes legyen internetes adatforgalmazás bonyolítására. A javax.microedition.io csomag segítségével készíthető olyan alkalmazás, amely kommunikációt folytat HTTP, FTP Secure FTP, UDP vagy más protokollok segítségével. Ezek közül a legelterjedtebb, azaz a HTTP használatának demonstrálása céljából készült az alkalmazás, amely egy konkrét bank egy konkrét valutájának aktuális árfolyamát kérdezi le egy ingyenesen használható webes API segítségével.

A feladat tehát: szerezzük be az internetről egy adott bank egy adott valutájának aktuális árfolyamát és jelenítsük meg a felhasználónak!

Az elvi megoldás

A megoldás alapelve egy publikus webes API, amely az URL-be csomagolt get paraméterek segítségével egy XML állományban adja vissza a keresett bank választott pénznemének aktuális deviza és valuta árfolyamát. A megoldás tehát ezen információ ismeretében kézenfekvő: hívjuk meg ezt az API-t megfelelően paraméterezve, majd értelmezzük a kapott XML választ.
Az egyszerű megoldás során törekedtem arra, hogy a program kellően általános legyen, ezáltal lehetővé tegye később a kiterjesztést.

A csatolt tömörített állomány tartalmazza a megoldás forráskódja mellett a fordított jar és jad fájlokat is, és a fejlesztői dokumentációt is.

Szerző

Jelen példaprogramot Door András 2010 őszi félévében készítette oktatási célból az Eötvös Loránd Tudományegyetem Informatikai Karán megtartott Programozási nyelvek és paradigmák című tárgy keretein belül. A forráskódok és a futtatható állományok (oktatási célból) elérhetőek itt (361 KB).

Implementációs környezet

A megvalósítás Windows 7 (Ultimate Edition) operációs rendszer alatt készült, NetBeans 6.9 segítségével, JDK 6.11 felhasználásával. Az emulátoros tesztelés Sun Java Wireless Toolkit 2.5.2 (Windows) felhasználásával történt, a telefonos tesztelés pedig Nokia N80 készüléken történt.

A megvalósítás részletei

A telefonos alkalmazás készítéséhez szükséges alapinformációk megtalálhatók az első példaprogram leírásában. A konkrét program működését pedig talán a dokumentációban található osztály- és szekvencia diagramok jellemzik a legjobban.

BluetoothChat

Írjunk egy egyszerű chat alkalmazást, amelyben a készülékek Bluetooth-on keresztül kommunikálnak egymással.

Az elvi megoldás

A program lényege a Bluetooth programozás alapjainak bemutatása. Az egyszerűség kedvéért az alkalmazás indítása után a felhasználó választhat, hogy szerverként, vagy pedig kliensként szeretne működni. Míg az előbbi csak megnyitja a szerveroldali kapcsolatot, majd várakozik, addig az utóbbi végzi a Bluetooth készülékek utáni keresést, illetve a szerverhez való kapcsolódást. A kapcsolat bontása után az alkalmazás véget ér.

A csatolt tömörített állomány tartalmazza a megoldás forráskódja mellett a fordított jar és jad fájlokat is.

Szerző

A példaprogramot Mészáros Zsófia készítette 2011 őszi félévében az ELTE IK Programozási nyelvek és paradigmák című tárgyához. A forráskódok és a futtatható állományok elérhetőek itt.

Implementációs környezet

A megvalósításhoz a NetBeans 6.9 fejlesztői környezetet, a teszteléshez pedig két Nokia készüléket használtam. (Ugyan az interneten elérhetőek különböző, Bluetooth alkalmazások tesztelésére használható emulátorok is, de megbízhatósági szempontok miatt érdemesebb közvetlenül a készülékeken tesztelni.)