达内刘苍松老师的斗地主洗牌发牌算法 - (仅存回忆一点)


/**

* Player.java

*

*/

package com.tarena.day10.card;



import java.util.Arrays;


public class Player {
  private int id;
  private String name;
  private Card[] cards={};
  
  public Player() {
  }
  public Player(int id, String name) {
    this.id = id;
    this.name = name;
  }
  
  public void add(Card card){
    this.cards = Arrays.copyOf(cards, cards.length+1);
    cards[cards.length-1] = card;
  }
  
  public Card[] getCards() {
    return cards;
  }
  public void setCards(Card[] cards) {
    this.cards = cards;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String toString() {
    return id+" "+ name + Arrays.toString(cards); 
  }
  

}


package com.tarena.day10.card;
/** 扑克牌 */
public class Card {


  public static final int DIAMOND = 0; //方块(钻石)
  public final static int CLUB = 1; //梅花
  public static final int HEART = 2; //红桃(红心)
  public static final int SPADE = 3; //黑桃(花锄)
  public static final int JOKER = 4; //王


  public final static int THREE = 0;
  public final static int FOUR = 1;
  public final static int FIVE = 2;
  public final static int SIX = 3;
  public final static int SEVEN = 4;
  public final static int EIGHT = 5;
  public final static int NINE = 6;
  public final static int TEN = 7;
  public final static int JACK = 8;//J
  public final static int QUEEN = 9;//Q
  public final static int KING = 10;//K
  public final static int ACE = 11;//A
  public final static int DEUCE = 12; //2
  public final static int BLACK = 13; //小王
  public final static int COLOR = 14;//大王
  
  /** 花色 0代表方块, 1代表梅花, 2代表红桃, 3代表黑桃,4:王*/
  private int suit;
  /** 点数 规定: 0代表3, 1代表4, 2代表5,... */
  private int rank;
  public Card() {
  }
  public Card(int suit, int rank){
    //this.rank = rank;
    //this.suit = suit;
    setRank(rank);
    setSuit(suit);
  }
  public int getSuit(){
    return suit;
  }
  public void setSuit(int suit){
    if(suit<DIAMOND || suit>JOKER)
      throw new RuntimeException("花色超过范围!");
    this.suit = suit;
  }
  public int getRank(){
    return rank;
  }
  public void setRank(int rank){
    if(rank<THREE || rank>COLOR){
      throw new RuntimeException("点数超过范围!");
    }
    this.rank = rank;
  }
  private static final String[] RANK_NAMES = 
    {"3","4","5","6","7","8","9","10","J","Q","K",
      "A","2","小王","大王"};
  private static final String[] SUIT_NAMES = 
    {"方块","梅花","红桃","黑桃",""};
  //覆盖Object 类的toStirng() 方法. 实现对象的文本描述
  public String toString(){
    return SUIT_NAMES[suit]+RANK_NAMES[rank]; 
  }
  
  public boolean equals(Object obj) {
    if(obj==null){
      return false;
    }
    if(this==obj){
      return true;
    }
    if(obj instanceof Card){
      Card other = (Card)obj;
      return this.rank == other.rank &&
             this.suit == other.suit;
    }
    return false;
  }
  
  public int hashCode() {
    //return suit*100+rank;
    //suit=3= 00000000 00000000 00000000 00000011
    //rank=10=00000000 00000000 00000000 00000011
    //suit<<16=00000000 00000011 00000000 00000000
    //         00000000 00000011 00000000 00000011
    return (suit<<16)+rank;//(x<<16)+y
  }
}



package com.tarena.day10.card;
/**

* CardDemo.java

* 洗牌发牌 

/

import java.util.Arrays;
import java.util.Random;


public class CardDemo {
  public static void main(String[] args) {
    //Card card = new Card(3,0);
    //Card c = new Card(Card.SPADE, Card.THREE);
    Card[] cards = new Card[54];
    int i=0;
    for(int rank=Card.THREE; rank<=Card.DEUCE; rank++){
      cards[i++]=new Card(Card.DIAMOND, rank);
      cards[i++]=new Card(Card.HEART, rank);
      cards[i++]=new Card(Card.CLUB, rank);
      cards[i++]=new Card(Card.SPADE, rank);
    }
    cards[i++]=new Card(Card.JOKER, Card.BLACK);
    cards[i++]=new Card(Card.JOKER, Card.COLOR);
    System.out.println(Arrays.toString(cards)); 
    
    //洗牌(打乱算法) i 代表最后一张的位置, j代表前面某张的位置
    Random random = new Random();
    for(i=cards.length-1; i>0; i--){
      int j = random.nextInt(i);
      Card t = cards[i];
      cards[i] = cards[j];
      cards[j] = t;
    }
    System.out.println(Arrays.toString(cards)); 
    //发牌
    Player[] players = new Player[3];
    players[0] = new Player(1, "姜文");
    players[1] = new Player(2, "葛大爷");
    players[2] = new Player(3, "刘嘉玲");
    int index=0;
    for(i=0; i<cards.length; i++){
//      Card card = cards[i];
//      Player someone = players[index++%players.length];
//      someone.add(card);
      players[index++%players.length].add(cards[i]);
    }
    System.out.println(players[0].toString());
    System.out.println(players[1]);
    System.out.println(players[2]);
  }


}























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值