Co zrobić z tym programem?

Odpowiedz Nowy wątek
2009-11-22 14:31
marcinos18
0

Witam!
Zrobiłem taki oto program do blackjacka i mam z nim pewien kłopot. Krótko o co chodzi. Tym programem liczymy jakie karty zeszły w grze w blackjacka. Interesuje nas jakie jest prawdopodobieństwo wygranej w następnym rozdaniu. Komputer rozgrywa wszystkie partie i sprawdza jaki jest stosunek wygranych partii do wszystkich. Remis liczy się jako wygrana. Jak zapewne każdy zauwazy metoda getProp() zwracająca to prawdopodobieństwo rozwala procesor w sekundę i zacina kompa. Dzieje się tak za sprawą wszystkich 22 pętli. Moje pytanie brzmi. Jak ten program uprościć i czy da się to jakoś zrobić. Dziękuję za pomoc. Pozdr.

import java.awt.*;
import java.awt.event.*;

public class Blackjack extends Frame {
    int k[]=new int[11];
    int player[] = new int[11];
    int dealer[] = new int[11];
    int HIT = 1;
    int STAND = 2;
    public void init() {
        for(int i=0;i<9;i++) {
            k[i]=24;
        }
        k[9]=96;
        k[10]=312;
    }
    public Blackjack() {
        init();
        repaint();
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
        setLayout(null);
        setTitle("Blackjack Kalkulator v1.0");
        setSize(300,500);
        setVisible(true);
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if(keyCode==e.VK_NUMPAD1) {
                    if(k[0]>0) {
                        k[0]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD2) {
                    if(k[1]>0) {
                        k[1]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD3) {
                    if(k[2]>0) {
                        k[2]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD4) {
                    if(k[3]>0) {
                        k[3]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD5) {
                    if(k[4]>0) {
                        k[4]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD6) {
                    if(k[5]>0) {
                        k[5]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD7) {
                    if(k[6]>0) {
                        k[6]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD8) {
                    if(k[7]>0) {
                        k[7]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD9) {
                    if(k[8]>0) {
                        k[8]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_NUMPAD0) {
                    if(k[9]>0) {
                        k[9]--;
                        k[10]--;
                    }
                    if(k[10]==0) {
                        init();
                    }
                    repaint();
                }
                if(keyCode==e.VK_R) {
                    init();
                    repaint();
                }
            }
        });
    }
    public void paint(Graphics g) {
        g.drawLine(100, 0, 100, 270);
        g.drawLine(0, 270, 300, 270);
        g.drawString("2:    " + k[1], 20, 50);
        g.drawString("3:    " + k[2], 20, 70);
        g.drawString("4:    " + k[3], 20, 90);
        g.drawString("5:    " + k[4], 20, 110);
        g.drawString("6:    " + k[5], 20, 130);
        g.drawString("7:    " + k[6], 20, 150);
        g.drawString("8:    " + k[7], 20, 170);
        g.drawString("9:    " + k[8], 20, 190);
        g.drawString("10:  " + k[9], 20, 210);
        g.drawString("As:  " + k[0], 20, 230);
        g.drawString("Karty:  " + k[10], 20, 250);
        g.drawString("P(wygranej):     " + getProp() + " %", 20, 300);
    }
    public double getProp() {
        int i[]=new int[22];
        long lose = 0;
        long win = 0;
        for(i[0]=2;i[0]<12;i[0]++) {
            for(i[1]=2;i[1]<12;i[1]++) {
                for(i[2]=2;i[2]<12;i[2]++) {
                    for(i[3]=2;i[3]<12;i[3]++) {
                        for(i[4]=2;i[4]<12;i[4]++) {
                            for(i[5]=2;i[5]<12;i[5]++) {
                                for(i[6]=2;i[6]<12;i[6]++) {
                                    for(i[7]=2;i[7]<12;i[7]++) {
                                        for(i[8]=2;i[8]<12;i[8]++) {
                                            for(i[9]=2;i[9]<12;i[9]++) {
                                                for(i[10]=2;i[10]<12;i[10]++) {
                                                    for(i[11]=2;i[11]<12;i[11]++) {
                                                        for(i[12]=2;i[12]<12
i[12]++) {
                                                            for(i[13]=2;i[13]<12;i[13]++) {
                                                                for(i[14]=2;i[14]<12;i[14]++) {
                                                                    for(i[15]=2;i[15]<12;i[15]++) {
                                                                        for(i[16]=2;i[16]<12;i[16]++) {
                                                                            for(i[17]=2;i[17]<12;i[17]++) {
                                                                                for(i[18]=2;i[18]<12;i[18]++) {
                                                                                    for(i[19]=2;i[19]<12;i[19]++) {
                                                                                        for(i[20]=2;i[20]<12;i[20]++) {
                                                                                            for(i[21]=2;i[21]<12;i[21]++) {
                                                                                                int y=0;
                                                                                                dealer[0]=i[0];
                                                                                                player[0]=i[1];
                                                                                                player[1]=i[2];
                                                                                                for(int j=2; j<player.length; j++) {
                                                                                                    if(pStrategy()==HIT) {
                                                                                                        player[j]=i[j+1];
                                                                                                        y=j+1;
                                                                                                    }
                                                                                                }
                                                                                                dealer[1]=i[y+1];
                                                                                                for(int j=2; j<dealer.length; j++) {
                                                                                                    if(dStrategy()==HIT) {
                                                                                                        dealer[j]=i[y+j];
                                                                                                    }
                                                                                                }
                                                                                                if(poss()==1) {
                                                                                                    if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
                                                                                                        player[6]+player[7]+player[8]+player[9]+player[10]>21) {
                                                                                                            lose++;
                                                                                                    }
                                                                                                    else {
                                                                                                        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
                                                                                                            player[6]+player[7]+player[8]+player[9]+player[10]>=
                                                                                                            dealer[0]+dealer[1]+dealer[2]+dealer[3]+dealer[4]+dealer[5]+
                                                                                                            dealer[6]+dealer[7]+dealer[8]+dealer[9]+dealer[10]) {
                                                                                                            if(dealer[0]+dealer[1]==21) {
                                                                                                                if(player[0]+player[1]==21) {
                                                                                                                    win++;
                                                                                                                }
                                                                                                                else {
                                                                                                                    if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
                                                                                                                        player[6]+player[7]+player[8]+player[9]+player[10]==21) {
                                                                                                                            lose++;
                                                                                                                    }
                                                                                                                }
                                                                                                            }
                                                                                                            else {
                                                                                                                win++;
                                                                                                            }
                                                                                                        }
                                                                                                        else {
                                                                                                            if(dealer[0]+dealer[1]+dealer[2]+dealer[3]+dealer[4]+dealer[5]+
                                                                                                            dealer[6]+dealer[7]+dealer[8]+dealer[9]+dealer[10]<22) {
                                                                                                                lose++;
                                                                                                            }
                                                                                                            else {
                                                                                                                win++;
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }   
        }
        return (double)win/(win+lose);
    }
    public int pStrategy() {
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]>=4 &
            player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]<=11) {
            return HIT;
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]==12) {
            if(player[0]==11 | player[1]==11) {
                return HIT;
            }
            if(dealer[0]==2 | dealer[0]==3) {
                return HIT;
            }
            else {
                return STAND;
            }   
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]>=13 &
            player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]<=16) {
            for(int g=0; g<player.length; g++) {
                if(player[g]==11) {
                    return HIT;
                }
            }
            if(dealer[0]>=2 & dealer[0]<=6) {
                return STAND;
            }
            else {
                return HIT;
            }
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]==17) {
            for(int g=0; g<player.length; g++) {
                if(player[g]==11) {
                    return HIT;
                }
            }
            return STAND;
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]==18) {
            for(int g=0; g<player.length; g++) {
                if(player[g]==11) {
                    if(dealer[0]==2 | dealer[0]==7 | dealer[0]==8) {
                        return STAND;
                    }
                    else {
                        return HIT;
                    }
                }
                return STAND;
            }
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]>=19 &
            player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]<=21) {
            return STAND;
        }
        if(player[0]+player[1]+player[2]+player[3]+player[4]+player[5]+
            player[6]+player[7]+player[8]+player[9]+player[10]>21) {
            for(int g=0; g<player.length; g++) {
                if(player[g]==11) {
                    player[g]=1;
                    return pStrategy();
                }
            }
        }
        return STAND;       
    }
    public int dStrategy() {
        if(dealer[0]+dealer[1]+dealer[2]+dealer[3]+dealer[4]+dealer[5]+
            dealer[6]+dealer[7]+dealer[8]+dealer[9]+dealer[10]<17) {
            return HIT;
        }
        else {
            if(dealer[0]+dealer[1]+dealer[2]+dealer[3]+dealer[4]+dealer[5]+
                dealer[6]+dealer[7]+dealer[8]+dealer[9]+dealer[10]>21) {
                for(int g=0; g<dealer.length; g++) {
                    if(dealer[g]==11) {
                        dealer[g]=1;
                        return dStrategy();
                    }
                }
            }
        }
        return STAND;
    }
    public int poss() {
        int n[]= new int[10];
        for(int h=1;h<11;h++) {
            for(int g=0;g<player.length;g++) {
                if(player[g]==h) {
                    n[h-1]++;
                }
                if(player[g]==11) {
                    n[0]++;
                }
            }
        }
        for(int h=0;h<n.length;h++) {
            if(n[h]>k[h]) {
                return 0;
            }
        }
        for(int h=1;h<11;h++) {
            for(int g=0;g<dealer.length;g++) {
                if(dealer[g]==h) {
                    n[h-1]++;
                }
                if(dealer[g]==11) {
                    n[0]++;
                }
            }
        }
        for(int h=0;h<n.length;h++) {
            if(n[h]>k[h]) {
                return 0;
            }
        }
        return 1;
    }
    public static void main(String args[]) {
        new Blackjack();
    }
}

Pozostało 580 znaków

2009-11-22 14:35
0

Ja wiem co mozesz zrobic z takim programem - wyrzucic do smieci.

Chyba nie sadzisz, ze ktos przy zdrowych zmyslach bedzie nawet probowal to przeczytac.

Pozostało 580 znaków

2009-11-22 18:40
marcinos18
0

To ja może wytłumaczę dokładniej jaki jest przebieg programu. Jest w nim zaimplementowany KeyListener zatem nasłuchuje on jakie klawisze zostały wciśnięte. Kolejne cyfry na klawiaturze numerycznej odpowiadają kolejnym kartom (1-As, 2-2, 3-3, 0-10). Tablica k[] przechowuje informacje o ilości kart. Ten punkt jest mało istotny. W metodzie paint(Graphics g) jest rysowanych kilka linii i wypisywane są odpowiednie ilości kart, dwójek, trójek itd. Ostatnia funkcja drawString() ma wyświetlić prawdopodobieństwo wygranej w kolejnej partii. Za wyliczenie tego odpowiedzialna jest metoda getProp(). Zwraca ona wartość double. Teraz jaki jest mój sposób na policzenie tego. A więc. Najprościej: komputer rozgrywa wszystkie mozliwe partie i sprawdza która jest wygrana, a która przegrana (remis liczy jako wygraną). Następnie na końcu zwraca wartość będącą dzieleniem wygranych partii przez wszystkie partie (wygrane i przegrane). Aby rozegrać wszystkie partie stworzyłem 22 pętle. Czemu tyle? Ponieważ zarówno gracz jak i krupier mogą wziąć maksymalnie 11 kart. Więc te pętle po prostu określają jakie są karty w danym rozdaniu. I teraz karty są rozdawane. Do tego służą tablice player[] i dealer[]. Metody pStrategy() i dStrategy() określają czy gracz i krupier mają dobierać karty czy nie. Dalej jest jeszcze wazna metodas poss() określająca czy dana sytuacja na ten czas jest mozliwa, tzn. czy da się taka partię rozegrać w danej chwili (czy jest wystarczająca ilośc dwójek, trójek i tak dalej). Potem określane jest kto wygrał i tyle. Pętla się powtarza a potem kolejna itd. Ot cały program. Tylko jak zrobić, zeby działał szybciej. Pozdr.

Pozostało 580 znaków

2009-11-26 14:40
0

zdajesz sobie sprawe jaka jest złożonośc tej kaskady pętli ?

Pozostało 580 znaków

2009-12-08 16:52
Krzychu121
0

Według mnie to MOCNO przesadziłeś

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0