天天看點

JAVA-11.3-模拟鬥地主洗牌、發牌、并進行排序(集合)

  我們都知道一副撲克牌有54張,3,4,5,6,7,8,9,10,J,Q,K分别有”♥”,”♠”,”♣”,”♦”四種花色,還有大王、小王。這就構成了一副完整的撲克牌,現在我們要模拟鬥地主的洗牌,發牌,看牌,那麼我們該怎麼做呢?

  首先一看到洗牌,就會想到Collections.shuffle(),是以我們應該先用集合建立一副牌,然後進行洗牌,再進行看牌,代碼如下:

package com.edu01;

import java.util.ArrayList;
import java.util.Collections;

public abstract class PokerTest {
    public static void main(String[] args) {
        /**
         * 鬥地主:
         * 1.建立一副牌
         * 2.洗牌
         * 3.發牌
         * 4.看牌
         */
        //建立一副牌
        ArrayList<String> pokers =new ArrayList<String>();

        //給牌盒中添加元素
        String[] colors = {"♥","♠","♣","♦"};

        //建立點數
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        //将點數和花色進行拼接形成一副牌
        for(String color:colors){
            for(String number:numbers){
                pokers.add(color+number);
            }   
        }
        pokers.add("大王");
        pokers.add("小王");

        //洗牌列印一下這副牌
        Collections.shuffle(pokers);

        //發牌,發給三個集合
        ArrayList<String> zhangsan = new ArrayList<String>();
        ArrayList<String> lisi= new ArrayList<String>();
        ArrayList<String> wangwu= new ArrayList<String>();
        ArrayList<String> dipai= new ArrayList<String>();

        //發牌
        for (int i = ; i < pokers.size(); i++) {
            if (i>=pokers.size()-) {
                dipai.add(pokers.get(i));
            }else if (i%==) {
                zhangsan .add(pokers.get(i));
            }else if (i%==) {
                lisi.add(pokers.get(i));
            }else if (i%==) {
                wangwu.add(pokers.get(i));
            }
        }
        //看牌
        lookPoker("張三",zhangsan);
        lookPoker("李四",lisi);
        lookPoker("王五",wangwu);
        lookPoker("底牌",dipai);
    }

    private static void lookPoker(String name, ArrayList<String> arr) {
        System.out.print(name+"的牌是 :");
        for (int i = ; i < arr.size(); i++) {
            System.out.print(arr.get(i)+"  ");
        }
        System.out.println();
    }
}
/** 張三的牌是 :♣A  ♥J  ♦9  ♠3  ♦5  ♠10  ♥9  ♦J  ♦K  ♥3  ♦A  ♦Q  ♦4  ♥Q  ♥2  ♣4  ♥7  
    李四的牌是 :♦2  ♣9  ♥4  ♦10  ♣3  大王  ♣7  ♠2  ♣J  ♦7  ♣Q  ♠A  ♣10  ♥8  ♠Q  ♣8  ♠5  
    王五的牌是 :♠7  ♠6  ♥5  ♥10  小王  ♣5  ♠J  ♣6  ♦8  ♦6  ♥A  ♠8  ♦3  ♠4  ♥6  ♠K  ♥K  
    底牌的牌是 :♣2  ♠9  ♣K  
*/  
           

  但是這樣看到的牌都是亂序的,不符合我們打牌的習慣,那麼如何改進呢?聯想一下,如果牌都存在String數組中,那麼每張牌都有一個索引,如果可以對索引進行排序,同時與之對應的牌也就進行了排序,于是想到了:

  建立牌時,用HashMap存儲鍵值對,鍵是索引,值是撲克點數+花色

  同時用ArrayList存儲索引,用于洗牌;

  然後發牌,發完牌,要保證牌有序,是以每個玩家拿到的牌(索引)分别存儲到TreeSet集合;

  看牌時,利用map,通過TreeSet排序存儲的索引找到排好序的牌

  

package com.edu01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class PokerTest2 {
    public static void main(String[] args) {
        /**
         * 發牌并排序: 1.建立Map集合,鍵存索引,值存點數(3-2從小到大) 2.洗牌,建立ArrayList集合,存儲map集合的索引
         * 3.發牌,發索引 4.看牌,根據每一個擷取的索引取出對應的牌
         */
        // 建立雙列集合存儲鍵值對元素
        HashMap<Integer, String> hs = new HashMap<Integer, String>();

        // 建立List集合存儲索引,用于洗牌
        ArrayList<Integer> indexs = new ArrayList<Integer>();

        // 存儲元素
        // 給牌盒中添加元素
        String[] colors = { "♥", "♠", "♣", "♦" };

        // 建立點數
        String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
                "K", "A", "2" };

        //定義索引
        int index = ;
        for (String number : numbers) {
            for (String color : colors) {
                hs.put(index, (color+number));
                indexs.add(index);
                index++;
            }
        }
        indexs.add(index);
        hs.put(index, "小王");
        index++;
        indexs.add(index);
        hs.put(index, "大王");

        //洗牌(洗索引)
        Collections.shuffle(indexs);

        //發牌發索引,但是發完索引之後必須讓索引有序
        TreeSet<Integer> zhangsan = new TreeSet<Integer>();
        TreeSet<Integer> lisi = new TreeSet<Integer>();
        TreeSet<Integer> wangwu = new TreeSet<Integer>();
        TreeSet<Integer> dipai = new TreeSet<Integer>();

        for (int i = ; i < indexs.size(); i++) {
            if (i>=indexs.size()-) {
                dipai.add(indexs.get(i));
            }else if (i%==) {
                zhangsan.add(indexs.get(i));
            }else if (i%==) {
                lisi.add(indexs.get(i));
            }else if (i%==) {
                wangwu.add(indexs.get(i));
            }   
        }

        //看牌
        lookPoker("張三",zhangsan,hs);
        lookPoker("李四",lisi,hs);
        lookPoker("王五",wangwu,hs);
        lookPoker("底牌",dipai,hs);
    }

    private static void lookPoker(String name, TreeSet<Integer> set,
            HashMap<Integer, String> map) {
        //根據擷取到的索引,取出牌
        System.out.print(name+"的牌:  ");
        for (Integer index : set) {
            System.out.print(map.get(index)+"  ");
        }
        System.out.println();
    }
}
/** 張三的牌:  ♣4  ♠5  ♣6  ♠7  ♣8  ♦8  ♣9  ♦9  ♠J  ♦J  ♥Q  ♠Q  ♦Q  ♥K  ♦K  ♥2  小王  
    李四的牌:  ♦3  ♥4  ♠4  ♦4  ♥5  ♦5  ♠6  ♣7  ♠8  ♥10  ♠10  ♦10  ♣J  ♠K  ♣A  ♠2  ♣2  
    王五的牌:  ♥3  ♠3  ♣3  ♣5  ♥6  ♦6  ♥7  ♥8  ♥9  ♠9  ♣10  ♥J  ♣Q  ♣K  ♥A  ♦A  ♦2  
    底牌的牌:  ♦7  ♠A  大王  
*/
           

繼續閱讀