Zpět na blog
Tipy a triky

Ako naprogramovať hru Čierny Peter v Jave

Skillmea tím
26.10.2017
20 minut čtení

Programovanie hry Čierny Peter v Jave

V tomto tutoriáli si spolu naprogramujeme kartovú hru Čierny Peter. Použijeme programovací jazyk Java a zameriame sa na to, aby sme použili OOP prístup, teda objektovo-orientované programovanie.

Pravidlá hry

Najskôr si musíme zanalyzovať danú hru. To spravíme tak, že si povieme a určíme pravidlá. V hre je 33 kariet. Jedna karta nemá pár, ostatné ho majú. Hru môže hrať 3 až 6 hráčov. Všetky karty sa rozdajú medzi hráčov. Automaticky si hráči vytriedia z ruky karty, ktoré majú páry. S ostatnými sa začína hra. Ten, čo má najviac kariet, nechá ťahať hráča po svojej pravici. Ak ten hráč získal pár, tak ho vyloží a ďalší hráč od neho ťahá kartu. Ak hráč prišiel o všetky karty, už viac nehrá. Komu ostane posledná karta, ten prehral hru.

Analýza hry – vytváranie objektov

Teraz je čas pripraviť si popis našich tried, rozhraní a podobne. V skratke, uvažujeme nad pravidlami, okolnosťami a členmi danej hry a chceme ich pretvoriť na objekty.

Čím všeobecnejšie napíšeme naše objekty, tým lepšie pre ich znovupoužiteľnosť. Ak by sme chceli niekedy naprogramovať karty žolíkové, sedmové alebo hocijaké iné, tak si nechajme túto možnosť. Teda napríklad vytváranie inštancií kariet nedávajme do triedy balíku, ale inde.

Postup:

  1. vytvorím kartu
  2. vytvorím balík kariet
  3. vytvorím hráča
  4. interakciu s používateľom
  5. správu hry
  6. logiku hry Čierny Peter

Karta

Každá hracia všeobecná karta má nejaké špecifikum. Je to kráľ srdcový, kráľ pikový a podobne. V našom prípade máme páry a každá karta v páre je iná, spoločné majú to, že sú pár. Ako napríklad v žolíkových kartách máme 4 kráľov. Každý je iný, ale majú spoločné, že sú to králi.

package sk.jaro.CiernyPeter;
public class Karta {
     private int cisloKarty; //každá karta ma iné číslo
     private int cisloParu; //každý prá má iné číslo, len dve karty majú to 
                              isté číslo páru
     public Karta(int cisloKarty, int cisloParu) {
         this.cisloKarty = cisloKarty;
         this.cisloParu = cisloParu;
     }
     public int getCisloKarty() {
         return cisloKarty;
     }
     public int getCisloParu() {
         return cisloParu;
     }
 }

Balík kariet

Ďalej budeme potrebovať tieto karty uložiť do balíku. Každá hra má niekoľko kariet, ktoré tvoria balík. Takže náš balík bude obsahovať zoznam kariet. Čo sa dá robiť s balíkom? Napríklad miešať karty, alebo z balíku môžeme vybrať kartu. Keď vyberám karty alebo miešam karty, tak tam musia nejaké byť. Lebo ak vyberiem postupne všetky karty z balíku, tak nakoniec budem mať balík prázdny. Skúste miešať prázdny balík kariet :) Preto si vytvorím aj pomocnú metódu, ktorá zistí, či je balík prázdny alebo nie.

package sk.jaro.CiernyPeter;
import java.util.Collections;
import java.util.List;
public class BalikKariet {
     private List<Karta> karty; //implementacia listu pre zachovanie poradia
     public BalikKariet(List<Karta> karty) {
         this.karty = karty;
     }
     public List<Karta> getKarty() {
         return karty;
     }
     public void zamiesajKarty(){
         if(!jeBalikPrazdny())
             Collections.shuffle(karty);
     }
     private boolean jeBalikPrazdny(){
         return karty == null || karty.isEmpty();
     }
     public Karta getKartu(){
         Karta karta = null;
         if(!jeBalikPrazdny()) {
             karta = karty.get(0); //vytiahnem prvú kartu
             karty.remove(karta); //kartu odstránim z balíku
         }
         return karta;
     }
 }

Hráč

Do každej hry potrebujem hráča, teda niekoho kto bude danú hru hrať. Rozhodol som sa, že hráčovi dám meno a karty v ruke. Keď vytváram nového hráča pomocou new, tak sa zavolá konštruktor danej triedy a tam si všimni, že som mu do ruky nedal nič, teda tam má prázdno. To preto, lebo ešte nedostal nijakú kartu pri rozdávaní, ale musí mať nejaké úložisko kde mu ich dám :)

