//Black Jack with Advice Bot //Advice from www.wizardofodds.com/blackjack import java.awt.*; import java.applet.*; import java.awt.event.*; import java.lang.Character.Subset; public class adviceBot extends Applet implements ActionListener { int deck[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,0}; Font bigfont=new Font("Arial",Font.BOLD,36); private Image ACECLUBS,ACEDIAMOND,ACEHEARTS,ACESPADES,EIGHTCLUBS,EIGHTDIAMOND,EIGHTHEARTS,EIGHTSPADES,FIVECLUBS,FIVEDIAMOND,FIVEHEARTS,FIVESPADES,FOURCLUBS,FOURDIAMOND,FOURHEARTS,FOURSPADES,JACKCLUBS,JACKDIAMOND,JACKHEARTS,JACKSPADES,KINGCLUBS,KINGDIAMOND,KINGHEARTS,KINGSPADES,NINECLUBS,NINEDIAMOND,NINEHEARTS,NINESPADES,QUEENCLUBS,QUEENDIAMOND,QUEENHEARTS,QUEENSPADES,SEVENCLUBS,SEVENDIAMOND,SEVENHEARTS,SEVENSPADES,SIXCLUBS,SIXDIAMOND,SIXHEARTS,SIXSPADES,TENCLUBS,TENDIAMOND,TENHEARTS,TENSPADES,THREECLUBS,THREEDIAMOND,THREEHEARTS,THREESPADES,TWOCLUBS,TWODIAMOND,TWOHEARTS,TWOSPADES; private Button hit=new Button(" Hit "); private Button stand=new Button(" Stand "); private Button deal=new Button(" Deal "); int card=0; int housewins=0; int playerwins=0; int housepoints=0; int playerpoints=0; int housecards=2; int playercards=2; int turn=0; // *** add boolean playerHasAce=false; boolean pSplit=false; //end public void init() { add(hit); hit.addActionListener(this); add(stand); stand.addActionListener(this); add(deal); deal.addActionListener(this); shuffle(); card=0; } public void shuffle() { for(int i=0; i<1000; i++) { int a=(int)(Math.random()*52.0); int b=(int)(Math.random()*52.0); int temp=deck[a]; deck[a]=deck[b]; deck[b]=temp; } } public void paint(Graphics g) { ACECLUBS=getImage(getDocumentBase(), "cards/ac.gif"); ACEDIAMOND=getImage(getDocumentBase(), "cards/ad.gif"); ACEHEARTS=getImage(getDocumentBase(), "cards/ah.gif"); ACESPADES=getImage(getDocumentBase(), "cards/as.gif"); EIGHTCLUBS=getImage(getDocumentBase(), "cards/8c.gif"); EIGHTDIAMOND=getImage(getDocumentBase(), "cards/8d.gif"); EIGHTHEARTS=getImage(getDocumentBase(), "cards/8h.gif"); EIGHTSPADES=getImage(getDocumentBase(), "cards/8s.gif"); FIVECLUBS=getImage(getDocumentBase(), "cards/5c.gif"); FIVEDIAMOND=getImage(getDocumentBase(), "cards/5d.gif"); FIVEHEARTS=getImage(getDocumentBase(), "cards/5h.gif"); FIVESPADES=getImage(getDocumentBase(), "cards/5s.gif"); FOURCLUBS=getImage(getDocumentBase(), "cards/4c.gif"); FOURDIAMOND=getImage(getDocumentBase(), "cards/4d.gif"); FOURHEARTS=getImage(getDocumentBase(), "cards/4h.gif"); FOURSPADES=getImage(getDocumentBase(), "cards/4s.gif"); JACKCLUBS=getImage(getDocumentBase(), "cards/jc.gif"); JACKDIAMOND=getImage(getDocumentBase(), "cards/jd.gif"); JACKHEARTS=getImage(getDocumentBase(), "cards/jh.gif"); JACKSPADES=getImage(getDocumentBase(), "cards/js.gif"); KINGCLUBS=getImage(getDocumentBase(), "cards/kc.gif"); KINGDIAMOND=getImage(getDocumentBase(), "cards/kd.gif"); KINGHEARTS=getImage(getDocumentBase(), "cards/kh.gif"); KINGSPADES=getImage(getDocumentBase(), "cards/ks.gif"); NINECLUBS=getImage(getDocumentBase(), "cards/9c.gif"); NINEDIAMOND=getImage(getDocumentBase(), "cards/9d.gif"); NINEHEARTS=getImage(getDocumentBase(), "cards/9h.gif"); NINESPADES=getImage(getDocumentBase(), "cards/9s.gif"); QUEENCLUBS=getImage(getDocumentBase(), "cards/qc.gif"); QUEENDIAMOND=getImage(getDocumentBase(), "cards/qd.gif"); QUEENHEARTS=getImage(getDocumentBase(), "cards/qh.gif"); QUEENSPADES=getImage(getDocumentBase(), "cards/qs.gif"); SEVENCLUBS=getImage(getDocumentBase(), "cards/7c.gif"); SEVENDIAMOND=getImage(getDocumentBase(), "cards/7d.gif"); SEVENHEARTS=getImage(getDocumentBase(), "cards/7h.gif"); SEVENSPADES=getImage(getDocumentBase(), "cards/7s.gif"); SIXCLUBS=getImage(getDocumentBase(), "cards/6c.gif"); SIXDIAMOND=getImage(getDocumentBase(), "cards/6d.gif"); SIXHEARTS=getImage(getDocumentBase(), "cards/6h.gif"); SIXSPADES=getImage(getDocumentBase(), "cards/6s.gif"); TENCLUBS=getImage(getDocumentBase(), "cards/10c.gif"); TENDIAMOND=getImage(getDocumentBase(), "cards/10d.gif"); TENHEARTS=getImage(getDocumentBase(), "cards/10h.gif"); TENSPADES=getImage(getDocumentBase(), "cards/10s.gif"); THREECLUBS=getImage(getDocumentBase(), "cards/3c.gif"); THREEDIAMOND=getImage(getDocumentBase(), "cards/3d.gif"); THREEHEARTS=getImage(getDocumentBase(), "cards/3h.gif"); THREESPADES=getImage(getDocumentBase(), "cards/3s.gif"); TWOCLUBS=getImage(getDocumentBase(), "cards/2c.gif"); TWODIAMOND=getImage(getDocumentBase(), "cards/2d.gif"); TWOHEARTS=getImage(getDocumentBase(), "cards/2h.gif"); TWOSPADES=getImage(getDocumentBase(), "cards/2s.gif"); Image[] thecard={ACEDIAMOND,TWODIAMOND,THREEDIAMOND,FOURDIAMOND,FIVEDIAMOND,SIXDIAMOND,SEVENDIAMOND,EIGHTDIAMOND,NINEDIAMOND,TENDIAMOND,JACKDIAMOND,QUEENDIAMOND,KINGDIAMOND,ACECLUBS,TWOCLUBS,THREECLUBS,FOURCLUBS,FIVECLUBS,SIXCLUBS,SEVENCLUBS,EIGHTCLUBS,NINECLUBS,TENCLUBS,JACKCLUBS,QUEENCLUBS,KINGCLUBS,ACEHEARTS,TWOHEARTS,THREEHEARTS,FOURHEARTS,FIVEHEARTS,SIXHEARTS,SEVENHEARTS,EIGHTHEARTS,NINEHEARTS,TENHEARTS,JACKHEARTS,QUEENHEARTS,KINGHEARTS,ACESPADES,TWOSPADES,THREESPADES,FOURSPADES,FIVESPADES,SIXSPADES,SEVENSPADES,EIGHTSPADES,NINESPADES,TENSPADES,JACKSPADES,QUEENSPADES,KINGSPADES}; setBackground(Color.green); g.setFont(bigfont); g.setColor(Color.blue); g.drawString("House", 50, 60); g.drawString("Player", 50, 260); g.drawString("Wins", 370, 60); g.drawString(Integer.toString(housewins), 400, 170); g.drawString(Integer.toString(playerwins), 400, 310); g.drawImage(thecard[deck[card+1]], 130, 80, this); g.drawImage(thecard[deck[card+2]], 50, 280, this); g.drawImage(thecard[deck[card+3]], 80, 280, this); for(int i=2; ii) { g.drawImage(thecard[deck[card+i+2]], (50+30*i), 280, this); } } for(int i=2; ii) { g.drawImage(thecard[deck[card+playercards+i]], (100+30*i), 80, this); } } g.setColor(Color.red); g.drawString("Your Points: ", 20, 420); g.drawString("House Points: ", 20, 230); playerpoints=0; int wasace=0; for(int i=2; i<(playercards+2); i++) { int cardvalue=1+deck[card+i]%13; if(cardvalue<11) playerpoints=playerpoints+cardvalue; if(cardvalue>10) playerpoints=playerpoints+10; if((cardvalue==1) && (playerpoints<12)) { wasace=1; playerpoints=playerpoints+10; } // *** add if(cardvalue==1) { playerHasAce=true; } //end } // *** add if(playercards==2) { adviceBot(g); } //end if((wasace==1) && (playerpoints>21)) playerpoints=playerpoints-10; if(playerpoints>21) { turn=1; g.drawString("Bust", 320, 420); } if((playerpoints==21) && (playercards==2)) { turn=1; g.drawString("BlackJack", 320, 420); } if(turn==0) { g.drawString("? ?", 20, 120); } else { g.drawImage(thecard[deck[card]], 50, 80, this); } housepoints=0; wasace=0; for(int i=0; i<2; i++) { int cardvalue=1+deck[card+i]%13; if(cardvalue<11) housepoints=housepoints+cardvalue; if(cardvalue>10) housepoints=housepoints+10; if((cardvalue==1) && (housepoints<12)) { wasace=1; housepoints=housepoints+10; } } for(int i=2; i10) housepoints=housepoints+10; if((cardvalue==1) && (housepoints<12)) { wasace=1; housepoints=housepoints+10; } } if((wasace==1) && (housepoints>21)) housepoints=housepoints-10; if((housepoints<16) && (turn==1) && (playerpoints<22) && (!((playerpoints==21) && (playercards==2)))) { housecards++; repaint(); } g.drawString(Integer.toString(playerpoints), 240, 420); if(turn==1) { g.drawString(Integer.toString(housepoints), 260, 230); displayWin(g); } if(housepoints>21) g.drawString("Bust", 320, 230); } public void displayWin(Graphics g) { g.setFont(bigfont); g.setColor(Color.black); if((playerpoints<=21) && (playerpoints>housepoints)) { g.drawString("You Win", 370, 260); } if((playerpoints<=21) && (housepoints>21)) { g.drawString("You Win", 370, 260); } if((housepoints<=21) && (housepoints>playerpoints)) { g.drawString("You Lose", 370, 260); } if((housepoints<=21) && (playerpoints>21)) { g.drawString("You Lose", 370, 260); } if(housepoints==playerpoints) { g.drawString("Tie Game", 370, 260); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==hit) { if(turn==0) playercards++; repaint(); } if(e.getSource()==stand) { turn=1; repaint(); } if(e.getSource()==deal){ card=card+playercards+housecards; if(card>40) { shuffle(); card=0; } if((playerpoints<=21) && (playerpoints>housepoints)) { playerwins++; } if((playerpoints<=21) && (housepoints>21)) { playerwins++; } if((housepoints<=21) && (housepoints>playerpoints)) { housewins++; } if((housepoints<=21) && (playerpoints>21)) { housewins++; } // *** add playerHasAce=false; //end playercards=2; housecards=2; turn=0; repaint(); } } //Advice Bot Method private void adviceBot(Graphics g) { char adviceInit='s'; String adviceOut; int houseFaceCard; if((deck[card+1]%13)>=9) { houseFaceCard=9; } else { houseFaceCard=deck[card+1]%13; } if(!playerHasAce && playerpoints<=8 && !pSplit) { adviceInit='h'; } if(!playerHasAce && playerpoints>=18 && !pSplit) { adviceInit='s'; } if(!playerHasAce && playerpoints>=9 && playerpoints<=17 && !pSplit) { //(Ace to 10) x (9 to 17) char[][] adviceArray={{'h', 'h', 'd', 'd', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'h'}, {'d', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd'}, {'h', 'h', 'h', 's', 's', 's', 'h', 'h', 'h', 'h'}, {'h', 's', 's', 's', 's', 's', 'h', 'h', 'h', 'h'}, {'h', 's', 's', 's', 's', 's', 'h', 'h', 'h', 'h'}, {'r', 's', 's', 's', 's', 's', 'h', 'h', 'h', 'r'}, {'r', 's', 's', 's', 's', 's', 'h', 'h', 'r', 'r'}, {'r', 's', 's', 's', 's', 's', 's', 's', 's', 's'} }; adviceInit=adviceArray[playerpoints-9][houseFaceCard]; } if(playerHasAce && playerpoints>=13 && playerpoints<=19 && !pSplit) { //(Ace to 10) x (Ace,2 to Ace,8) char[][] adviceArray={{'h', 'h', 'h', 'h', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'h', 'h', 'h', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'h', 'h', 'd', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'h', 'h', 'd', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'h', 'd', 'd', 'd', 'd', 'h', 'h', 'h', 'h'}, {'h', 'd', 'd', 'd', 'd', 'd', 's', 's', 'h', 'h'}, {'s', 's', 's', 's', 's', 'd', 's', 's', 's', 's'} }; adviceInit=adviceArray[playerpoints-13][houseFaceCard]; } if(pSplit) { //(Ace to 10) x (Ace,Ace to 10,10) char[][] adviceArray={{'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'}, {'h', 'p', 'p', 'p', 'p', 'p', 'p', 'h', 'h', 'h'}, {'h', 'p', 'p', 'p', 'p', 'p', 'p', 'h', 'h', 'h'}, {'h', 'h', 'h', 'h', 'p', 'p', 'h', 'h', 'h', 'h'}, {'h', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'h'}, {'h', 'p', 'p', 'p', 'p', 'p', 'h', 'h', 'h', 'h'}, {'h', 'p', 'p', 'p', 'p', 'p', 'p', 'h', 'h', 'h'}, {'r', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'}, {'s', 'p', 'p', 'p', 'p', 'p', 's', 'p', 'p', 's'}, {'s', 's', 's', 's', 's', 's', 's', 's', 's', 's'} }; adviceInit=adviceArray[playerpoints/2-1][houseFaceCard]; } switch(adviceInit) { case 'h': adviceOut="Hit"; break; case 's': adviceOut="Stand"; break; case 'd': adviceOut="Double Down"; break; case 'p': adviceOut="Split"; break; case 'r': adviceOut="Surrender"; break; default: adviceOut="???"; break; } g.setColor(Color.black); g.drawString("You should "+adviceOut, 20, 450); } }