Diskuze: Prosím o radu s kódem 2.0

Java Java Prosím o radu s kódem 2.0 American English version English version

Aktivity (1)
Avatar
Petr Šenfeld:6. července 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. července 22:37
Avatar
Petr Šenfeld:6. července 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. července 22:37
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:6. července 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. července 23:18
Nahoru Odpovědět 6. července 23:15
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Šenfeld:6. července 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. července 23:18
Avatar
Petr Šenfeld:6. července 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. července 23:18
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:6. července 23:19

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

Nahoru Odpovědět 6. července 23:19
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:6. července 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. července 23:31
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Šenfeld:6. července 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. července 23:34
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:6. července 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. července 23:39
Nahoru Odpovědět 6. července 23:38
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Šenfeld:6. července 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. července 23:43
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:7. července 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. července 0:12
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Šenfeld:7. července 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. července 0:58
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:7. července 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. července 13:35
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Šenfeld:8. července 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. července 21:24
Avatar
Odpovídá na Petr Šenfeld
Matúš Olejník:8. července 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. července 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.