java卡牌游戏详解

代码创建了一个Java图形用户界面GUI的卡牌游戏,包括玩家和电脑玩家的卡牌显示,头像,以及比大小的功能。用户可以点击卡牌进行选择,点击按钮触发比较大小的规则,根据骰子决定比大或比小。游戏界面包含背景图片,玩家和电脑的头像,以及显示输赢的标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

43c79c1a0cd24ee5ba62170564dd8d8d.png

 

代码如下:






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();//运行构造函数即呈现
    }
}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值