📄 blackjack.java
字号:
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;
import java.applet.*;
import java.awt.event.*;
class Cfg
{ private Cfg(){} final static Dimension SCREENSIZE = Toolkit.getDefaultToolkit().getScreenSize(); static boolean isChina;
final static Image[] cardIcons = new Image[53]; final static Dimension cardSize = SCREENSIZE.width>=640?new Dimension(71,96):new Dimension(71*2/3,96*2/3);
static String getIconName(int i) { return "res/"+i+".gif"; }
static boolean isApplet = true;
}
//进度条
class ProgressBar extends Canvas { ProgressBar() { setVisible(true); } public void setRange(int range)
{
setVisible(true); setValue(0);
setMaximum(range+1); }
public void stepIt()
{ setVisible(true);
setValue(getValue()+1); if(getValue()>=getMaximum())
setVisible(false); repaint(); } public void setPos(int pos) { value = pos; } public void setValue(int v) { value = v; } public int getValue() { return value; } public void setMaximum(int m) { max = m; } public int getMaximum() { return max; }
public void paint(Graphics g) { //缓冲绘制(防止图象抖动) Image offIm=createImage(getSize().width,getSize().height);
Graphics buf=offIm.getGraphics(); buf.setColor(Color.red); buf.fillRect(0,0,(int)((float)value/(float)max*getSize().width),getSize().height); g.drawImage(offIm,0,0,this); } private int value; private int max;}
class AwtDisplayer extends Panel { BJCanvas bjCanvas; CmdPanel cmdPanel; MoneyPanel moneyPanel; Button btnHit=new Button(Cfg.isChina?"要牌":"Hit"); Button btnStand=new Button(Cfg.isChina?"停牌":"Stand"); Button btnSplit=new Button(Cfg.isChina?"分牌":"Split"); Button btnDouble=new Button(Cfg.isChina?"加倍":"Double"); Button btnInsurance=new Button(Cfg.isChina?"买保险":"Insurance"); Button btnDeal=new Button(Cfg.isChina?"发牌":"Deal"); Button btnBetPlus = new Button("+"); Button btnBetMinus = new Button("-"); Dealer dealer = new Dealer(1, 30);
StandardDealerHand dealerHand; PlayerHand playerHand; Graphics gph; class MoneyPanel extends Panel { Label lblMoney ; Label lblBet ; Label lblTotal ; MoneyPanel() { setLayout(new GridLayout(2,6)); add( new Label(Cfg.isChina?"赌资:":"Money:",Label.CENTER)); lblMoney= new Label(""+dealer.getMoney(),Label.CENTER); add(lblMoney); add( new Label(Cfg.isChina?"赌注:":"Bet:",Label.CENTER)); lblBet = new Label(""+dealer.getBet(),Label.CENTER); add(lblBet); add( new Label(Cfg.isChina?"总数:":"Total:",Label.CENTER)); lblTotal = new Label(""+dealer.getTotal(),Label.CENTER); add(lblTotal); add(new Label(Cfg.isChina?"下注 ":"Bets ",Label.CENTER)); add(btnBetPlus); add(btnBetMinus); add(new Label("")); add(new Label("")); add(new Label("")); btnBetPlus.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{ dealer.setBet(dealer.getBet()+10>50?50:dealer.getBet()+10);
repaint(); if(dealer.getMoney()-dealer.getBet()>=0) btnDeal.setEnabled(true); }
} ); btnBetMinus.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{ dealer.setBet(dealer.getBet()-10>0?dealer.getBet()-10:10);
repaint(); if(dealer.getMoney()-dealer.getBet()>=0) btnDeal.setEnabled(true); }
} ); } public void paint(Graphics g) { update(g); } public void update(Graphics g) { lblMoney.setText(""+dealer.getMoney()); lblBet.setText(""+dealer.getBet()); lblTotal.setText(""+dealer.getTotal()); } }// class MoneyPanel end class BJCanvas extends Canvas { BJCanvas() { addKeyListener(new KeyHandler()); } public void paint(Graphics g) { update(g); } public void update(Graphics g) { Image offIm=createImage(getSize().width,getSize().height);
Graphics buf=offIm.getGraphics();
buf.setColor(Color.white); buf.fillRect(0,0,getSize().width,getSize().height); drawDealerHand(buf); drawPlayerHands(buf); g.drawImage(offIm,0,0,this); } private void drawDealerHand(Graphics g) { int x = Cfg.cardSize.width/2; int y = Cfg.cardSize.height/4; if (dealerHand ==null) return; dealerHand.draw(g,x,y,this); } private void drawPlayerHands(Graphics g) { int x = Cfg.cardSize.width/2; int y = Cfg.cardSize.height+Cfg.cardSize.height/2; if(dealer==null) return; Vector playerHands = dealer.getPlayers(); for(Enumeration e = playerHands.elements();e.hasMoreElements();) { BlackJackHand playerHand = (BlackJackHand) e.nextElement(); playerHand.draw(g,x,y,this); x += Cfg.cardSize.width+Cfg.cardSize.width/2; } } }//class BJCanvas end class CmdPanel extends Panel { CmdPanel() { setLayout(new GridLayout(2,3)); add(btnHit); add(btnStand); add(btnSplit); add(btnDouble); add(btnInsurance); add(btnDeal); setAllEnabled(false); btnDeal.setEnabled(true); btnDeal.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{
deal(); }
} ); btnHit.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{
playerHand.setTurn(TurnResult.HIT); handleTurn(); }
} ); btnStand.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{ playerHand.setTurn(TurnResult.STAND); handleTurn();
}
} ); btnDouble.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{ playerHand.setTurn(TurnResult.DOUBLE_DOWN); handleTurn();
}
} ); btnInsurance.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{ playerHand.setTurn(TurnResult.INSURANCE); handleTurn(); }
} ); }// constructor CmdPane end void setAllEnabled(boolean enabled) { Component[] btns = getComponents(); for(int i=0;i<btns.length;i++) btns[i].setEnabled(enabled); } }//class CmdPanel end AwtDisplayer() { initDealer(); moneyPanel = new MoneyPanel(); bjCanvas = new BJCanvas(); cmdPanel = new CmdPanel(); setLayout(new BorderLayout()); add(moneyPanel,BorderLayout.NORTH); add(bjCanvas,BorderLayout.CENTER); add(cmdPanel,BorderLayout.SOUTH); } //键盘处理器
private class KeyHandler implements KeyListener
{
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode(); System.out.println(e);
switch(keyCode)
{
case KeyEvent.VK_H: break; case KeyEvent.VK_S: break; case KeyEvent.VK_P: break; case KeyEvent.VK_D: break; case KeyEvent.VK_I: break; case KeyEvent.VK_N: deal(); break; }
} public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){} }
private void deal() { dealer.deal(); playerHand.upShot = ""; dealerHand.upShot = ""; dealerHand.cardDown=true; bjCanvas.repaint(); moneyPanel.repaint(); cmdPanel.setAllEnabled(false); btnHit.setEnabled(true); btnStand.setEnabled(true); btnBetPlus.setEnabled(false); btnBetMinus.setEnabled(false); btnSplit.setEnabled(playerHand.isSplitable()); btnDouble.setEnabled(playerHand.canDouble()); btnInsurance.setEnabled(dealerHand.canInsurance()); } private void initDealer() {
dealer.newShoe();//取一幅已洗好的牌
dealerHand = new StandardDealerHand();//庄家牌手
//玩家牌手
playerHand = new PlayerHand( Cfg.isChina?"玩家":"Player");
dealer.setDealerHand(dealerHand);//设置庄家牌手给庄家
dealer.assignPlayerHand(playerHand);//把玩家牌手赋给庄家
} private void handleTurn() { cmdPanel.setAllEnabled(false); btnHit.setEnabled(true); btnStand.setEnabled(true); if(dealer.handleTurn(playerHand)==false) { dealer.processTurn(dealerHand); dealerHand.cardDown = false; drawStatus(); cmdPanel.setAllEnabled(false); if(dealer.getMoney()-dealer.getBet()>=0) { btnDeal.setEnabled(true); } btnBetPlus.setEnabled(true); btnBetMinus.setEnabled(true); } moneyPanel.repaint(); bjCanvas.repaint(); }// handleTurn end private void drawStatus() { Status playerStatus = dealer.getPlayerStatus(playerHand); playerHand.upShot = " " + playerStatus; if(playerStatus==Status.LOSE) dealer.setMoney(dealer.getMoney()); if(playerStatus==Status.WIN) dealer.setMoney(dealer.getMoney()+dealer.getBet()*2); if(playerStatus==Status.BLACKJACK) dealer.setMoney(dealer.getMoney()+dealer.getBet()*2+dealer.getBet()/2); if(playerStatus==Status.PUSH) dealer.setMoney(dealer.getMoney()); if(dealer.isDouble) dealer.setBet(dealer.getBet()/2); dealer.setTotal(0); }}class MainFrame extends Frame
{ //游戏窗口在WINDOWS 和PDA版本中的大小 final static int WIDTH = Cfg.SCREENSIZE.width>= 640 ? 430 : 240; final static int HEIGHT= Cfg.SCREENSIZE.width>=640 ? 480 : 320 ;
AwtDisplayer bjDisplayer;
MainFrame()
{
Cfg.isChina = getLocale().equals(Locale.CHINA)?true:false; bjDisplayer = new AwtDisplayer(); add(bjDisplayer); setTitle(Cfg.isChina?"黑杰克(JAVA版)":"BlackJack for Java"); //把窗口定位于屏幕中心
setSize(WIDTH,HEIGHT); setLocation( (Cfg.SCREENSIZE.width-WIDTH)/2, (Cfg.SCREENSIZE.height-HEIGHT)/2); //订制窗口消息 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { exitGame(); } }); } //MainFrame() constructor end private void exitGame() { if(Cfg.isApplet) { dispose(); } else System.exit(0); }
}
public class BlackJack extends Applet
{ public static void main(String[] arg)
{
Cfg.isApplet = false; loadFrame= new Frame(); loadFrame.setSize(230,150); loadFrame.setLocation( (Cfg.SCREENSIZE.width-230)/2, (Cfg.SCREENSIZE.height-150)/2); try { Cfg.isChina = loadFrame.getLocale().equals(Locale.CHINA)?true:false; } catch(Exception e) { } loadFrame.add(new LoadPanel()); loadFrame.show();
}
static class LoadPanel extends Panel implements Runnable { private ProgressBar loadProgressBar; private Label loadProgressLabel; LoadPanel() { try { Cfg.isChina = getLocale().equals(Locale.CHINA)?true:false; } catch(Exception e) { } loadProgressLabel = new Label("loading ",Label.CENTER); loadProgressBar = new ProgressBar(); loadProgressBar.setRange(53); loadProgressBar.setSize(getSize().width,20); Label lblTitle = new Label(Cfg.isChina?"黑杰克 JAVA版": "BlackJack for java",Label.CENTER); lblTitle.setFont(new Font("",Font.BOLD,18)); setLayout(new GridLayout(5,1));
add(lblTitle); add(new Label(Cfg.isChina?"制作:吴赤斌":"author: WU CHI BIN",Label.CENTER)); add(new Label("email: ty_wuchibin@yahoo.com.cn",Label.CENTER)); add(loadProgressLabel); add(loadProgressBar); (new Thread(this) ).start(); } public void run() { for(int manIconNo = 0; manIconNo<53;manIconNo++) { Image icon = null; try { InputStream in = getClass().getResourceAsStream(Cfg.getIconName(manIconNo));
byte buffer[] = new byte[in.available()];
for (int i = 0, n = in.available(); i < n; i ++)
buffer[i] = (byte)in.read();
icon = Toolkit.getDefaultToolkit().createImage(buffer);
} catch(Exception e) { System.out.println(e); System.out.println(Cfg.getIconName(manIconNo)); } icon = icon.getScaledInstance(Cfg.cardSize.width,Cfg.cardSize.height,Image.SCALE_AREA_AVERAGING); //Image.SCALE_REPLICATE); Image.SCALE_AREA_AVERAGING);
//Image.SCALE_SMOOTH); Image.SCALE_DEFAULT); Cfg.cardIcons[manIconNo] = icon; loadProgressLabel.setText((Cfg.isChina?"游戏加载 ":"Loading ") + (int)((manIconNo+1)/53.0*100) + "%"); loadProgressBar.stepIt(); repaint(); } mainFrame = new MainFrame(); mainFrame.show(); if(Cfg.isApplet==false) loadFrame.dispose();
} }
public void init()
{ try { Cfg.isChina = getLocale().equals(Locale.CHINA)?true:false; } catch(Exception e) { } me = this; add(new LoadPanel()); } static MainFrame mainFrame ; static BlackJack me; static Frame loadFrame ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -