Co zrobić z tym programem?

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

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.

0

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

0

Według mnie to MOCNO przesadziłeś

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