21点游戏代码

21点游戏代码

package qq;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.*;
public class GameFrame  extends JFrame implements ActionListener{  
	JButton clear_btn = new JButton("洗牌");
    JButton compute_btn = new JButton("开始游戏");
    JButton game_btn = new JButton("玩家抓牌");
	JButton gameover_btn = new JButton("本轮结束");
    CardManager cm = new CardManager();
	JLabel game[] = new JLabel[52];  //放置52张扑克牌的标签
	int i = 0;  //定义抓牌数
    int computer_dot = 0;  //定义电脑点数
	int game_dot = 0;  //定义玩家点数
	Vector v = new Vector();  //存储电脑抓的纸牌
	JLabel jLabel1 = new JLabel("电脑显示牌区");
    JLabel jLabel2 = new JLabel("玩家显示牌区");
    public GameFrame() {
	getContentPane().setLayout(null);
	
    this.setTitle("二十一点游戏");
    this.setBackground(Color.blue);//太小颜色:蓝色
    this.setSize(800, 500);
   
   
	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, 73, 31));
	        clear_btn.addActionListener(this);
	        compute_btn.setBounds(new Rectangle(233, 388, 86, 31));
	        compute_btn.setEnabled(false);
	        compute_btn.addActionListener(this);
	        game_btn.setBounds(new Rectangle(413, 389, 91, 32));
	        game_btn.setEnabled(false);
	        game_btn.addActionListener(this);
	        gameover_btn.setBounds(new Rectangle(625, 390, 91, 32));
	        gameover_btn.setEnabled(false);
	        gameover_btn.addActionListener(this);
	        JMenuBar menuBar = new JMenuBar();
	        JMenu file = new JMenu("文件");
	        JMenu help = new JMenu("帮助");
	        JMenuItem fileExit = new JMenuItem("退出");
	        JMenuItem helpAbout = new JMenuItem("关于");
	        this.setJMenuBar(menuBar);
	        menuBar.add(file);
	        menuBar.add(help);
	        file.add(fileExit);
	        fileExit.addActionListener(new ActionListener() {
	          @Override
	        public void actionPerformed(ActionEvent arg0) {
	             System.exit(0);
	            }
	        });
	        help.add(helpAbout);
	        helpAbout.addActionListener(new ActionListener() {

	         @Override
	         public void actionPerformed(ActionEvent arg0) {
	         new AboutFrame();
	           }
	      });
	        jLabel1.setBounds(new Rectangle(104, 343, 95, 38));
	        jLabel2.setBounds(new Rectangle(499, 343, 92, 33));
	        this.getContentPane().add(jLabel1);
	        this.getContentPane().add(jLabel2);
	        this.getContentPane().add(clear_btn);
	        this.getContentPane().add(compute_btn);
	        this.getContentPane().add(game_btn);
	        this.getContentPane().add(gameover_btn);
	        this.setVisible(true);
	        this.setResizable(false);
	    }
	    @Override
	    public void actionPerformed(ActionEvent arg0) {

	       
	        //洗牌按钮
	        if (arg0.getSource() == clear_btn) {
	            //关闭和开启相应的按钮
	            compute_btn.setEnabled(true);
	            clear_btn.setEnabled(false);
	            //对记牌器、电脑点数和玩家点数进行初始化
	            i = 0;
	            computer_dot = 0;
	            game_dot = 0;
	            //把标签框控件数组放入窗体窗格中
	            cm.gameStart(game, this.getContentPane());
	            //初始化纸牌
	            cm.initPokers();
	            //随机打乱纸牌
	            cm.randomPokers();
	        }

	        //开始游戏按钮
	        if (arg0.getSource() == compute_btn) {
	            //关闭和开启相应的按钮
	            compute_btn.setEnabled(false);
	            game_btn.setEnabled(true);
	            //电脑抓牌
	            for (int k = 0; k < 20; k++) {
	            	
				//this.setIcon(new ImageIcon("images/poker/"+id+".jpg"));
	            game[i].setIcon(new ImageIcon("images/poker/"+game_dot+".jpg"));
	            //电脑牌和玩家牌显示区;扑克向右牌 20 + i*扑克牌间隔 20, 扑克牌向下200, 扑克牌宽度110, 扑克牌高度155
	            game[i].setBounds(new Rectangle(20 + i*20,200, 109, 151));
	            getContentPane().setComponentZOrder(game[i], 1);
	            if (cm.pokers[i].getValue() == 10) {
	            computer_dot = computer_dot + 1;
	            }else {
	              computer_dot = computer_dot + cm.pokers[i].getValue();
	            }
	            v.add(cm.pokers[i]);
	            getContentPane().repaint();
	            i = i + 1;
	            //如果面值总数大于15停止抓牌
	            if (computer_dot >= 15) {
	             return;
	                }
	            }
	        }

	        //玩家抓牌按钮
	        if (arg0.getSource() == game_btn) {
	            //提示
	            if (game_dot >= 10) {
	                int a = JOptionPane.showConfirmDialog(null, "现在点数为:"+game_dot+"是否再抓牌", "提示", JOptionPane.YES_NO_OPTION);
	                if (a == JOptionPane.NO_OPTION) {
	                    game_btn.setEnabled(false);
	                    gameover_btn.setEnabled(true);
	                    return;
	                }
	            }
	            //设置标签框力里显示抓到的纸牌
	            game[i].setIcon(new ImageIcon("images/"+cm.pokers[i].getType()+"-"+cm.pokers[i].getValue()+".jpg"));
	            game[i].setBounds(new Rectangle(350 + i*20, 200, 101, 150));
	            this.getContentPane().setComponentZOrder(game[i], 1);
	            //计算抓到的纸牌面值
	            if (cm.pokers[i].getValue() > 10) {
	                game_dot = game_dot + 1;
	            }else {
	                game_dot = game_dot + cm.pokers[i].getValue();
	            }
	            i = i + 1;
	            //面值大于21停止抓牌,关闭和开启相应按钮
	            if (game_dot > 21) {
	                game_btn.setEnabled(false);
	                gameover_btn.setEnabled(true);
	                return;
	            }
	        }

	        //本轮游戏结束按钮
	        if (arg0.getSource() == gameover_btn) {
	            for (int i = 0; i < v.size(); i++) {
	            	Poker poker =(Poker)v.get(i);
	               // Card card = (Card)v.get(i);

	                game[i].setIcon(new ImageIcon("images/poker/"+poker.getType()+"-"+poker.getValue()+".jpg"));
	                game[i].setBounds(new Rectangle(50 + i*20, 200, 101, 150));
	                this.getContentPane().setComponentZOrder(game[i], 1);
	            }
	            //计算胜负
	            String game_over = "";
	            if (game_dot > 21 && computer_dot <= 21) {
	                game_over = "电脑获胜";
	            } else if (game_dot <= 21 && computer_dot > 21) {
	                game_over = "玩家获胜";
	            }else if (game_dot >= 21 & computer_dot >= 21) {
	                game_over = "平局";
	            }else if (game_dot > computer_dot) {
	                game_over = "玩家获胜";
	            }else if (game_dot < computer_dot) {
	                game_over = "电脑获胜";
	            }else if (game_dot == computer_dot) {
	                game_over = "平局";
	            }
	            //以对话框的方式显示胜负
	            String message = "游戏结果\n";
	            message = message + "电脑点数:" + String.valueOf(computer_dot) + "\n";
	            message = message + "玩家点数:" + String.valueOf(game_dot) + "\n";
	            message = message + "游戏结果:" + game_over;
	            JOptionPane.showMessageDialog(null, message, "本轮游戏结果", JOptionPane.INFORMATION_MESSAGE);
	            //设置命令按钮可操作
	            clear_btn.setEnabled(true);
	            compute_btn.setEnabled(true);
	            game_btn.setEnabled(true);
	            gameover_btn.setEnabled(true);
	        }
	    }

	    public static void main(String[] args) {
	        GameFrame gameFrame = new GameFrame();
	        
	    }
	}
