代码如下:
package zxc;//文件夹名称
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*; //import就是在java的开头的地方,先说明会用到哪些类别
public class MyFrame2 {//创建一个类,这个类主要实现窗体中的各种组件位置大小等等
int o=0;//后序代码会解释,直接跳过
int g=0;
int r=0;
int y=0;
int z[]=new int[1];
public MyFrame2() {//实现MyFrame2的构造函数
poke a=new poke();//创建一个poke类的对象,了解完poke类后再往下看
a.makepoke();//创建出一个完整的牌组
a.daluanpoke();//打乱牌序
a.chouqupoke1();//抽取卡牌;具体实现见poke类
JFrame f = new JFrame("卡牌游戏");
Toolkit tk = Toolkit.getDefaultToolkit(); //注意Toolkit对象不能通过new生成
int w = (int) tk.getScreenSize().getWidth();
int h = (int) tk.getScreenSize().getHeight();
Container cp = f.getContentPane();//获取f窗口//其实就是把窗口f丢到窗体cp中
cp.setLayout(null);
ImageIcon bj = new ImageIcon("img/dd.jpg");//imageIcon其实当做一个给组件插入图片的一个方法即可,创建一个对象↓直接放到标签jl里面
JLabel jl = new JLabel(bj);//以标签背景做为整个窗口的背景
jl.setBounds(0, 0, w, h);//设置位置大小(距离左边界,距离上边界,宽,高)
cp.add(jl); //记住组件要放在容器中才能被看到
JLayeredPane jp=f.getLayeredPane();//JLayeredPane分层窗格,主要是处理有重叠的问题(卡牌叠放)
JButton []jb = new JButton[13];//玩家的牌
JButton []jk = new JButton[13];//电脑玩家的牌
for (int i = 0; i < 13; i++) { //因为有13张牌所以要循环13次 //
ImageIcon pkImg = new ImageIcon("img/"+a.c[i]);//c[i]是13张打乱后玩家的卡牌
jb[i] = new JButton(pkImg);
jb[i].setBounds(300+80*i, 580, 134, 201);//实现每张牌间距一样
jp.add(jb[i],new Integer(i));//jp是前面创建的分层窗体,wj [i]作为对象,new Integer(i)把对象放在第i层
}
a.chouqupoke2();//再次抽牌
for (int i = 0; i < 13; i++) {//同理电脑玩家的牌
ImageIcon pkImg = new ImageIcon("img/"+a.d[i]);
jk[i] = new JButton(pkImg);
jk[i].setBounds(60+80*i, 10, 134, 201);
jp.add(jk[i],new Integer(i));
}
f.setExtendedState(JFrame.MAXIMIZED_BOTH);// JFrame.MAXIMIZED_BOTH最大化化窗体,JFrame.ICONIFIED最小化窗体 JFrame.NORMAL恢复普通窗体状态
f.setVisible(true);//窗体可视化
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭方式
ImageIcon pkImg8 = new ImageIcon("img/pp.jpg");
JButton p1 = new JButton("",pkImg8);//用来放玩家选择的卡牌的按钮
JButton p2 = new JButton("",pkImg8);//用来放电脑玩家选择的卡牌的按钮
p1.setBounds(500, 285, 134, 201);//设置大小位置
p2.setBounds(800, 285, 134, 201);//设置大小位置
ImageIcon pkImg2 = new ImageIcon("img/rr.jpg");
Image temp21 = pkImg2.getImage().getScaledInstance(p1.getWidth(),
p1.getHeight(), pkImg2.getImage().SCALE_DEFAULT);
pkImg2 = new ImageIcon(temp21);
p1.setIcon(pkImg2);
p2.setIcon(pkImg2);
p1.setBorderPainted(false);
p2.setBorderPainted(false);
JButton p6= new JButton("头像");
JButton p7 = new JButton("头像");
ImageIcon pkImg6 = new ImageIcon("img/cc.jpg");//给玩家设置头像图片
ImageIcon pkImg7 = new ImageIcon("img/aa.jpg");//给电脑玩家设置头像图片
p6.setBounds(50, 550, 120, 150);//人
p7.setBounds(1300, 35, 120, 150);//电脑
Image temp2 = pkImg6.getImage().getScaledInstance(p6.getWidth(), p6.getHeight(), pkImg6.getImage().SCALE_DEFAULT);
pkImg6 = new ImageIcon(temp2);
p6.setIcon(pkImg6);
Image temp3 = pkImg7.getImage().getScaledInstance(p7.getWidth(), p7.getHeight(), pkImg7.getImage().SCALE_DEFAULT);
pkImg7 = new ImageIcon(temp3);
p7.setIcon(pkImg7);
JLabel p8 = new JLabel("姓名"); //在头像下显示姓名
JLabel p9 = new JLabel("学号xxxxx "); //在姓名下显示学号
JLabel p10= new JLabel("电脑玩家"); //显示电脑玩家的姓名
p10.setBounds(1305, 150, 150, 100);
p8.setBounds(50, 680, 150, 100);
p9.setBounds(50, 720, 150, 100);
p8.setFont(new Font("宋体",Font.BOLD,20));//”宋体”:代表字体 Font.BOLD:代表加粗字体 “20”:代表字体大小
p9.setFont(new Font("宋体",Font.BOLD,20));
p10.setFont(new Font("宋体",Font.BOLD,20));
p8.setForeground(Color.GREEN);// setForeground:设置字体颜色
p9.setForeground(Color.GREEN);
p10.setForeground(Color.GREEN);
p2.addActionListener(new ActionListener(){//给p2设置监听器(简单理解就是当点击此按钮之后会执行以下内容)
//这里要实现的是给电脑玩家随机从13张牌中抽取一张显示在窗口中间位置p2
public void actionPerformed(ActionEvent e) {
int l=(int)(Math.random()*13);// “int A=n+ (int)(Math.random()*m)”: 随机生成一个大于等于n小于但不等于(n+m)的int
g=l;//记录这个抽取的卡片用于后续比较大小
ImageIcon pkImg2 = new ImageIcon("img/"+a.d[l]);
p2.setIcon(pkImg2);
}
});
for (o=0; o < 13; o++) {//实现点击玩家卡牌时对应卡牌弹起来,当点击另一张卡牌时上一张卡牌自动弹回去,因为最多能出一张牌
jb[o].addActionListener(new ActionListener(){
int u=o;
public void actionPerformed(ActionEvent e) {//因为无法直接使用o来代替wj[]的下标,所以利用u替代,r是用来记录哪一张牌被点起来了,后面出牌的时候就知道是哪张牌了,
if(y%2==0) {jb[u].setBounds(300+80*u, 550, 134, 201);r=u;y++;}//y实现当第二次点击同一张卡牌时,卡牌自动弹回原来的位置(利用奇偶判断弹起或收回)
else {jb[u].setBounds(300+80*u, 580, 134, 201);jb[r].setBounds(300+80*r, 580, 134, 201);r=u;y++;}
}
});
}
JButton p3 = new JButton(""); //这小部分实现给中间骰子按钮插入图片
p3.setBorderPainted(false);//去按钮边框
p3.setBounds(690, 370, 60, 60);//位置大小
ImageIcon icon = new ImageIcon("img/t1.jpg");
Image temp1 = icon.getImage().getScaledInstance(p3.getWidth(), p3.getHeight(), icon.getImage().SCALE_DEFAULT);//让图片尺寸对应按钮大小,让图片刚好完整展现在按钮上无论按钮大小
icon = new ImageIcon(temp1);
p3.setIcon(icon);
p3.setHorizontalTextPosition(SwingConstants.CENTER);//setHorizontalTextPosition方法用于设置文字相对于图片的位置,center即是居中
JButton p5 = new JButton();//设置“vs”按钮的图片
p5.setBounds(700, 500, 60, 45);
ImageIcon icon1 = new ImageIcon("img/uu.jpg");
Image temp22 = icon1.getImage().getScaledInstance(p5.getWidth(),
p5.getHeight(), icon1.getImage().SCALE_DEFAULT);
icon1 = new ImageIcon(temp22);
p5.setIcon(icon1);
JLabel p4 = new JLabel(" ");//在玩家头像上面显示的winner/loser的标签
p4.setFont(new Font("宋体",Font.BOLD,38));//改变字体
p4.setBounds(80, 450, 150, 150);//位置大小
p4.setForeground(Color.cyan);//字体颜色
p3.addActionListener(new ActionListener(){// 此功能为当点击骰子p3时会在骰子上显示“比大”或者“比小”,并在玩家头像上方显示输赢
public void actionPerformed(ActionEvent e) {
for(int t=0;t<100;t++) {
int m=1+(int)(Math.random()*2);//随机从大于等于1小于(1+2)中生成一个数,即就是1和2随机一个数出来
if(m==1) { //随机到1时比小,小的那一方获胜
p3.setText("比小");//按钮中心显示“比小”
a.bidaxiao(a.c, a.d,1,g,r,z);//g代表电脑玩家抽取到的那张卡的下标 r则是玩家的,z[0]用于得知比较之后的结果,对应结果赋给对应的值
//调用poke类中比大小的方法//c是玩家卡牌的数组名,d是电脑玩家卡牌的数组名,“1”即q 因为这是在q==m==1的条件中
if(z[0]==1)p4.setText("winner"); if(z[0]==0)p4.setText("loser");//1代表赢 0代表输,因为是同一副牌所以不会出现平局的情况
}
if(m==2) {//同理
p3.setText("比大");
a.bidaxiao(a.c, a.d, 2,g,r,z);
if(z[0]==1)p4.setText("winner");
if(z[0]==0)p4.setText("loser");
}}
}});
p5.addActionListener(new ActionListener(){//“vs”按钮即玩家出牌的按钮,实现点完将已经弹起来的那张卡牌显示在p1(左边)的位置,并且同时把牌又重新弹回原来的位置
public void actionPerformed(ActionEvent e) {
ImageIcon pkImg10 = new ImageIcon("img/"+a.c[r]);
p1.setIcon(pkImg10);
for (int i = 0; i < 13; i++) { //回弹
jb[i].setBounds(300+80*i, 580, 134, 201);
}}});
//所有组件都必须加入到窗体里头才能看得见
jp.add(p1);//放玩家出的牌的按钮
jp.add(p2);//放电脑玩家出的牌的按钮
jp.add(p3);//骰子
jp.add(p4);//显示输赢的标签
jp.add(p5);//“vs”出牌按钮
jp.add(p6);//玩家的头像
jp.add(p7);//电脑玩家的头像
jp.add(p8);//姓名的标签
jp.add(p9);//学号的标签
jp.add(p10);//电脑玩家名字的标签
}
public static void main(String[] args) {
MyFrame2 mf = new MyFrame2();//运行构造函数即呈现
}
}