import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
public class GameFrame extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
Player Comp = new Player(); //庄家 电脑
Player Gamer = new Player(); //玩家 人
JButton clear_btn=new JButton(); //洗牌按钮
JButton compute_btn=new JButton(); //游戏开始按钮
JButton point_btn=new JButton(); //玩家下注按钮
JButton game_btn=new JButton();//玩家按钮
JButton gameover_btn=new JButton(); //游戏结束按钮
JLabel money_lab = new JLabel(); //玩家账户余额
JLabel point_lab = new JLabel(); //玩家账户余额
JLabel game[]=new JLabel[52]; //放置52张牌的标签框
CardManager cm=new CardManager(); //定义指派管理类的对象
int i=0; //记录抓牌数
int computer_dot=0; //记录电脑点数
int game_dot=0; //记录玩家点数
double point = 0; //下注金额
JLabel jLabel1=new JLabel(); //庄家区
JLabel jLabel2=new JLabel(); //玩家区
JLabel jLabel3=new JLabel(); //图标区
JLabel jLabel4=new JLabel(); //背景区
public GameFrame(){
getContentPane().setLayout(null);
this.setTitle("二十一点游戏");
this.setSize(1000,750);
//获得当前屏幕的宽和高
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize=this.getSize(); //获得当前窗体的宽和高
//设置窗体居中
if(frameSize.height>screenSize.height) frameSize.height=screenSize.height;
if(frameSize.width>screenSize.width) frameSize.width=screenSize.width;
this.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
clear_btn.setBounds(new Rectangle(78,388,120,40)); //设置位置
clear_btn.setText("洗牌"); //设置标签内容
clear_btn.addActionListener(this); //注册监听器
compute_btn.setBounds(new Rectangle(233,388,120,40));
compute_btn.setEnabled(false);//不能更改
compute_btn.setText("开始游戏");
compute_btn.addActionListener(this);
point_btn.setBounds(new Rectangle(413,389,120,40));
point_btn.setEnabled(false);
point_btn.setText("玩家下注");
point_btn.addActionListener(this);
game_btn.setBounds(new Rectangle(625,390,120,40));
game_btn.setEnabled(false);
game_btn.setText("玩家抓牌");
game_btn.addActionListener(this);
gameover_btn.setBounds(new Rectangle(837,390,120,40));
gameover_btn.setEnabled(false);
gameover_btn.setText("本轮结果");
gameover_btn.addActionListener(this);
money_lab = new JLabel("账户余额:"+ Gamer.getMoney());
money_lab.setBounds(new Rectangle(800,500,250,70));
money_lab.setFont(new Font("宋体",Font.BOLD, 16));
point_lab = new JLabel("下注金额: "+ point);
point_lab.setBounds(new Rectangle(500,500,250,70));
point_lab.setFont(new Font("宋体",Font.BOLD, 16));
JMenuBar mb=new JMenuBar(); //定义菜单条
JMenu mnuFile=new JMenu("菜单"); //定义菜单
JMenu mnuHelp=new JMenu("帮助");
JMenuItem mnuFileSet=new JMenuItem("设置..."); //定义菜单项
JMenuItem mnuFileExit=new JMenuItem("退出");
JMenuItem mnuHelpAbout=new JMenuItem("关于...");
this.setJMenuBar(mb); //把菜单条添加到窗体上
jLabel1.setText("庄家显示牌区");
jLabel1.setBounds(new Rectangle(250,340,95,38));
jLabel2.setText("玩家显示牌区");
jLabel2.setBounds(new Rectangle(600,340,95,38));
jLabel3.setBounds(new Rectangle(0,450,250,250));
jLabel3.setIcon(new ImageIcon("images/blackJack.png"));
jLabel4.setBounds(new Rectangle(0,0,1000,340));
jLabel4.setIcon(new ImageIcon("images/background.jpg"));
mb.add(mnuFile); //将菜单加到菜单条中
mb.add(mnuHelp);
mnuFile.add(mnuFileSet); //将菜单项添加到菜单中
mnuFile.add(mnuFileExit);
mnuHelp.add(mnuHelpAbout);
//对菜单产生的事件进行注册
mnuFileSet.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
// new SetFrame();
}
});
mnuFileExit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
mnuHelpAbout.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new AboutFrame();
}
});
this.getContentPane().add(jLabel4);
this.getContentPane().add(jLabel3);
this.getContentPane().add(jLabel2);
this.getContentPane().add(jLabel1);
this.getContentPane().add(game_btn);
this.getContentPane().add(clear_btn);
this.getContentPane().add(point_btn);
this.getContentPane().add(gameover_btn);
this.getContentPane().add(compute_btn);
this.getContentPane().add(money_lab);
this.getContentPane().add(point_lab);
this.setVisible(true);
}
public static void main(String [] args){
new GameFrame();
}
public void actionPerformed(ActionEvent e){
//洗牌按钮
if(e.getSource()==clear_btn){
//关闭和开启相应的按钮
compute_btn.setEnabled(true);
clear_btn.setEnabled(false);
getContentPane().repaint();
if(Gamer.getMoney() <= 0)
JOptionPane.showMessageDialog(null,"对不起!您已身无分文了哦 !请退出游戏重新开局吧!","本轮游戏的结果",JOptionPane.INFORMATION_MESSAGE);
//对记牌器,电脑点数和玩家点数进行初始化
i=0;
point = 0 ; //下注清零
Comp.ReStart(); Gamer.ReStart(); //玩家牌清空
point_lab.setText("下注金额: 0.0");
//把标签控件数组放入窗体的窗格中
cm.gameStart(game, this.getContentPane());
cm.initCards(); //初始化一副纸牌
cm.randomCards(); //随机打乱
cm.ShowCard(); //查看打乱的牌序 仅为测试
}
//开始游戏按钮
if(e.getSource()==compute_btn){
//关闭和开启相应的按钮
compute_btn.setEnabled(false);
point_btn.setEnabled(true);
//电脑抓牌//最多抓5张,大于15点就不再抓牌
for(int k=0;k<5;k++){
//绘制牌面(仅有背面)
getContentPane().add(game[i]);
game[i].setIcon(new ImageIcon("images/puke.jpg"));
game[i].setBounds(new Rectangle(50+i*20,100,105,150));
getContentPane().setComponentZOrder(game[i],0);
getContentPane().repaint();
Comp.addCard(cm.cards[i]); //电脑抓牌
i=i+1; //记录已发牌数
//如果面值大于15 或 已经拥有5张牌 则停止抓牌
if(Comp.calculator()>15 || Comp.getCards().size()>=5)
{
Comp.showCard(); //展现电脑牌面 (仅供测试)
return;
}
}
}
//玩家下注按钮
if(e.getSource()==point_btn){
String temp = JOptionPane.showInputDialog("请输入下注金额:"); //提示输入员工姓名
if(temp.equals(""))
point = 0; //空值 赌注为0
else
point = Double.parseDouble(temp);
while(point>Gamer.getMoney() || point < 0)
point = Double.valueOf(JOptionPane.showInputDialog("下注金额不能大于本金且,请重新输入:"));
point_lab.setText("下注金额: "+point);
System.out.println("下注金额:" +point);
game_btn.setEnabled(true);
point_btn.setEnabled(false);
}
//玩家抓牌按钮
if(e.getSource()==game_btn){
//提示玩家
if(Gamer.getNum()>=2){
int a=JOptionPane.showConfirmDialog(null,"现在点数为:"+Gamer.calculator()+"是否再抓牌","提示",JOptionPane.NO_OPTION);
if(a==JOptionPane.NO_OPTION){
game_btn.setEnabled(false);
gameover_btn.setEnabled(true);
return;
}
}
//设置标签,显示抓到的纸牌
getContentPane().add(game[i]);
game[i].setIcon(new ImageIcon("images/"+cm.cards[i].getType()+"-"+cm.cards[i].getValue()+".jpg"));
game[i].setBounds(new Rectangle(450+i*20,100,105,150));
this.getContentPane().setComponentZOrder(game[i],1);
//给玩家发牌:
Gamer.addCard(cm.cards[i]);
i=i+1; //记录已发的牌数
//面值大于21