发牌程序

引用:http://xiaolongfeixiang.iteye.com/blog/575921

共有4个文件组成:

1、Suit.java

2、Rank.java

3、Card.java

4、CardDeal.java

Suit.java用来定义牌的套数。ENUM中的排列顺序,决定了对Card排序时的优先级。

Java代码  收藏代码
  1. package app.xjtu;  
  2.   
  3. /** 
  4.  * 定义牌的套数,共有“桃”“杏”“梅花”“方块”四套 
  5.  */  
  6. public enum Suit {  
  7.     HEARTS("桃"),SPADES("杏"),CLUBS("梅花"),DIAMONDS("方块");  
  8.       
  9.     private String info;  
  10.       
  11.     Suit(String info){  
  12.         this.info = info;  
  13.     }  
  14.       
  15.     @Override  
  16.     public String toString() {  
  17.         return info;  
  18.     }  
  19. }  

Rank.java定义了每套牌的牌面。(这里省略了2张特殊的牌)。ENUM中的排列顺序,决定了对Card排序时的优先级。

Java代码  收藏代码
  1. package app.xjtu;  
  2.   
  3. /** 
  4.  * 定义每套牌的牌面 
  5.  */  
  6. public enum Rank{  
  7.   
  8.     ACE("A"),DEUCE("2"),THREE("3"),FOUR("4"),FIVE("5"),SIX("6"),SEVEN("7"),  
  9.     EIGHT("8"),NINE("9"),TEN("10"),JACK("J"),QUEEN("Q"),KING("K");  
  10.       
  11.   
  12.     private String info;  
  13.       
  14.     Rank(String info){  
  15.         this.info = info;  
  16.     }  
  17.       
  18.     @Override  
  19.     public String toString() {  
  20.         return info;  
  21.     }  
  22.       
  23. }  

Card.java定义了一张牌。

Java代码  收藏代码
  1. package app.xjtu;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class Card implements Comparable<Card> {  
  7.     private final Rank rank;  
  8.     private final Suit suit;  
  9.   
  10.     private Card(Rank rank, Suit suit) {  
  11.         this.rank = rank;  
  12.         this.suit = suit;  
  13.     }  
  14.   
  15.     private static final List<Card> protoDeck = new ArrayList<Card>();  
  16.   
  17.     /** 
  18.      * 完成对一副新扑克的制作 
  19.      */  
  20.     static {  
  21.         for (Suit suit : Suit.values()) {  
  22.             for (Rank rank : Rank.values()) {  
  23.                 protoDeck.add(new Card(rank, suit));  
  24.             }  
  25.         }  
  26.     }  
  27.   
  28.     /** 
  29.      * @return 返回一副整齐的扑克 
  30.      */  
  31.     public static ArrayList<Card> newDeck() {  
  32.         return new ArrayList<Card>(protoDeck);  
  33.     }  
  34.   
  35.     /** 
  36.      * 排序: 
  37.      * 1、不同级,按桃、杏、梅、方的顺序排列 
  38.      * 2、同级,则按A 2 3 4 5 6 7 8 9 10 J Q K的顺序排列  
  39.      */  
  40.     @Override  
  41.     public int compareTo(Card o) {  
  42.         if(this.equals(o)){  
  43.             return 0;  
  44.         }else{  
  45.             if(this.suit.equals(o.suit)){  
  46.                 return this.rank.compareTo(o.rank);  
  47.             }else{  
  48.                 return this.suit.compareTo(o.suit);  
  49.             }  
  50.         }  
  51.     }  
  52.   
  53.     @Override  
  54.     public boolean equals(Object obj) {  
  55.         if (obj instanceof Card) {  
  56.             Card other = (Card) obj;  
  57.             if (this.rank.equals(other.rank) && this.suit.equals(other.suit))  
  58.                 return true;  
  59.             else  
  60.                 return false;  
  61.         } else {  
  62.             return false;  
  63.         }  
  64.     }  
  65.       
  66.     @Override  
  67.     public String toString() {  
  68.         return this.suit+":"+this.rank;  
  69.     }  
  70. }  

CardDeal.java包装了对Card的基本操作:

Java代码  收藏代码
  1. package app.xjtu;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. public class CardDeal {  
  10.       
  11.     /** 
  12.      * 得到一副牌(可以是整齐的、也可以是洗过的) 
  13.      * @param shuffle 是否洗牌。 
  14.      * @return 一副牌 
  15.      */  
  16.     public static  List<Card> getProtoDeck(boolean shuffle){  
  17.         List<Card> deck =  Card.newDeck();  
  18.         if(shuffle){  
  19.             Collections.shuffle(deck);  
  20.         }  
  21.          return deck;  
  22.     }  
  23.   
  24.     /** 
  25.      * 对指定的牌,洗牌。 
  26.      * @param deck 要洗的牌 
  27.      */  
  28.     public static void shuffle(List<Card> deck){  
  29.         Collections.shuffle(deck);  
  30.     }  
  31.       
  32.     /** 
  33.      * 发牌给所有人。在牌数不均时,玩家序号大的,多得1张牌。 
  34.      * @param deck  所有的牌 
  35.      * @param n 参与的玩家 
  36.      * @return  玩家的序号和玩家的牌,所组成的Map类型。 
  37.      */  
  38.     public static Map<Integer, ArrayList<Card>> deal(List<Card> deck, int n) {  
  39.   
  40.         Map<Integer, ArrayList<Card>> map = new HashMap<Integer, ArrayList<Card>>();  
  41.   
  42.         int key = n;  
  43.         int deckSize = deck.size();  
  44.         // 每人至少有这么多的牌  
  45.         int perHand = (deckSize - 1) / n;  
  46.   
  47.         do {  
  48.             deckSize = deck.size();  
  49.             List<Card> handView = deck.subList(deckSize - perHand, deckSize);  
  50.             ArrayList<Card> hand = new ArrayList<Card>(handView);  
  51.             map.put(key, hand);  
  52.             handView.clear();  
  53.             key--;  
  54.         } while (key > 0);  
  55.   
  56.         // 发多余的牌  
  57.         for (int i = 0; i < deck.size(); i++) {  
  58.             map.get(n - i).add(deck.get(i));  
  59.         }  
  60.         return map;  
  61.     }  
  62.       
  63.     /** 
  64.      * 对一系列的Card进行排序 
  65.      * @param cards 要排序的Card集合 
  66.      */  
  67.     public static void sortCards(List<Card> cards){  
  68.         Collections.sort(cards);  
  69.     }  
  70. }  

测试程序:

Java代码  收藏代码
  1. package app.xjtu;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.Map.Entry;  
  7.   
  8. public class TestCard {  
  9.   
  10.     public static void main(String[] args) {  
  11.   
  12.         // 获得一副牌  
  13.         List<Card> deck = CardDeal.getProtoDeck(false);  
  14.         // 要求洗牌  
  15.         CardDeal.shuffle(deck);  
  16.         // 发牌  
  17.         Map<Integer,ArrayList<Card>> hands = CardDeal.deal(deck, 5);  
  18.         // 查看每个人的牌  
  19.           
  20.         for(Entry<Integer,ArrayList<Card>> hand : hands.entrySet()){  
  21.             // 排列得到的牌  
  22.             CardDeal.sortCards(hand.getValue());  
  23.             // 输出每个玩家的牌  
  24.             System.out.println("玩家 "+hand.getKey()+" : (共有"+hand.getValue().size()+")的牌 :");  
  25.             System.out.println(hand.getValue());  
  26.         }  
  27.     }  
  28.   
  29. }  

测试结果信息:

原文地址:https://www.cnblogs.com/sode/p/2507284.html