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();
}
}