1. 程式人生 > >模擬鬥地主真人線上發牌

模擬鬥地主真人線上發牌

模擬鬥地主真人線上發牌

前言

要鬥地主先得有牌吧,沒牌鬥個雞毛,所以先讓廠家生產一副撲克牌。然後呢,哥們三個今天想鬥地主了,你得去超市買一副 嶄新 的撲克牌吧。這樣就可以進入玩耍階段了,先得洗牌,後摸牌,在把最後三張牌壓箱底,好了這樣就開始展現技藝了.....

我們現在用java集合的知識模擬鬥地主的發牌,和上述流程是一模一樣的。

設計過程

  • 造一副撲克

    一副撲克有54張牌,有四種花色,從A到K,還有大小王。先定義一個nums集合來裝撲克牌的數字,然後定義一個color集合裝四種花色,保證它們的新增順序選擇ArrayList集合

    //用num表示撲克牌中的數字
    ArrayList<String> nums = new ArrayList<>();       Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");
    //用color表示撲克牌中的花色
    ArrayList<String> colors = new ArrayList<>();
    Collections.addAll(colors, "紅桃","梅花","黑桃","方片");

    把花色和數字拼裝在一起,需要一個Map來表示一個關係對,同時給每張牌定個序號,後面直接可以用序號操作牌

    //製造一副撲克牌(將數字和花色組合起來)
    Map<Integer,String> cards = new HashMap<>();
    int index = 0; ///給每個撲克牌定個序號index
    for(String number : nums){
        for(String color : colors){
            cards.put(index++, color + number);
        }
    }
  • 買一副嶄新的撲克牌

    新的撲克牌肯定是按照序號排好的,所以我們把序號裝在一個集合中

    //買一副新的撲克牌來玩耍
    ArrayList<Integer> card = new ArrayList<>();
    for(int i = 0; i <= 53; i++){//初始化牌的序號
        card.add(i);
    }
  • 洗牌

    洗牌也就是把card集合中的所儲存的序號打亂,集合的工具類Collections中有一個方法shuffle可以完成

    Collections.shuffle(card);
  • 發牌

    這時候肯定得有三個玩家啊,我們建立是三個玩家,玩家其實也就是撲克牌序號的一個引用,為了簡單建立一個Integer型別的,另外,為了把牌到時候可以拍個序,這時候可以用到TreeSet集合儲存,它預設自然排序。底牌也可以這樣儲存。

    TreeSet<Integer> player1 = new TreeSet<>();
    TreeSet<Integer> player2 = new TreeSet<>();
    TreeSet<Integer> player3 = new TreeSet<>();
    //拿出三張牌當做底牌
    TreeSet<Integer> itcards = new TreeSet<>();

    發牌演算法就是用牌的序號模上3,等於0發給一個人,等於1發給另外一個人,把最後三張當做底牌

    for(int i = 0; i < card.size(); i++){
        if(i >= card.size() - 3){//把後三張牌當做底牌
            itcards.add(card.get(i));
        }else if(i % 3 == 0){
            player1.add(i);
    
        }else if(i % 3 == 1){
            player2.add(card.get(i));
    
        }else{
            player3.add(card.get(i));
        }
    }
  • 展示牌

    我們可以看到,其實玩家和底牌也就是打亂的54個序號組成的,並且一個序號對應的是一張撲克牌,所以玩家其實就相當於是撲克牌Map中的key,而value就是撲克牌的名字了。所以遍歷玩家這個TreeSet集合,找到Map中的key,根據key很容易找到value。

原始碼

public class CardsGame {
    public static void main(String[] args) {
        //用num表示撲克牌中的數字
        ArrayList<String> nums = new ArrayList<>();
        Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");
        
        //用color表示撲克牌中的花色
        ArrayList<String> colors = new ArrayList<>();
        Collections.addAll(colors, "紅桃","梅花","黑桃","方片");
        
        //製造一副撲克牌(將數字和花色組合起來)
        Map<Integer,String> cards = new HashMap<>();
        int index = 0; ///給每個撲克牌定個序號index
        for(String number : nums){
            for(String color : colors){
                cards.put(index++, color + number);
            }
        }
        //再把大小王加上,一副完整的撲克就ok了
        cards.put(index++, "大王");
        cards.put(index++, "小王");
        
        //買一副新的撲克牌來玩耍
        ArrayList<Integer> card = new ArrayList<>();
        for(int i = 0; i <= 53; i++){//初始化牌的序號
            card.add(i);
        }
        
        //愉快的玩耍
        //洗牌
        Collections.shuffle(card);

        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();
        //拿出三張牌當做底牌
        TreeSet<Integer> itcards = new TreeSet<>();
        
        //發牌
        for(int i = 0; i < card.size(); i++){
            if(i >= card.size() - 3){//把後三張牌當做底牌
                itcards.add(card.get(i));
            }else if(i % 3 == 0){
                player1.add(i);
                
            }else if(i % 3 == 1){
                player2.add(card.get(i));
                
            }else{
                player3.add(card.get(i));
            }
        }
        
        //排序並列印每個人得到的牌
        print("張三",player1,cards);
        print("李四",player2,cards);
        print("王五",player3,cards);
        print("底牌",itcards,cards);
    }


    private static void print(String name, TreeSet<Integer> player, Map<Integer, String> cards) {
        System.out.print(name + ": ");
        //得到三個玩家的牌和底牌
        for(Integer index : player){
            String result = cards.get(index);
            System.out.print(result + " ");
        }
        System.out.println( );
    }
}