zoukankan      html  css  js  c++  java
  • 发牌程序

    引用: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. }  

    测试结果信息:

  • 相关阅读:
    Java字符串的常用方法
    鼠标移小图片大图片改变
    js获得ul li 下的img的src属性
    移动端左右滑动导航
    边框加阴影
    移动端网站根据设计稿动态设置rem
    使用git命令
    HTML返回顶部
    java对象头
    Flutter 实现酷炫的3D效果
  • 原文地址:https://www.cnblogs.com/sode/p/2507284.html
Copyright © 2011-2022 走看看