Diskuze: Prosím o radu s kódem 2.0
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.


package blackjack;
import java.util.Scanner;
import java.util.Random;
/**
 *
 * @author senfik
 */
public class BlackJack {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner sc = new Scanner(System.in, "Windows-1250");
        Hrac hrac = new Hrac();
        Dealer dealer = new Dealer();
        String znovu1 = "1";
        while (znovu1.equals("1")) {
        hrac.hra();
        dealer.turn();
        dealer.vysledek();
        System.out.println("");
        System.out.println("dealer má " + dealer.hodnotaD);
        System.out.println("hráč má "+ hrac.hodnotaH);
        if(hrac.hodnotaH > dealer.hodnotaD) {
            System.out.println("\nVyhrál jsi kámo!!!!\n");
        }
        else if (hrac.hodnotaH == dealer.hodnotaD){
            System.out.println("Stejně!!");
        }
        else if(dealer.hodnotaD >21){
            System.out.println("");
        }
        else
        {
            System.out.println("Prohrál si bro...");
        }
            System.out.println("Chceš znovu hrát?? 1ano/2ne");
        znovu1 = sc.nextLine();
        dealer.hodnotaD = 0;
        hrac.hodnotaH = 0;
    }
     System.out.println("díky za hru :-)");
    }
}
					Matúš Olejník:6.7.2018 23:15
Ako veľmi ti to funguje? Pretože všimol som si ešte z pôvodného
príspevku že tam generuješ náhodné čísla ale bez nejakých obmedzení.
Taktiež by som skôr čakal, že Dealer bude dediť od hráča a nie naopak.
Chcelo by to povedať si čím treba začať 
Petr Šenfeld:6.7.2018 23:18
package blackjack;
import java.util.Random;
/**
 *
 * @author senfik
 */
public class Dealer  {
    public int hodnotaD;
    private int pocetKaret;
    private Random random;
    public int hodnotaH;
    public Dealer() {
        pocetKaret = 10;
        random = new Random();
    }
    public void turn() {
        if(hodnotaD < 17&& hodnotaD <22){
           while(hodnotaD < 17 && hodnotaD <22){
        hodnotaD = hodnotaD + random.nextInt((pocetKaret));
        if(hodnotaD < 22) {
           hodnotaD++;
            System.out.printf("Dealer má: %s\n",hodnotaD);
            try {
            Thread.sleep(500);
            }
            catch (InterruptedException ex) {
            System.err.println("error");
            }
        }
        else{
            System.out.printf("Dealer má: %s PŘES!!\n ",hodnotaD);
            }
          }
        }
     }
    public void vysledek() {
        if(hodnotaD >21)
            System.out.println("Vyhrál jsi!!!!");
        /*if(hodnotaH > hodnotaD) {
            System.out.println("Vyhrál jsi kámo");
        }
        else
        {
            System.out.println("Prohrál si bro...");
        }
        */
    }
}
					package blackjack;
import java.util.Scanner;
import java.util.Random;
/**
 *
 * @author senfik
 */
public class Hrac extends Dealer {
    public int hodnotaH;
    private int pocetKaret;
    private Random random;
    Scanner sc = new Scanner(System.in, "Windows-1250");
    public Hrac() {
        pocetKaret = 10;
        random = new Random();
    }
    public void kartu() {
        hodnotaH = hodnotaH + random.nextInt((pocetKaret));
        if(hodnotaH < 22) {
           hodnotaH++;
            System.out.printf("Máš: %s   cheš další kartu? 1ano/2ne\n",hodnotaH);
        }
        else{
            System.out.printf("Přes, končíš..(%s)",hodnotaH);
            System.out.println("Chceš hrát znovu?? 1ano/2ne");
            hodnotaH = 0;
        }
     }
        public void hra() {
        String znovu = "1";
        System.out.println("Možnosti: ");
        System.out.println("1-kartu");
        System.out.println("2-stačí");
        System.out.println("----------");
        int volba = Integer.parseInt(sc.nextLine());
        while (znovu.equals("1")){
        switch (volba) {
            case 1:
                kartu();
                break;
            case 2:
                System.out.println("stačí");
                break;
         }
        znovu = sc.nextLine();
      }
    }
}
					Matúš Olejník:6.7.2018 23:19
Hm tak toto je úplne iné ako to čo mi skopírovalo naposledy, čudné 
Matúš Olejník:6.7.2018 23:31
Tuto najprv navýšiš aktuálnu hodnotu v ruke o potiahnutú kartu a potom ak je hodnota < 22 tak ju ešte inkrementuješ o 1, to je cielené?
handValue = handValue + random.nextInt((pocetKaret));
        if (handValue < 22) {
            handValue++;
            System.out.printf("Máš: %s   cheš další kartu? 1ano/2ne\n", handValue);
        }
					Petr Šenfeld:6.7.2018 23:34
