Letní akce PHP týden
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
Petr Šenfeld:6.7.2018 22:37

Čau,
jsem samouk a začal jsem tady na IT-network úpně od nuly. S dosavadními znalostmi, což je Základy JAVA + 7 lekcí OOP se snažím naprogramovat jednoduchý "BlackJack", zatím jen v konzoli, protože dál jsem se ještě nedostal. Po 7h patlání a různého zkoušení už nevím co dál. K problému..

Ad1)Netuším jak propsat hodnotaH do třídy Dealer, tak aby se mi tam ukládala hodnota a šla vypsat viz. vysledek() ve třídě Dealer. Myslel jsem, že to půjde, když podědím třídu Hrac. Vše funguje, zřejmě ne dle programátorských "pravidel a nějaké přehlednosti" ale k tomu se nějak časem dopracuji.

Ad2) Občas je výsledek 22 program to nezastaví ale někdy je 22 a program se zachová jak má. Netuším čím to je.

Ad3) Když zvolím volbu 2 (stačí) tak mi to v konzoli vůbec nevypíše "stačí".

Snad jsem to dobře popsal. Kód dám do komentáře.
Díky za radu.

Zkusil jsem: Dosavadní řešení je funční avšak nemohu použít metodu vysledek() ze třídy Dealer a musím výsledek psát bez použití OOP v main().

Chci docílit: Využít plně OOP a použít vysledek() ve třídě Dealer a následně jen v main() zavolat dealer.vysledek() namísto původního vypisování...

 
Odpovědět  +1 6.7.2018 22:37
Avatar
Petr Šenfeld:6.7.2018 22:37
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 :-)");
    }

}
 
Nahoru Odpovědět 6.7.2018 22:37
Avatar
Odpovídá na Petr Šenfeld
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ť :)

Editováno 6.7.2018 23:18
Nahoru Odpovědět 6.7.2018 23:15
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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...");
        }
        */

    }
}
 
Nahoru Odpovědět 6.7.2018 23:18
Avatar
Petr Šenfeld:6.7.2018 23:18
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();
      }
    }
}
 
Nahoru Odpovědět 6.7.2018 23:18
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:6.7.2018 23:19

Hm tak toto je úplne iné ako to čo mi skopírovalo naposledy, čudné :D

Nahoru Odpovědět 6.7.2018 23:19
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Petr Šenfeld
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);
        }
Nahoru Odpovědět 6.7.2018 23:31
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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"

 
Nahoru Odpovědět 6.7.2018 23:34
Avatar
Odpovídá na Petr Šenfeld
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 :)

Editováno 6.7.2018 23:39
Nahoru Odpovědět 6.7.2018 23:38
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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...

 
Nahoru Odpovědět 6.7.2018 23:43
Avatar
Odpovídá na Petr Šenfeld
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? :)

Nahoru Odpovědět 7.7.2018 0:12
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
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

 
Nahoru Odpovědět 7.7.2018 0:58
Avatar
Odpovídá na Petr Šenfeld
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.parse­Int(sc.nextLi­ne()); , 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.setHod­notaH(hodnota) a player.getHod­notaH()..

Ď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.nextIn­t(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)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 7.7.2018 13:35
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejní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.

 
Nahoru Odpovědět  +1 8.7.2018 21:24
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:8.7.2018 21:42

Nie je za čo rád pomôžem a aspoň sa nenudím :D 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 :)

Nahoru Odpovědět  +1 8.7.2018 21:42
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.