问答详情
源自: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();           //开始游戏
    }

}


我不太明白为什么在CardDemo类中要重写他的无参构造方法。里面定义了两个集合,这是干什么的?

就是这一段: public CardDemo() {
        
        this.cards=new ArrayList<Card>();
        this.players=new ArrayList<Player>();
    }   

提问者:qq_不过六级不改名i_opIMVZ 2018-11-05 14:28

个回答

  • qq_不过六级不改名i_opIMVZ
    2018-11-05 14:41:55

    构造方法在构造时构造了一个对象,这个对象包含该类的所有属性。但是List无法直接初始化,需要通过他的实现类ArrayList进行实例化,所以在该无参构造函数中需要对List进行实例化?

    我修改了一下代码,在声明List时直接就进行了实例化,即List<Card>cards=new ArrayList();

    List<Player>palyers=new ArrayList();

    然后我把里面的无参构造器注释掉,发现程序可以正常运行。

    那他这个无参构造器添加的这两句其实是相当于额外加上去的,这样理解吗?