package qq;
import java.awt.Container;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class CardManager {
    public Poker[] pokers = new Poker[52];
    //初始化一副52张纸牌
    public void initPokers() {
        for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 13; j++) {
            	pokers[(i - 1)*13 + j - 1] = new Poker(i, j);
            }
        }
    }
    //随机打乱这52张纸牌
    public void randomPokers() {
    	Poker temp = null;
        //随机生成牌号
        for (int i = 0; i < 52; i++) {
            int a = (int)(Math.random()*52);
            int b = (int)(Math.random()*52);
            temp = pokers[a];
            pokers [a] =pokers [b];
            pokers [b] = temp;
        }
    }
    //显示纸牌图片
    public void gameStart(JLabel game[], Container c) {
        //在容器中删除标签组件
        if (game[0] != null) {
            for (int i = 0; i < 52; i++) {
                c.remove(game[i]);
            }
            c.repaint();
        }
        //在容器中放置52个标签组件用于放置图片
        for (int i = 0; i < 52; i++) {
            game[i] = new JLabel();
            game[i].setBorder(javax.swing.BorderFactory.createEtchedBorder());
            game[i].setBounds(new Rectangle(100 + i*10, 10, 105, 150));
            c.add(game[i]);
        }
        //设置标签组件的图片为rear.jpg,即牌的背面
        for (int i = 0; i < 52; i++) {
            game[i].setIcon(new ImageIcon("images/poker/down.jpg"));
        }
    }
	 
	}
