问答详情
源自:7-1 简易扑克牌游戏

终于完成了,和老师的一样,相互学习,望高手指点

/**
 * 创建扑克牌类
 * @author 
 *
 */
public class Card implements Comparable<Card> {

    String num;
    String type;
    int  rank;    //rank代表等级,值越大,等级越高        
    public Card(String type,String num,int rank) {
        this.num=num;
        this.type=type;
        this.rank=rank;
    }    
    
    public Card() {
        
    }

    @Override
    public int compareTo(Card o) {
         
        return this.rank-o.rank;      //比较rank值的大小
    }


}


/**
 * 创建玩家类
 * @author 
 *
 */
public class Player  {

    String id;    
    String name;
    List<Card>pCards;   //用于存放玩家手中的牌
    
    public Player(String id,String name) {
        this.id=id;
        this.name=name;
        pCards=new ArrayList<Card>();
    }

}


/**
 * 
 * @author 
 *
 */
public class CardDemo {

    List<Card>cards;
    List<Player>players;
    Player p1;    //玩家
    Player p2;
    Card p1max;   //玩家1最大的牌
    Card p2max;   //玩家2最大的牌
    Card p1min;   //玩家1最小的牌
    Card p2min;   //玩家2最小的牌
//创建扑克牌资源数组
    String[] CardType=new String[] {"方块","梅花","红桃","黑桃"};  //顺序不可调换,否则会影响大小比较的rank值
    String[] CardNum=new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        
    public CardDemo() {
        
        this.cards=new ArrayList<Card>();
        this.players=new ArrayList<Player>();
    }    
    
//创建扑克牌    
    public void CreatCard() {
        
        System.out.println("---------创建扑克牌-----------");
        for(int i=0;i<13;i++) {
            for(int j=0;j<4;j++) {
             cards.add(new Card(CardType[j],CardNum[i],i*13+j));
            }
        }
        //遍历打印扑克牌资源
         System.out.println("--------扑克牌创建成功!----------");
         System.out.print("扑克牌为");
         for(Card c:cards) { 
             System.out.print(c.type+c.num+","); 
         }
         System.out.println("总共52张");
    }
    
//进行洗牌    
    public void washCard() {
    System.out.println("----------开始洗牌--------------");    
        Collections.shuffle(cards);        //进行洗牌
    System.out.println("----------洗牌结束-------------");    
    
    }

//创建两名玩家
     public void creatPlayer() {
        //键盘上输入两名玩家信息      
        Scanner console=new Scanner(System.in);
        System.out.println("请输入第一位玩家的ID和姓名:");
        System.out.println("请输入ID");
        String id1=console.next(); 
        System.out.println("请输入姓名:");
        String name1=console.next();
        p1=new Player(id1, name1);
        players.add(p1);
        System.out.println("请输入第二位玩家的ID和姓名:");
        System.out.println("请输入ID");
        String id2=console.next(); 
        System.out.println("请输入姓名:");
        String name2=console.next();
        p2=new Player(id2, name2);
        players.add(p2);
        System.out.println("欢迎玩家:"+p1.name); 
        System.out.println("欢迎玩家:"+p2.name); 
     }
     
 //进行发牌
     public void distrubiteCard() {
        System.out.println("---------开始发牌------------"); 
        p1.pCards.add(cards.get(0));
        System.out.println("----玩家:"+p1.name+"-拿牌------");
        p2.pCards.add(cards.get(1));
        System.out.println("----玩家:"+p2.name+"-拿牌------");
        p1.pCards.add(cards.get(2));
        System.out.println("----玩家:"+p1.name+"-拿牌------");
        p2.pCards.add(cards.get(3));
        System.out.println("----玩家:"+p2.name+"-拿牌------");
        System.out.println("---------发牌结束------------"); 
     }
     
//开始游戏
     public void playGame() {
    System.out.println("--------开始游戏-----------");    
    Collections.sort(p1.pCards);     //对集合pCards进行排序
    Collections.sort(p2.pCards);
    p1max=p1.pCards.get(1);    
    p2max=p2.pCards.get(1);
    System.out.println(p1.name+"最大的手牌:"+p1max.type+p1max.num);   //输出玩家1的最大手牌
    System.out.println(p2.name+"最大的手牌:"+p2max.type+p2max.num);   //输出玩家2的最大手牌
    if(p1max.rank>p2max.rank)
        {  System.out.println("-----玩家"+p1.name+"获胜!-------");  }
    else    
        {  System.out.println("-----玩家"+p2.name+"获胜!--------");  }
    //输出玩家各自的手牌
    System.out.println("-------玩家各自的手牌为:----------");
    p1min=p1.pCards.get(0);
    p2min=p2.pCards.get(0);
    //打印两名玩家各自手上的两张牌
    System.out.println(p1.name+":"+p1max.type+p1max.num+","+p1min.type+p1min.num);
    System.out.println(p2.name+":"+p2max.type+p2max.num+","+p2min.type+p2min.num);
    System.out.println("--------游戏结束-----------");          
     }
     
//主函数    
    public static void main(String[] args) {
        CardDemo cd=new CardDemo();
        cd.CreatCard();          //创建扑克牌
        cd.washCard();           //洗牌
        cd.creatPlayer();        //创建玩家
        cd.distrubiteCard();     //进行发牌
        cd.playGame();           //开始游戏
    }

}