No měl jsem za to, že když dám < 21, tak aby mi to nešlo přes, když padne 21... samozřejmě cíl je aby cokoliv nad 21 bylo vyhodnoceno jako "přes"
Matúš Olejník:6.7.2018 23:38
Mne tam ide o to hodnotaH++, (sorry už som si to u seba
refaktoroval) že za každým keď potiahnem kartu a na ruke mám menej ako 22
tak mi bezdôvodne zvýšiš aktuálnu hodnotu o 1, ale to len tak na okraj 
Petr Šenfeld:6.7.2018 23:43
Už chápu co tím myslíš, tak nějak ani nevím proč to tam mám ale když to dám pryč tak mi to tam háže nuly a ty nechci...
Matúš Olejník:7.7.2018 0:12
Takže ja by som pridal zopár ďalších tried a trochu inak to
rozčlenil.
Player - ktorý bude mať aktuálnu hodnotu kariet v ruke a počet kariet ..
alebo zoznam kariet keby si chcel do budúcna aj vykreslovať aké karty má (ak
hej tak aj triedu Card). Bude si vedieť vypýtať kartu.
Dealer - to isté ako Player, ale bez toho že by od neho dedil a bude ovládať
miešačku kariet
CardShuffler - miešačka kariet, ktora bude obsahovať celkový počet kariet,
zostávajúci počet, bude vedieť´vypluť nejakú náhodnú kartu, do budúcna
unikátne karty bez niekoľkonásobného opakovania
BlackJackTable - stôl ktorý bude mať jedného dealera a zoznam hráčov
Casino - a nakoniec kasíno v ktorom si budeme môcť vybrať hru BlackJack a
pripraví nám potrebné veci.
Chce sa ti to ísť takto rozbiť alebo chceš nasilu upraviť aktuálny
kód? 
Petr Šenfeld:7.7.2018 0:58
Děkuji za myšlenku. Beru tvé poznámky na vědomí. Rád bych to prozatím
nechal tak jak to je, jen bych chtěl poradit s těmi problémy, které tam
momentálně mám a nevím si rady. viz Ad1) Ad3)...
Ad2) jsem už odstranil.. díky
Matúš Olejník:7.7.2018 13:35
"Stačí" ti to nevypíše kvôli tomu ako máš napísanú metódu hra
public void hra() {
    String znovu = "1";
    System.out.println("Možnosti: ");
    System.out.println("1-kartu");
    System.out.println("2-stačí");
    System.out.println("----------");
    int volba = Integer.parseInt(sc.nextLine());
    while (znovu.equals("1")) {
        switch (volba) {
            case 1:
                kartu();
                break;
            case 2:
                System.out.println("stačí");
                break;
        }
        znovu = sc.nextLine();
    }
}
Už to, že ti ide požiadať o ďalšiu a ďalšiu kartu je len "náhoda"
pretože pred cyklom dáš do premennej volba prvú voľbu int
volba = Integer.parseInt(sc.nextLine()); , ale potom keď by si mal
zistiť ďalšiu voľbu tak si to uložíš do premennej znovu ->
znovu = sc.nextLine(); no a keďže vo switchi sa rozhoduješ
podľa premennej volba ktorá bude vždy len tá úplne prvá. Takže
keď najprv požiadaš o kartu uložíš do nej 1 ale keď chceš zrazu povedať
že stači tak sa načíta do premennej znovu text "2"číim sa
ukončí celý cyklus a do switchu sa nevojde.
Bez nejakých väčších zmien by to mohlo byť nejako takto, kde sa mi aj tak
nepáči že otázka či chcem ďalšiu kartu sa pokladá v metóde
kartu() a nie priamo v hra().
public void hra() {
    System.out.println("Možnosti: ");
    System.out.println("1-kartu");
    System.out.println("2-stačí");
    System.out.println("----------");
    while (true){
        int volba = Integer.parseInt(sc.nextLine());
        if(volba == 1){
            kartu();
        } else if (volba == 2){
            System.out.println("stačí");
            break;
        } else {
            System.out.println("Neplatna volba");
        }
    }
}
Ten prvý problém by som skôr vyriešil tým rozčlenením, ktoré som napísal skorej alebo proste treba Dealerovi dať vedieť o hráčovi ktorý hrá, pridať mu atribút player ktorý bude odkazovať na toho hráča a potom bude Dealer schopný na hráčovi volať niečo ako player.setHodnotaH(hodnota) a player.getHodnotaH()..
Ďalšia vec je to čo sme spomínali s tým vynútením inkrementovaním
hodnotyH. Si písal, že si to tam dal kvôli tomu že ti to generovalo aj
číslo 0, čo sa dá ľahko vyriešiť tým, že nastavíš spodnú a vrchnú
hranicu.
random.nextInt(hornaHranica - spodnaHranica + 1) +
spodnaHranica ti vygeneruje čísla od <spodnaHranica,
hornaHranica>
Na záver, ak máš takúto podmienku if (handValue < 17 && handValue < 22) ak plati ze handValue < 17 tak bude určite platiť aj tá podmienka za tým, čiže handValue < 22 a teda môžeš to zjednodušiť na if (handValue < 17)
+20 Zkušeností
+2,50 Kč
						Petr Šenfeld:8.7.2018 21:24
Děkuji hodně za tvoji pomoc, určitě jsi s tím musel strávit nějaký
čas(minimálně tím psaním na webu 
, ikdyž mě to trvalo 7h jsem na sebe celkem pyšný, je to můj
první program z mé hlavy a hádám, že tak se člověk učí nejlépe. Do
budoucna bych chtěl udělat celé kasino a vytvořit tak celou hru a ještě to
mít třeba s podporou na android.
Matúš Olejník:8.7.2018 21:42
Nie je za čo rád pomôžem a aspoň sa nenudím 
 Jasné veď všetci nejako
začíname 
 ak s tým chceš
ďalej pracovať odporúčam robiť si rôzne verzie napr. pomocou Gitu,
tutorial aj tu na itnetwork a teda nemusíš sa báť že by si si znefunkčnil
funkčný program, uvidíš všetky zmeny ktoré si urobil atď. A keby náhodou
kľudne sa pýtaj 
Zobrazeno 15 zpráv z 15.
				