Je tam ešte metóda, ktorá má na starosti odstrániť z ruky hráča všetky páry. Kto by si to chcel nejako zovšeobecniť, tak môže. Teda do objektu Hrac, by dal len metódu na odstránenie jednej karty, alebo zoznamu kariet. A ktoré karty to budú to nechá na iný objekt, ktorý spravuje pravidlá hry Čierny Peter.

package sk.jaro.CiernyPeter; 
import java.util.ArrayList;
import java.util.List;
 
public class Hrac {
     private String meno;
     private List<Karta> kartyVRuke; 
     public Hrac(String meno) {
         this.meno = meno;
         this.kartyVRuke = new ArrayList<>();
     }
     public String getMeno() {
         return meno;
     }
     public List<Karta> getKartyVRuke() {
         return kartyVRuke;
     }
     public void odstranParyZRuky() {
         ArrayList<Karta> akeKartyOdstraniZRuky = new ArrayList<>();
         for(Karta karta : kartyVRuke){
             try {
                 for (Karta k : kartyVRuke) {
                     if (karta.getCisloParu()
                             == k.getCisloParu()
                             && karta.getCisloKarty() != k.getCisloKarty()) {
                         akeKartyOdstraniZRuky.add(karta);
                         akeKartyOdstraniZRuky.add(k);
                         break;
                     }
                 }
             }catch (Exception e){
                 e.printStackTrace();
             }
         }
         kartyVRuke.removeAll(akeKartyOdstraniZRuky);
     }
 }

Ovládanie hry

Akú chceš spraviť aplikáciu? Ako chceš komunikovať s používateľom? Cez grafické rozhranie? Cez konzolu, alebo inak? Teraz budeme robiť konzolovú interakciu, ale ak by si chcel robiť v budúcnosti grafické rozhranie, tak je vynikajúca idea spraviť interface, teda rozhranie, kde popíšem metódy aké chcem používať na interakciu s používateľom. Potom keď budeš robiť grafické rozhranie, tak si len zaimplementuješ toto nové rozhranie a niekde v kóde hry povieš, že teraz používať túto implemntáciu, a nemusíš prepisovať aj celú hru, lebo metódy sú tam rovnaké, len z iného zdroja.

Čo potrebujeme vypísať používateľovi, alebo čo od neho chcem získať? Počet hráčov, ich mená, akú kartu chceme hráčovi zobrať a chceme vypísať koniec hry. Ak chceš niečo viac, tak si to kľudne dorob.

package sk.jaro.CiernyPeter.rozhrania;
 
 import sk.jaro.CiernyPeter.Hra;
 import sk.jaro.CiernyPeter.Hrac;
 
 public interface IOvladanieHry {
     int vyberPocetHracov();
 
     Hrac getMenoHraca(int i);
 
     int zoberKartu(Hrac hrac1, Hrac hrac2);
 
     void vypisKtoPrehral(Hra hra);
 }

Teraz si musíme zaimplementovať toto rozhranie. Teraz máme len predpis metód ale nie ich vnútro. Budeme používať konzolu, ktorú budeme čítať pomocou scanneru a na konci hry si uzavrieme scanner. Každá metóda je jednoduchá, vypíšem na konzolu čo chcem a potom nechám používateľa, aby mi to napísal.

Všimni si, keď berieš nextInt(), tak sa to pokúsi zobrať číslo. Ak nájde niečo iné je to chyba a tú ošetríme. Kľudne si dorob viac ošetrení, podmienok a výpisov. Potom ale musíš zobrať aj zvyšok. Lebo čo spravil používateľ? Zadal číslo a stlačil enter. Ty si zobral len to číslo, ale nie aj enter. Preto tam máme ešte nextLine – to nám zoberie zvyšok riadku aj s enterom.

Čierny Peter bude hráč, ktorý ostal posledný v hre.

package sk.jaro.CiernyPeter.gui;
 
 import sk.jaro.CiernyPeter.Hra;
 import sk.jaro.CiernyPeter.Hrac;
 import sk.jaro.CiernyPeter.rozhrania.IOvladanieHry;
 
 import java.util.Scanner;
 
 public class OvladanieHry implements IOvladanieHry {
     Scanner scanner = new Scanner(System.in);
     
     @Override
     public int vyberPocetHracov() {
         int pocetHracov = 0;
 
         System.out.println("Zadaj počet hráčov (3 až 6):");
 
         try {
             pocetHracov = scanner.nextInt();
             scanner.nextLine();
         } catch (Exception ex) {
             System.out.println("Nepodarilo sa načítať počet hráčov. Zadal si správne číslo?");
             pocetHracov = vyberPocetHracov();
         }
 
         return pocetHracov;
     }
 
     @Override
     public Hrac getMenoHraca(int i) {
         Hrac hrac = null;
         System.out.println(String.format("Zadaj meno pre hráča %d :", i));
         String meno = scanner.next();
         scanner.nextLine();
         if (meno.equals("") || meno.equals(" ")) {
             System.out.println(String.format("Prosím znovu zadajte meno pre hráča %d :", i));
             hrac = getMenoHraca(i);
         } else {
             hrac = new Hrac(meno);
         }
 
         return hrac;
     }
 
     @Override
     public int zoberKartu(Hrac hrac1, Hrac hrac2) {
         int zoberKartuCislo = 0;
 
         System.out.print(hrac1.getMeno() + " ,ktorú kartu cheš zobrať hračovi "+hrac2.getMeno()+"?: ");
         for(int i = 0; i < hrac2.getKartyVRuke().size(); i++){
             System.out.print(i+", ");
         }
 
         try {
             zoberKartuCislo = scanner.nextInt();
             scanner.nextLine();
         } catch (Exception ex) {
             System.out.println("Nepodarilo sa získať akú kartu chceš zobrať. Zadal si správne číslo?");
             zoberKartuCislo = zoberKartu(hrac1,hrac2);
         }
 
         return zoberKartuCislo;
     }
 
     @Override
     public void vypisKtoPrehral(Hra hra) {
         System.out.println("Čierny Peter je hráč "+hra.getHraci().get(0).getMeno());
         scanner.close();
     }
 }