package qq;
public class Poker {
    private int value = 0;  //纸牌面值
    private int type = 0;  //纸牌花色
    //type类型, //value 面值,
    public Poker(int type, int value) {
        this.value = value;
        this.type = type;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }

}
package qq;
import javax.swing.*;
import java.awt.*;
public class AboutFrame extends JFrame{
    JLabel jLabel1 = new JLabel("游戏规则");
    JLabel jLabel2 = new JLabel("声明");
    JTextArea textArea1 = new JTextArea();
    JTextArea textArea2 = new JTextArea();
    public AboutFrame() {
        getContentPane().setLayout(null);
        //显示区;向右27,游戏规则的字体 向下0,宽度97, 扑克牌高度97
        jLabel1.setBounds(new Rectangle(27, 0, 97, 36));
        jLabel2.setBounds(new Rectangle(26, 176, 80, 27));
        textArea1.setColumns(40);
        textArea1.setEditable(false);
        textArea1.setLineWrap(true);
        textArea1.setText("电脑先抓牌,玩家后抓牌。计算自己的面值总数,比较面值数,如果面值总数都大于或等于21,则平局;如果玩家和电脑的面值总数有一个大于21点,另一个不大于21点,则不大于21点的为赢家;如果玩家和电脑的面值总数都不大于21,则面值总数大的为赢家。");
        textArea1.setBounds(new Rectangle(23, 36, 392, 130));
        textArea1.setFont(new Font("楷体", Font.PLAIN, 16));
        textArea2.setEditable(false);
        textArea2.setLineWrap(true);
        textArea2.setBounds(new Rectangle(26, 207, 398, 63));
        textArea2.setText("该游戏中,纸牌的图片来自于WindowsXP的纸牌游戏,图片权属于原作者所有!");
        textArea2.setFont(new Font("楷体", Font.PLAIN, 16));
        this.getContentPane().add(jLabel1);
        this.getContentPane().add(jLabel2);
        this.getContentPane().add(textArea1);
        this.getContentPane().add(textArea2);
        this.setSize(450, 300);
        this.setTitle("关于");
        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);
        this.setVisible(true);
    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值