提问者:qq_冰柠檬_3 2018-09-04 16:07

个回答

  • _霞想_
    2018-09-10 19:25:39
    已采纳

    异常处理语句块并没有看到呢?


  • 慕斯6431273
    2019-07-29 19:30:02

    受到你的启发,写了出来。我觉得我的更好一点,而且跟视频的一样。

    package pick;


    public class Card implements Comparable<Card> {

        String num;

        String type;

        int  rank;    //rank代表等级,值越大,等级越高        

        public Card(String type,String num,int rank) {

            this.num=num;

            this.type=type;

            this.rank=rank;

        }    

        

        public Card() {

            

        }

        @Override

        public int compareTo(Card o) {

             

            return this.rank-o.rank;      //比较rank值的大小

        }


    }

    package pick;


    import java.util.ArrayList;

    import java.util.InputMismatchException;

    import java.util.List;

    import java.util.Random;

    import java.util.Scanner;


    public class Dala {



    public List<Card>pukepais;


    /**

    * 在构造器中初始化pukepais属性

    */

    public Dala(){

    this.pukepais=new ArrayList<Card>();

    }


    /**

    * 创建扑克牌

    */

    public void fapai(){

    System.out.println("-----------创建扑克牌---------------");

    String[] hu= {"方片","梅花","红桃","黑桃"};

    String[] ku = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

    int o=1;

    for(int i=0;i<13;i++){

    for(int t = 0;t<4;t++){

    Card yu=new Card(hu[t],ku[i],o);

    o++;

    pukepais.add(yu);

    }}

    }


    /**

    * 遍历

    */

    public void bianli(){

    System.out.println("-----------扑克牌创建成功---------------");

    for(int p=0;p<52;p++)

    System.out.print(pukepais.get(p).type+pukepais.get(p).num+","+pukepais.get(p).rank);


    }


    /**

    * 洗牌

    */

    public void xipai(){

    System.out.println("-----------开始洗牌---------------");

    for(int i=0;i<52;i++){

    Random ra = new Random();

    int t = ra.nextInt(51);

    Card y = pukepais.get(i);

    pukepais.remove(i);

    pukepais.add(i,pukepais.get(t));

    pukepais.remove(t);

    pukepais.add(t,y);

    }

    System.out.println("-----------洗牌结束---------------");

    for(int p=0;p<52;p++)

    System.out.print(pukepais.get(p).type+pukepais.get(p).num+",");


    }


    /**

    * 创建玩家

    */

    public void Wanjia(){

    System.out.println("-----------创建玩家---------------");

    Scanner c = new Scanner(System.in);

    //输入整数id

     boolean is = true;

     while (is) {

       System.out.println("请输入第一位玩家的id:");

       try {

           int id = c.nextInt();

           is = false;

       } catch (InputMismatchException e) {

           // TODO: handle exception

           System.out.println("请输入整数类型的ID!");

           //清空数据,使下一次可以输入

           c.next();

           is = true;

           continue;

       } catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

           break;

       }

    }

    System.out.println("请输入第一位玩家的姓名:");

    String name = c.next();

    is = true;

     while (is) {

       System.out.println("请输入第二位玩家的id:");

       try {

           int id2 = c.nextInt();

           is = false;

       } catch (InputMismatchException e) {

           // TODO: handle exception

           System.out.println("请输入整数类型的ID!");

           //清空数据,使下一次可以输入

           c.next();

           is = true;

           continue;

       } catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

           break;

       }

    }

    System.out.println("请输入第二位玩家的姓名:");

    String name2 = c.next();

    System.out.println("欢迎玩家:"+name);

    System.out.println("欢迎玩家:"+name2);

    //发牌

    System.out.println("-----------开始发牌--------------");

    Card[] hu1 = new Card[2];

    Card[] hu2 = new Card[2];

    Random ra = new Random();

    int x = 0;

    for(int i=51;i>47;i=i-2){

    int t = ra.nextInt(i);

    hu1[x] = pukepais.get(t);

    pukepais.remove(t);

    System.out.println("---玩家:"+name+"-拿牌");

    int y = ra.nextInt(i-1);

    hu2[x] = pukepais.get(y);

    pukepais.remove(y);

    System.out.println("---玩家:"+name2+"-拿牌");

    x++;

    }

    System.out.println("-----------发牌结束--------------");

    //开始游戏

    System.out.println("-----------开始游戏--------------");

    Card[] ui = new Card[2];

    if(hu1[0].rank>hu1[1].rank){

    ui[0] = hu1[0];

    System.out.println("玩家:"+name+"最大的手牌为:"+hu1[0].type+hu1[0].num);

    }else{ui[0] = hu1[1];System.out.println("玩家:"+name+"最大的手牌为:"+hu1[1].type+hu1[1].num);}

    if(hu2[0].rank>hu2[1].rank){

    ui[1] = hu2[0];

    System.out.println("玩家:"+name+"最大的手牌为:"+hu2[0].type+hu2[0].num);

    }else{ui[1] = hu2[1];System.out.println("玩家:"+name2+"最大的手牌为:"+hu2[1].type+hu2[1].num);}

    //获胜

    if(ui[0].rank>ui[1].rank){

    System.out.println("-----------玩家:"+name+"获胜!--------------");

    }else{System.out.println("-----------玩家:"+name2+"获胜!--------------");}

    }


    /**

    * @param args

    */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Dala mo = new Dala();

    mo.fapai();

    mo.bianli();

    mo.xipai();

    mo.Wanjia();

    }

    }


  • 慕斯6431273
    2019-07-29 19:28:36

    受到你的启发,写了出来。我觉得我的更好一点,而且跟视频的一样。

    package pick;


    public class Card implements Comparable<Card> {

        String num;

        String type;

        int  rank;    //rank代表等级,值越大,等级越高        

        public Card(String type,String num,int rank) {

            this.num=num;

            this.type=type;

            this.rank=rank;

        }    

        

        public Card() {

            

        }

        @Override

        public int compareTo(Card o) {

             

            return this.rank-o.rank;      //比较rank值的大小

        }


    }

    package pick;


    import java.util.ArrayList;

    import java.util.InputMismatchException;

    import java.util.List;

    import java.util.Random;

    import java.util.Scanner;


    public class Dala {


    /**

    * 用来承装学生类型的对象

    */

    public List<Card>pukepais;

    /**

    * 在构造器中初始化pukepais属性

    */

    public Dala(){

    this.pukepais=new ArrayList<Card>();

    }

    /**

    * 创建扑克牌

    */

    public void fapai(){

    System.out.println("-----------创建扑克牌---------------");

    String[] hu= {"方片","梅花","红桃","黑桃"};

    String[] ku = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

    int o=1;

    for(int i=0;i<13;i++){

    for(int t = 0;t<4;t++){

    Card yu=new Card(hu[t],ku[i],o);

    o++;

    pukepais.add(yu);

    }}

    }

    /**

    * 遍历

    */

    public void bianli(){

    System.out.println("-----------扑克牌创建成功---------------");

    for(int p=0;p<52;p++)

    System.out.print(pukepais.get(p).type+pukepais.get(p).num+","+pukepais.get(p).rank);

    }

    /**

    * 洗牌

    */

    public void xipai(){

    System.out.println("-----------开始洗牌---------------");

    for(int i=0;i<52;i++){

    Random ra = new Random();

    int t = ra.nextInt(51);

    Card y = pukepais.get(i);

    pukepais.remove(i);

    pukepais.add(i,pukepais.get(t));

    pukepais.remove(t);

    pukepais.add(t,y);

    }

    System.out.println("-----------洗牌结束---------------");

    for(int p=0;p<52;p++)

    System.out.print(pukepais.get(p).type+pukepais.get(p).num+",");

    }

    /**

    * 创建玩家

    */

    public void Wanjia(){

    System.out.println("-----------创建玩家---------------");

    Scanner c = new Scanner(System.in);

    //输入整数id

     boolean is = true;

     while (is) {

       System.out.println("请输入第一位玩家的id:");

       try {

           int id = c.nextInt();

           is = false;

       } catch (InputMismatchException e) {

           // TODO: handle exception

           System.out.println("请输入整数类型的ID!");

           //清空数据,使下一次可以输入

           c.next();

           is = true;

           continue;

       } catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

           break;

       }

    }

    System.out.println("请输入第一位玩家的姓名:");

    String name = c.next();

    is = true;

     while (is) {

       System.out.println("请输入第二位玩家的id:");

       try {

           int id2 = c.nextInt();

           is = false;

       } catch (InputMismatchException e) {

           // TODO: handle exception

           System.out.println("请输入整数类型的ID!");

           //清空数据,使下一次可以输入

           c.next();

           is = true;

           continue;

       } catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

           break;

       }

    }

    System.out.println("请输入第二位玩家的姓名:");

    String name2 = c.next();

    System.out.println("欢迎玩家:"+name);

    System.out.println("欢迎玩家:"+name2);

    //发牌

    System.out.println("-----------开始发牌--------------");

    Card[] hu1 = new Card[2];

    Card[] hu2 = new Card[2];

    Random ra = new Random();

    int x = 0;

    for(int i=51;i>47;i=i-2){

    int t = ra.nextInt(i);

    hu1[x] = pukepais.get(t);

    pukepais.remove(t);

    System.out.println("---玩家:"+name+"-拿牌");

    int y = ra.nextInt(i-1);

    hu2[x] = pukepais.get(y);

    pukepais.remove(y);

    System.out.println("---玩家:"+name2+"-拿牌");

    x++;

    }

    System.out.println("-----------发牌结束--------------");

    //开始游戏

    System.out.println("-----------开始游戏--------------");

    Card[] ui = new Card[2];

    if(hu1[0].rank>hu1[1].rank){

    ui[0] = hu1[0];

    System.out.println("玩家:"+name+"最大的手牌为:"+hu1[0].type+hu1[0].num);

    }else{ui[0] = hu1[1];System.out.println("玩家:"+name+"最大的手牌为:"+hu1[1].type+hu1[1].num);}

    if(hu2[0].rank>hu2[1].rank){

    ui[1] = hu2[0];

    System.out.println("玩家:"+name+"最大的手牌为:"+hu2[0].type+hu2[0].num);

    }else{ui[1] = hu2[1];System.out.println("玩家:"+name2+"最大的手牌为:"+hu2[1].type+hu2[1].num);}

    //获胜

    if(ui[0].rank>ui[1].rank){

    System.out.println("-----------玩家:"+name+"获胜!--------------");

    }else{System.out.println("-----------玩家:"+name2+"获胜!--------------");}

    }


    /**

    * @param args

    */

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Dala mo = new Dala();

    mo.fapai();

    mo.bianli();

    mo.xipai();

    mo.Wanjia();

    }

    }


  • HYi12
    2019-06-15 03:54:08

    作业的原意应该是先比较点数大小,如果点数相同,再比较花色,例如方片7是要大于黑桃2的

    但如果只是给Card类加一个rank属性的话,这种通过先后比较两个属性的方法,体现不出来,所以你的compareTo方法的重写还可以改一下,用个两层的if循环把num和type先后比较一下;或者也可以继续用rank,但创建扑克牌的时候顺序换一下

  • 木分慕粉
    2019-04-24 20:49:30

    rank的想法很好


  • 慕神4425055
    2019-03-13 17:32:13

    我Collection.sort方法报错用不了,说不适合List这种类型

  • 只想敲个代码
    2019-03-05 21:01:04

    我的发牌代码和你一样,但是不知道为什么会报空指针异常

  • qq_Bewusstsein_0
    2019-01-14 19:12:44

      Player player1=new Player(id1,name1);和  
      player1=new Player(id1,name1); 

     有什么区别吗?
    我用第二个就可以运行,第一个就报错 


  • qq_不过六级不改名i_opIMVZ
    2018-11-05 13:34:45

    我想问一下,在对两人手牌自己内部排序时使用了Collection.sort方法。传入的是集合Pcards,这个集合中的单个元素包含Card的三个属性,这里为什么默认的对rank属性进行的排序?求解

  • 慕丝8486895
    2018-09-19 16:16:34

    rank计算为何是 i*13+j 啊?

  • 宝慕林9160084
    2018-09-18 10:35:23

    扑克牌中的rank设置的不错,我一直不知道如何比较,对我很有帮助

  • Bad__Boy
    2018-09-09 00:03:40

    66666666666666666,膜拜大佬