11. diel - Programovanie jednoduchých Java GUI hier - Zoznamy
V tomto diele sa bližšie pozrieme na zoznamy objektov.
Ešte by som sa ale na chvíľu vrátil k predchádzajúcej kapitole. Nastavovanie veľkostí komponentov v Jave nie je úplne priehľadné. Odporúčaný spôsob je nastaviť preferovanú veľkosť komponentom a na záver pri vytváraní okna zavolať metódu pack (). To nám väčšinou stačí. Ak požadujeme presnú veľkosť, je už to zložitejšie.
Problém je, že preferovaná veľkosť nemusí byť úplne dodržaná. Preto v kóde používam metódy getWidth () a getHeight (), ktoré vracia aktuálnu veľkosť JPanelu. Pokiaľ ale tieto metódy zavolám pri vytváraní, vracia mi nulu. V predchádzajúcom príklade ste si možno všimli, že úvodné pozíciu stíhača zadávam napevno a v metóde move pri kontrole súradníc používam ešte podmienku && panel.getSIRKA_PANELU ()> 0 (pre y je to obdobné)
if ((x >= panel.getSIRKA_PANELU() - (SIRKA + 1)) && (panel.getSIRKA_PANELU() > 0)) {
, Aby mi x> = panel.getSIRKA_PANELU () - (šírka + 1) neprepísal hodnotu x, keď sa SIRKA_PANELU rovná nule.
Zoznamy
V hre budeme často potrebovať uložiť premenné množstvo objektov ak nim potom následne pristupovať. Uvediem príklad. V hre, budú útočiť zlí mimozemšťania (málokedy sú mimozemšťania dobrí) a ich počet sa bude meniť v závislosti na úrovni hry a na tom, koľko ich zostrelíte. Určite niektoré z vás napadlo, že by sa dalo použiť pole. S poľom je ale ten problém, že má fixné dĺžku. Ak potrebujeme pole väčšie, musíme vytvoriť pole nové a objekty z prvého poľa do neho prekopírovať. V opačnom prípade môžeme skončiť s veľkým poľom, ale iba pár objekty atď ..
Riešením je použiť pre ukladanie meniaceho sa počtu objektov zoznam - napr. ArrayList. Práca s ním je jednoduchá.
Vytvoríme si triedu Nepriateľ a potom triedu s metódou main (tento program nebude používať GUI, slúži pre ukážku práce s ArrayList).
Trieda Nepriateľ
public class Nepritel { /** * Jméno nepřítele. */ private String jmeno; public Nepritel(String jmeno) { this.jmeno = jmeno; } /** * Vrátí jméno nepřítele. * @return jmeno */ public String getJmeno() { return jmeno; } }
Trieda s metódou main
import java.util.ArrayList; public class Seznamy { public static void main(String[] args) { ArrayList<String> seznamRetezcu = new ArrayList<String>(); seznamRetezcu.add("Ahoj"); seznamRetezcu.add("Nazdar"); seznamRetezcu.add("Čau"); System.out.println(seznamRetezcu.size()); for (int i = 0; i < seznamRetezcu.size(); i++) { String retezec = seznamRetezcu.get(i); System.out.println(retezec); } seznamRetezcu.remove(1); System.out.println(seznamRetezcu.size()); for (int i = 0; i < seznamRetezcu.size(); i++) { String retezec = seznamRetezcu.get(i); System.out.println(retezec); } System.out.println("----------------------"); ArrayList<Nepritel> seznamNepratel = new ArrayList<Nepritel>(); Nepritel n1 = new Nepritel("ZX12"); Nepritel n2 = new Nepritel("YC21"); seznamNepratel.add(n1); seznamNepratel.add(n2); seznamNepratel.add(new Nepritel("ZX574")); seznamNepratel.add(new Nepritel("FG669")); System.out.println(seznamNepratel.size()); for (int i = 0; i < seznamNepratel.size(); i++) { Nepritel n = seznamNepratel.get(i); System.out.println(n.getJmeno()); } seznamNepratel.remove(3); seznamNepratel.remove(n1); System.out.println(seznamNepratel.size()); for (int i = 0; i < seznamNepratel.size(); i++) { Nepritel n = seznamNepratel.get(i); System.out.println(n.getJmeno()); } } }
Výsledok je nasledujúci.
Poďme sa pozrieť na kód podrobnejšie. Trieda nepriateľ by mala byť jasná. V konstruktoru priradíme do premennej jmeno textový reťazec reprezentujúci názov zlého mimozemšťana. Druhou a posledná metódou je getter (getJmeno ()), ktorú vraciame názov nepriateľa.
ArrayList<String> seznamRetezcu = new ArrayList<String>();
Vytvoríme prázdny zoznam seznamRetezcu. Medzi menšítko a většítko (<>) uvádzame typ dát, ktoré budeme do zoznamu ukladať. Nie je to nutné, ale je to výhodné z toho dôvodu, že prekladači to umožňuje vykonávať kontrolu typu vkladaných dát a prípadnú chybu teda odhalíme už pri preklade programu a nie až pri jeho behu.
seznamRetezcu.add("Ahoj"); seznamRetezcu.add("Nazdar"); seznamRetezcu.add("Čau");
Do zoznamu uložíme tri textové premenné.
System.out.println(seznamRetezcu.size());
Zobrazíme počet položiek (objektov) zoznamu.
for (int i = 0; i < seznamRetezcu.size(); i++) { String retezec = seznamRetezcu.get(i); System.out.println(retezec); }
Postupne prechádzame objekty v zozname. K objektom pristupujeme pomocou indexu (seznam.get (index)).
seznamRetezcu.remove(1);
System.out.println(seznamRetezcu.size());
Zo zoznamu odstránime objekt na indexe 1 (seznam.remove (index)) a zobrazíme počet položiek po odobratí objektu.
for (int i = 0; i < seznamRetezcu.size(); i++) { String retezec = seznamRetezcu.get(i); System.out.println(retezec); }
Opäť prejdeme objekty v zozname a zobrazíme ich. Pre seznamNepratel je to obdobné.
seznamNepratel.remove(3);
seznamNepratel.remove(n1);
System.out.println(seznamNepratel.size());
Najskôr v seznamuNepratel odstránime objekt na indexe 3. Potom odstránime objekt, ktorého referenciu máme v premennej n1. Nakoniec takto upravený seznamNepratel zobrazíme.
List
Ešte by som sa vrátil k deklarácii zoznamu.
ArrayList<String> seznamRetezcu = new ArrayList<String>();
Vhodnejšie spôsob je nasledujúci:
<code>List<String> seznamRetezcu = new ArrayList<String>();</code>
V tomto prípade je potrebné ešte importovať java.util.List. List je rozhranie, ktoré implementujú zoznamy v Jave ako napríklad nám známy ArrayList, alebo napríklad LinkedList. Prečo tento spôsob používať? Predstavte si, že píšete rozsiahly program a máte v ňom metódu
private ArrayList<String> seznam = new ArrayList<String>(); public ArrayList getSeznam() { return seznam; }
a plno tried, ktoré používajú zoznam, získaný touto metódou. Potom ale zistíte, že ArrayList vám nevyhovuje a budete ho chcieť vymeniť napr. Za LinkedList. Vo všetkých triedach, ktoré tento zoznam používajú, poprípade metódach, ktoré ho používajú, budete musieť prepísať ArrayList za LinkedList. Pokiaľ ale motodu napíšete nasledovne
private List<String> seznam = new ArrayList<String>(); public List getSeznam() { return seznam; }
urobíte v celom svojom programe jedinú zmenu a to
private List<String> seznam = new LinkedList<String>();
Bonus
V programe k stiahnutiu ešte nájdete tento kód:
Nepritel nepritelQW = new Nepritel("QW855"); Nepritel nepritelZZ = new Nepritel("ZZ221"); seznamNepratel.add(nepritelQW); System.out.println("Je tam " + nepritelQW.getJmeno() + "? " + seznamNepratel.contains(nepritelQW)); System.out.println("Je tam " + nepritelZZ.getJmeno() + "? " + seznamNepratel.contains(nepritelZZ)); seznamNepratel.clear(); System.out.println("Je seznam prazdny? " + seznamNepratel.isEmpty());
Jedná sa o ukážku ďalších metód, ktoré ponúka zoznamy.
seznamNepratel.contains(nepritelQW)
Vráti true, keď zoznam obsahuje daný objekt, inak false.
seznamNepratel.clear();
Vyprázdni zoznam.
seznamNepratel.isEmpty()
V prípade, že zoznam je prazno, vráti true, inak false.
A to je všetko, čo budeme pre prácu so zoznamami potrebovať, a tiež všetko, čo budeme potrebovať pre napísanie prvej grafické hry v Jave, do ktorej sa pustíme v nasledujúcom diele.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 197x (1.22 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java