Hra

Každá hra má niekoľko hráčov, má balík kariet s ktorými sa hrá a má aj ovládanie. Toto si zadefinujeme.

public class Hra{
 
     private BalikKariet balikKariet;
     private int pocetHracov;
     private List<Hrac> hraci;
     private OvladanieHry ovladanieHry;

V konštruktore tejto Hry si nastavíme to, čo vieme:

public Hra() {
     this.ovladanieHry = new OvladanieHry();
     this.pocetHracov = ovladanieHry.vyberPocetHracov();
     this.hraci = vytvorHracov();
 }

Nestavili sme balík kariet, pretože, ten je špecifický pre každý typ hry iný. V našom prípade sú to karty pre hru Čierny Peter. Tak tie si vytvorím neskôr.

V kuse kódu vyššie sme si vytvorili inštanciu ovládania hry a hneď sme ju aj použili pri výbere počtu hráčov. Metóda výber hráčov je jednoduchá, používateľa aplikácie sa pýtam ako sa volajú a rovno ich vytvorím a dám do zoznamu.

public List<Hrac> vytvorHracov() {
     ArrayList<Hrac> hraci = new ArrayList<>();
     for(int i = 0; i < pocetHracov; i++){
         Hrac hrac = ovladanieHry.getMenoHraca(i+1);
         hraci.add(hrac);
     }
 
     return hraci;
 }

Logiku hry spustím a teda začnem ju hrať keď zavolám metódu zacniHrat.

public void zacniHru() {
     HraCiernyPeter ciernyPeter = new HraCiernyPeter();
 
     //vseobecna logika ku kazdej hre
     balikKariet = vytvorBalik(ciernyPeter.vytvorKarty());
     balikKariet.zamiesajKarty();
 
     //rozdaj karty z baliku
     ciernyPeter.rozdajKarty(this);
     // pre hru urcim prveho hraca
     // v ciernom petrovi je to hrac s najviac kartami a ten zacina tahat
     Hrac prvyHrac = ciernyPeter.getHracaSNajviacKartami(getHraci());
 
     //vsobecne na zaklade prveho hraca zistim jeho poradie v zozname hracov v hre
     int prvyHracIndex = getHraci().indexOf(prvyHrac);
 
     ciernyPeter.zlozHracomParyZRuky(this);
 
     ciernyPeter.odstranHracovZHry(this);
 
     if(!ciernyPeter.jeKoniecHry(this)){
         //idu do kruhu az kym hraju aspon dvaja hraci
         ciernyPeter.kolobehHry(this,prvyHracIndex);
     }
 }

Tu si vytvorím inštanciu triedy HraCiernyPeter, ktorá má na starosti logiku, ktorá je špecifická práve pre tento typ hry. Tú si vytvoríme neskôr.

Na tomto mieste si vytvorím aj balík kariet pomocou kariet, ktoré sa vytvárajú v triede HraCiernyPeter. Keďže som zvolil názvy metód také, aby sa ľahko chápali, tak tušíme čo dané metódy robia. Keď vytvorím balík a idem hrať, tak karty pomiešam, potom ich rozdám hráčom.

Musím si určiť, ktorý hráč začína ako prvý. V čiernom petrovi je to ten, čo má najviac kariet.

Ako sme si povedali na začiatku, tak keď majú hráči rozdané karty, tak si zložia všetky páry a tým sa zbavia nejakých kariet. Skontrolujem či azda niekto nemal všetko páry na ruke a tým pádom skončil v hre. Spýtam sa, či je koniec hry – či ostal len jeden hráč, ktorý má čierneho petra – lebo táto karta nemá pár. Ak nie, tak začnem kolobeh hry.

V tejto triede mám aj iné pomocné triedy. Skús si ich prejsť sám.

package sk.jaro.CiernyPeter;
 
