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 pokers =new ArrayList();

        //给牌盒中添加元素
        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 zhangsan = new ArrayList();
        ArrayList lisi= new ArrayList();
        ArrayList wangwu= new ArrayList();
        ArrayList dipai= new ArrayList();

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

    private static void lookPoker(String name, ArrayList arr) {
        System.out.print(name+"的牌是 :");
        for (int i = 0; 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 hs = new HashMap();

        // 创建List集合存储索引,用于洗牌
        ArrayList indexs = new ArrayList();

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

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

        //定义索引
        int index = 0;
        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 zhangsan = new TreeSet();
        TreeSet lisi = new TreeSet();
        TreeSet wangwu = new TreeSet();
        TreeSet dipai = new TreeSet();

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

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

    private static void lookPoker(String name, TreeSet set,
            HashMap 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  大王  
*/

你可能感兴趣的:(JAVA学习笔记)