 import sk.jaro.CiernyPeter.gui.OvladanieHry;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class Hra{
 
     private BalikKariet balikKariet;
     private int pocetHracov;
     private List<Hrac> hraci;
     private OvladanieHry ovladanieHry;
 
     public Hra() {
         this.ovladanieHry = new OvladanieHry();
         this.pocetHracov = ovladanieHry.vyberPocetHracov();
         this.hraci = vytvorHracov();
     }
 
     public BalikKariet getBalikKariet() {
         return balikKariet;
     }
 
     public List<Hrac> getHraci() {
         return hraci;
     }
 
     public OvladanieHry getOvladanieHry() {
         return ovladanieHry;
     }
 
     public List<Hrac> vytvorHracov() {
         ArrayList<Hrac> hraci = new ArrayList<>();
         for(int i = 0; i < pocetHracov; i++){
             Hrac hrac = ovladanieHry.getMenoHraca(i+1);
             hraci.add(hrac);
         }
 
         return hraci;
     }
 
     public BalikKariet vytvorBalik(List<Karta> karty) {
         return new BalikKariet(karty);
     }
 
     public void odstranHracaZHry(Hrac hrac) {
         //ak ma prazdnu ruku odstranim ho
         if(hrac.getKartyVRuke().isEmpty()){
             getHraci().remove(hrac);
         }
     }
 
     public void ukonciHru() {
         ovladanieHry.vypisKtoPrehral(this);
     }
 
     public void zacniHru() {
         HraCiernyPeter ciernyPeter = new HraCiernyPeter();
 
         //vseobecna logika ku kazdej hre
         balikKariet = vytvorBalik(ciernyPeter.vytvorKarty());
         balikKariet.zamiesajKarty();
 
         //rozdaj karty z baliku
         ciernyPeter.rozdajKarty(this);
         // pre hru urcim prveho hraca
         // v ciernom petrovi je to hrac s najviac kartami a ten zacina tahat
         Hrac prvyHrac = ciernyPeter.getHracaSNajviacKartami(getHraci());
 
         //vsobecne na zaklade prveho hraca zistim jeho poradie v zozname hracov v hre
         int prvyHracIndex = getHraci().indexOf(prvyHrac);
 
         ciernyPeter.zlozHracomParyZRuky(this);
 
         ciernyPeter.odstranHracovZHry(this);
 
         if(!ciernyPeter.jeKoniecHry(this)){
             //idu do kruhu az kym hraju aspon dvaja hraci
             ciernyPeter.kolobehHry(this,prvyHracIndex);
         }
     }
 }

Logika hry Čierny Peter

V tejto časti si vytvoríme karty špecifické pre túto hru. Teda 16 párov a jedného čierneho petra.

public List<Karta> vytvorKarty() {
     ArrayList<Karta> karty = new ArrayList<>();
 
     int j = 1;
     for(int i = 0; i < 16; i++, j=j+2){
         karty.add(new Karta(j, i));
         karty.add(new Karta(j+1, i));
     }
 
     karty.add(new Karta(33,-1)); //Čierny Peter
 
     return karty;
 }

Keď rozdávam karty, tak ich rozdávam po jednej. Táto metóda by mohla byť aj v triede Hra, ale teoreticky pre iné typy hier by sa karty rozdávali inak. Tu rozdávam všetky karty.

Z balíku kariet zoberiem prvú kartu, z balíka ju odstránim a dám ju hráčovi do ruky. Tu je taký fígeľ, že idem cez všetky karty a robím modulo nad poradím karty s počtom hráčov, to mi zaručí, že budem dookola prechádzať hráčov až kým neskončí balík.

public void rozdajKarty(Hra hra) {
     BalikKariet balikKariet = hra.getBalikKariet();
     List<Hrac> hraci = hra.getHraci();
 
     int pocetKariet = balikKariet.getKarty().size();
 
     for(int i = 0; i<pocetKariet;i++){
         Hrac hrac = hraci.get(i%hraci.size());
         hrac.getKartyVRuke().add(balikKariet.getKartu());
     }
 }

Keď sa chystám odstrániť hráčov z hry (keď nemajú už žiadne karty na ruke), tak ich nemôžem odstrániť počas toho ako cez nich prechádzam (iterujem). Preto si ich dávam do pomocného zoznamu a až po iterácii ich odstránim.

public void odstranHracovZHry(Hra hra) {
     //nemôžem mazať hraca z kolekcie ak cez nu prechadzam, preto si vytvorim novy zoznam a odstranim potom
     ArrayList<Hrac> hraciNaOdstranenie = new ArrayList<>();
 
     for(Hrac hrac : hra.getHraci()){
         //skontrolujem ci uz niekto neskoncil, teda ma prazdnu ruku
         //ak ano odstranim ho z hry
         if(hrac.getKartyVRuke().isEmpty()){
             hraciNaOdstranenie.add(hrac);
         }
     }
 
     for(Hrac hrac : hraciNaOdstranenie){
         hra.odstranHracaZHry(hrac);
     }
 }

Keď niekomu zoberiem kartu z ruky, tak každému z tých hráčov pomiešam karty. Jednému hráčovi zoberiem kartu z kolekcie kartičiek čo má na ruke a druhému pridám do kolekcie ďalšiu kartu.

public void zoberHracoviKartu(Hrac hrac1, Hrac hrac2, Hra hra) {
     int poradieZobranejKarty = hra.getOvladanieHry().zoberKartu(hrac1,hrac2);
     Karta vzataKarta = hrac2.getKartyVRuke().get(poradieZobranejKarty);
 
     hrac1.getKartyVRuke().add(vzataKarta);
     hrac2.getKartyVRuke().remove(vzataKarta);
 
     //pomiesam karty v ruke
     Collections.shuffle(hrac1.getKartyVRuke());
     Collections.shuffle(hrac2.getKartyVRuke());
 }

Samozrejme kolobeh hry ide nasledovne. Hráme dovtedy, kým nám v hre ostanú aspoň dvaja hráči. Začínam u prvého hráča, ktorý zoberie kartu druhému hráčovi. A tu som si natrafil na chybu. Predsa hráč s najväčším počtom kariet neťahá ale malo by sa ťahať jemu teda, ten čo je za ním ťahá od neho. Tak tu si to môžete opraviť, to nechám na vás. Pomôcka: upravte index prvého hráča v triede Hra, ak si pamätáte, tam sme ho určili.

public void kolobehHry(Hra hra, int prvyHracIndex) {
     while (hra.getHraci().size() > 1) {
         int pocetHracov = hra.getHraci().size();
         Hrac hrac1 = hra.getHraci().get(prvyHracIndex%pocetHracov);
         Hrac hrac2 = hra.getHraci().get((prvyHracIndex + 1)%pocetHracov);
         zoberHracoviKartu(hrac1, hrac2,hra);
 
         zlozHracomParyZRuky(hra);
         odstranHracovZHry(hra);
         if(jeKoniecHry(hra)) {
             break;
         }
         prvyHracIndex++;
     }
 }

Tu je potom celý kód triedy aj s inými pomocnými metódami.

package sk.jaro.CiernyPeter;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 public class HraCiernyPeter {
     public List<Karta> vytvorKarty() {
         ArrayList<Karta> karty = new ArrayList<>();
 
         int j = 1;
         for(int i = 0; i < 16; i++, j=j+2){
             karty.add(new Karta(j, i));
             karty.add(new Karta(j+1, i));
         }
 
         karty.add(new Karta(33,-1)); //Čierny Peter
 
         return karty;
     }
 
     public void rozdajKarty(Hra hra) {
         BalikKariet balikKariet = hra.getBalikKariet();
         List<Hrac> hraci = hra.getHraci();
 
         int pocetKariet = balikKariet.getKarty().size();
 
         for(int i = 0; i<pocetKariet;i++){
             Hrac hrac = hraci.get(i%hraci.size());
             hrac.getKartyVRuke().add(balikKariet.getKartu());
         }
     }
 
     public Hrac getHracaSNajviacKartami(List<Hrac> hraci) {
         int max = 0;
         Hrac hracMax = null;
         for(Hrac hrac : hraci){
             int size = hrac.getKartyVRuke().size();
             if(max < size){
                 max = size;
                 hracMax = hrac;
             }
         }
         return hracMax;
     }
 
     public void zlozHracomParyZRuky(Hra hra) {
         for(Hrac hrac : hra.getHraci()) {
             hrac.odstranParyZRuky();
         }
     }
 
 
     public void odstranHracovZHry(Hra hra) {
         //nemôžem mazať hraca z kolekcie ak cez nu prechadzam, preto si vytvorim novy zoznam a odstranim potom
         ArrayList<Hrac> hraciNaOdstranenie = new ArrayList<>();
 
         for(Hrac hrac : hra.getHraci()){
             //skontrolujem ci uz niekto neskoncil, teda ma prazdnu ruku
             //ak ano odstranim ho z hry
             if(hrac.getKartyVRuke().isEmpty()){
                 hraciNaOdstranenie.add(hrac);
             }
         }
 
         for(Hrac hrac : hraciNaOdstranenie){
             hra.odstranHracaZHry(hrac);
         }
     }
 
     public boolean jeKoniecHry(Hra hra) {
         if(hra.getHraci().size() < 2){
             hra.ukonciHru();
             return true;
         }
         return false;
     }
 
     public void zoberHracoviKartu(Hrac hrac1, Hrac hrac2, Hra hra) {
         int poradieZobranejKarty = hra.getOvladanieHry().zoberKartu(hrac1,hrac2);
         Karta vzataKarta = hrac2.getKartyVRuke().get(poradieZobranejKarty);
 
         hrac1.getKartyVRuke().add(vzataKarta);
         hrac2.getKartyVRuke().remove(vzataKarta);
 
         //pomiesam karty v ruke
         Collections.shuffle(hrac1.getKartyVRuke());
         Collections.shuffle(hrac2.getKartyVRuke());
     }
 
     public void kolobehHry(Hra hra, int prvyHracIndex) {
         while (hra.getHraci().size() > 1) {
             int pocetHracov = hra.getHraci().size();
             Hrac hrac1 = hra.getHraci().get(prvyHracIndex%pocetHracov);
             Hrac hrac2 = hra.getHraci().get((prvyHracIndex + 1)%pocetHracov);
             zoberHracoviKartu(hrac1, hrac2,hra);
 
             zlozHracomParyZRuky(hra);
             odstranHracovZHry(hra);
             if(jeKoniecHry(hra)) {
                 break;
             }
             prvyHracIndex++;
         }
     }
 
 
 }

Main

Nakoniec som si vytvoril triedu s jednou main metódou, ktorá sa nám bude volať pri spustení programu.

public static void main(String[] args) {
     
     Hra hra = new Hra();
     hra.zacniHru();
 }

Celý Java program si vieš stiahnuť odtiaľto.

TODO - úloha pre teba

Dorobte výpis, aké karty boli hráčovi odstránené z ruky, keď zložil páry. Spravte ďalšie podmienky pri zadávaní údajov od používateľa, aby nebral karty, ktoré niekto nemá v ruke a podobne. 

Autorom tohto blogu je Jaro Beňo, autor Java online kurzu, ktorý môžeš na Learn2Code študovať zadarmo.

Skillmea tím

Sme jednotka v online vzdelávaní na Slovensku.

Na našom webe nájdeš viac ako 260 rôznych videokurzov z oblastí ako programovanie, tvorba hier, testovanie softwaru, grafika, UX dizajn, online marketing, MS Office a pod. Vyber si kurz, ktorý ťa posunie vpred ⏩

Mohlo by tě zajímat

Tipy a triky
05.07.2017
Skillmea tím

Klávesové skratky v Exceli

Pripravili sme pre teba zoznam klávesových skratiek pre Excel 2010. Tento blog popisuje najpoužívanejšie klávesové skratky, funkčné klávesy a niektoré ďalšie bežné klávesové skratky pre Microsoft Excel 2010 pre Windows. Ak používaš Mac, namiesto Ctrl je potrebné použiť klávesu Cmd. Kopírovanie Ctrl + C Kopírovanie Ctrl + X Vystrihnutie Ctrl + V Prilepenie Formátovanie Ctrl + B Zmení text na tučný Ctrl + I Zmení text na kurzívu Ctrl + U Podčiarkne text Ctrl + = Pridá vonkajšie orámovanie Práca so súborom F12 Uložiť ako Ctrl + O Otvorenie existujúceho zošitu Ctrl + N Vytvorenie nového zošitu Ctrl + S Uloženie zošitu Výber buniek Ctrl + Home Presunie kurzor do prvej bunky Ctrl Podržte Ctrl a môžete označiť viac objektov naraz Shift Označte prvý objekt, podržte Shift a označte posledný objekt. Označia sa všetky objekty medzi Ctrl + A Označí celú tabuľku v ktorej sa nachádza práve označená bunka Ctrl + ← Presunie kurzor doľava na začiatok tabuľky Ctrl + → Presunie kurzor doprava na koniec tabuľky Ctrl + ↑ Presunie kurzor hore na začiatok tabuľky Ctrl + ↓ Presunie kurzor dole na koniec tabuľky Ctrl + medzera Označí celý stĺpec Shift + medzera Označí celý riadok F2 Úprava textu práve označenej bunky Rôzne Ctrl + F Nájde alebo nahradí text Ctrl + Z Presunie o 1 krok dozadu Ctrl + Y Presunie o 1 krok dopredu F4 Zmení adresu bunky z relatívnej na absolútnu a naopak Ctrl + , Zobrazí alebo skryje všetky vzorce F1 Zobrazí nápovedu Ctrl + F1 Zobrazí alebo skryje pásy na hlavnom paneli Alt + F8 Otvorí ponuku pre nahrávanie makier Shift + F2 Vloží do bunky komentár Súbor s klávesovými skratkami v Exceli si môžeš stiahnuť odtiaľto. Plus bonusová časť: videotutoriál, ako si upraviť vzhľad Excelu podľa svojich preferencií.
Tipy a triky
02.06.2017
Martina Baumann

Najvtipnejšie programátorské GIFká

Keďže sa teraz trošku pohybujem v IT komunite ľudí, poznám niekoľko programátorov. A tak si stále hovorím (alebo myslím), že skutočne trávia za PC celé dni a keď sa zahĺbia do svojho kódu, nesledujú, čo sa deje okolo nich. Viem, čo hovorím - chalani si totiž už tretí týždeň vôbec nevšimli, že som ostrihaná! Ako môže teda niekedy vyzerať taký život ortodoxného kódera?  GIF webyAk si programátor a zároveň chceš propagovať svoju prácu povedzme prostredníctvom blogov alebo iných príspevkov, môžu sa ti niekedy hodiť do článkov aj vtipné GIFká. Všeobecne nemusíš byť len programátorom, na svoje si príde každý copywriter, bloger, redaktor, ktorý čo-to píše a potrebuje texty doplniť o nejaké to dobré GIFko. Ktoré webky majú tie naj GIFká? Čítaj ďalej! Takže, kde zaručene nájdeš GIF, ktoré práve potrebuješ? Čekuj najmä weby ako giphy.com - samozrejme, že ti ako prvé nemôžem ponúknuť nič iné ako Giphy, pretože práve tento web navštevujú denne milióny užívateľov (niektoré zdroje uvádzajú desiatky miliónov a iné zas sa pohybujú v stovkách miliónov) a je to určite najrozšírenejší zdroj GIFiek pod slnkom. Tu nájdeš všetko, používam ho aj ja úplne najčastejšie a musím priznať, že patrí medzi moje naj. Ďalšie weby, ktoré odporúčam, sú napríklad thecodinglove.com,reddit.com, reactiongifs.com. Pre tých prieberčivých je ešte jedna možnosť a to vytvoriť si také GIF, aké presne potrebuješ. Ak si chceš urobiť vlastné GIF, tak určite na stránke makeagif.com. Späť k tým našim programátorom. Naozaj si myslím, že to môžu byť vtipní ľudia a vôbec s nimi nemusí byť až taká nuda. Aby som ťa presvedčila, vybrala som nasledujúce GIFká.  Pondelok ráno: Takže, zľahka si vyťukám svoj kód... Utorok (niekedy okolo obeda): A takto môže vyzerať homeoffice :) Streda (ráno) - still in progress Streda (neskoro poobede): Takto zas môže vyzerať, keď je kríza alebo sa jednoducho nedarí a kód si robí, čo chce Stále streda? Možno už štvrtok? Svitá na lepšie časy? Na druhej strane - nič nepoteší programátora viac, ako keď jeho kód skutočne funguje tak, ako má  A nasleduje nefalšovaná radosť! ...alebo aj takto (väčšinou už niekde okolo 18:00 h piatok) Programátor musí mať prstoklad! Alebo? Keď všetko fičí, ako má  Nadčasové CSS gifko, ktoré nikdy neomrzí:) Zmením len tento jeden riadok v kóde: Skutočne 👇  Tip na záver Mne osobne sa páči napríklad tento blog, ktorý ma vždy zaručene pobaví.  Páčil sa ti tento blog? Venuj mu 👍  Ktoré GIFko sa ti páčilo najviac? Napíš mi ho do komentára 👇  
Tipy a triky
05.05.2017
Skillmea tím

Ako naprogramovať kalkulačku v Jave

Dnes sa naučíme základné operácie v Jave, ktoré si ukážeme pri programovaní jednoduchej kalkulačky. Okrem iného sa naučíme: • vypísať zadaný text • uložiť hodnoty pre premenné typu String a int • vytvorenie vstupu pre užívateľa • parsovanie textu na čísla • podmienky a jednoduché vetvenie • základné matematické výpočy v Jave Program kalkulačka v Jave Čo teda chceme, aby náš program vedel urobiť? 2. Dokáže zaznamenať 2 čísla zadané užívateľom do konzoly 4. Dokáže podľa inštrukcií zadaných užívateľom do konzoly určiť operáciu (+, -, x, /) 6. Dokáže zo zadaných udajov vykonať výpočet a výsledok vypísať Po dokončení by program mal vyzerať nasledovne: *nezabudnite si nastaviť podporu UTF 8, pretože znaky ľšťžýážä to brať nebude Počas programovania vlastnej kalkulačky ju môžete použiť ako šablónu a pokiaľ objavíte vo svojom programe chybu, môžete si ju podľa šablóny opraviť. Poďme si vysvetiť, ako sme takýto program vytvorili. Zatiaľ si nebudeme vysvetľovať základnú štruktúru programu, pretože sa jedná o zložité a pre začiatočníkov ťažko pochopiteľné pojmy (balík, trieda, metóda ...). Viac sa o štruktúre programu dozviete, keď sa budeme venovať objektovo orientovanému programovaniu (OOP). Do programu opíšte to, čo vidíte v šablóne. Vypísanie textu Jednou z najjednoduchších vecí, ktoré budeme od našej aplikácie chcieť, je vypísať nejaký text. K tomu použijeme príkaz System.out.println(“Text“) ; Ako sa dozvieme neskôr, do zátvoriek môžeme namiesto textu v úvodzovkách napísať názov premenej a program nám vypíše jeho program. Tento príkaz nám odriadkuje text v programe, pokiaľ chceme namiesto odriadkovania pokračovať na rovnakom riadku, použijeme príkaz System.out.print(“Text“); Bodkočiarka nám predstavuje koniec jedného príkazu. V našom programe ho použijeme k vypísaniu inštrukcií pre užívateľa. Prázdne úvodzovky nám poslúžia pre vytvorenie prázdneho riadku. Premenné typu String a intPremenné sú názvy, ktoré zastupujú určité číslo alebo text, ktorý je v nich uložený. Pred názvom premennej určujeme typ premennej. Pre číslo slúži int a pre text String. Ukážme si niekoľko príkladov: int a = 5; String b = “Ahoj“; Pokiaľ by sme chceli v kóde vypísať premennú, použijeme príkaz System.out.println(a); Samozrejme môžeme vypísať niekoľko premenných vedľa seba kľudne aj s obyčejným textom a to pomocou znamienka + . Kód by potom mohol vyzerať nasledovne: System.out.println (a + b + “Text“) ; Hodnoty premenných sa môžu počas priebehu programu meniť. Pokiaľ budeme operovať s premennou, ktorá už bola definovaná (bol u nej určený typ), nebudeme znovu jej typ určovať: int a= 5; a=6; Dávajte si pozor na veľké a malé písmená. Pri Stringu sa píše prvé písmeno veľké, pretože sa jedná o referenčný dátový typ, zatiaľčo int je primitívny dátový typ. Tým sa však zatiaľ nebudeme zaoberať. V našom programe si určíme premenné int cislo1, int cislo2, int vysledok a String operácia. Vytvorenie vstupu pre užívateľaĎalej budeme chcieť, aby bol náš program interaktívny. Teda, aby tu dochádzalo k obojstrannej komunikácii medzi počítačom a užívateľom. K tomu si vytvoríme užívateľský vstup. Najskôr si úplne na začiatok kódu pridáme metódu import java.util.Scanner; ktorá nám sprístupní funkcie pre vstup užívateľa z konzoly. Do hlavného bloku kódu si potom nadefinujeme premennú, ktorá nám ponesie Scanner: Scanner sc= new Scanner (System. in) ; Zátvorka nám tu bude definovať diakritiku, ktorú použijeme. Pokiaľ vám nebude fungovať tento kód, skúste napísať: Scannee sc = new Scanner(System.in, “Windows-1250“); Vstup vykonáme tak, že ho priradíme ako hodnotu k premennej pomocou príkazu: sc. nextLine() ; Mohlo by to vyzerať asi takto: String vstup = sc. nextLine() ; V programe získame od užívateľa hodnotu pre cislo1, cislo2 a operáciu Počítač prečíta vstupy od užívateľa vždy ako text. Čo však v prípade, keď budeme chcieť od užívateľa zadať číslo? K tomu slúži tzv. parsovanie. ParsovanieFunkcia parsovania nám slúži, pokiaľ chceme previesť užívateľom zadaný text na číslo. K tomu použijeme funkciu int nazovpremennej = Integer.parseInt(sc.nextLine() ); V našom programe nám poslúži na prevedenie vstup u premenných cislo1 a cislo2 z textu na číslo. PodmienkyPokiaľ chceme, aby prebehla časť kódu len pokiaľ sú splnené určité podmienky, použijeme k tomu funkciu if. Pokiaľ nie sú splnené podmienky, časť kódu bude preskočená a bude sa pokračovať až za ňou. Podmienky píšeme do zátvoriek za kľúčové slovo if a príkazy do zložených zátvoriek. a=1 if (a==1) { System.out.println(“Ahoj“) ; }Pri podmienkach používame == Pri textových premenných používáme namiesto == funkciu equals() String a = “Ahoj“ if (a. equals(“Ahoj“){ System.out.println (“Čau“) ; }Je možné používať ďalšie matematické funkcie ako napríklad porovnávanie (<, >). V našom programe pomocou štyroch if funkcií zistíme, akú zadal užívateľ operáciu a podľa toho vykonáme výpočet.  Matematické operácieV Jave môžeme pracovať s rôznymi matematickými funkciami: Napríklad int a=1+2; Samozrejme je možné nahradiť čísla premennými, napr. int a= b – c ; V našom programe vypočítame výsledok pomocou vysledok= cislo1 [operacia] cislo2; Dúfam, že sa vám podarilo vytvoriť vlastnú funkčnú kalkulačku. Pokiaľ stále máte problémy, skúste ešte skontrolovať, či: • nechýba na konci niektorého príkazu bodkočiarka, • sú správne umiestnené zložené zátvorkyJsou správně umístěné složené závorky • sú veľké a malé písmená zapísané správne Pre dnešok to bude všetko. Java videotutoriál pre začiatočníkov nájdete tu a úplne zadarmo.

Nezmeškaj info o nových kurzoch a špeciálnych ponukách