天天看點

模拟鬥地主發牌洗牌看牌

案例: 模拟鬥地主發牌

需求:使用一個集合對象存儲一副撲克牌。将所有撲克牌的順序打亂,然後分發給用集合表示的三個玩家和底牌,并列印玩家和底牌的集合内容

步驟:1.買一副撲克牌

​ 将花色和數字分别進行組合,生成所有的普通牌,手動添加“大王”、“小王”。

​ 2.洗牌

​ 使用Collections工具類的shuffle()方法打亂牌的順序

​ 3.發牌

​ 周遊牌堆,将每一張牌分發到三個玩家集合中

​ 4.看牌

​ 分别列印每個玩家集合的内容

步驟一 :買一副撲克牌

分析:

​ 1.建立數字數組:

```java
           

String[] nums = {“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”};

```

​ 2.建立花色數組:

​ 3.将每個花色分别和數字進行拼接

package cn.itcast.demo17;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
需求:模拟鬥地主發牌
     步驟:
         1.買牌
         2.洗牌
         3.發牌
         4.看牌
 */
public class SendPokerTest {
    public static void main(String[] args) {
    //1.買牌
    //1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
        Map<Integer,String> pokers = new HashMap<>();
    //1.2定義一個單列集合,用來存儲所有牌的編号
        List<Integer> list = new ArrayList<>();
        //1.3具體的買牌操作
    //普通牌:52
        String[] colors = {"紅桃","黑桃","梅花","方塊"};
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        int num = 0;//表示牌的編号
        //通過循環嵌套 造普通牌
        //外循環一次,内循環一圈
        for (String number:numbers){
            //外循環擷取所有的點數
            for (String color:colors){
                //内循環擷取所有的花色
                String poker = color + number;
               //将牌的編号,具體的牌放到雙列集合中
                pokers.put(num,poker);
                //将牌的編号放到單列集合中
                list.add(num);

                //每添加一張牌,編号要自增
                num++;
            }

        }


    //大小王
        //添加小王
        pokers.put(num,"小王");
        list.add(num++);
        //添加大王
        pokers.put(num,"大王");
        list.add(num++);

    //列印牌
        System.out.println("所有的牌:" + pokers);
        System.out.println("牌的編号:" + list);
    }
}

           

步驟二、三:洗牌和發牌

分析:

​ 1.使用Collections工具類的shuffle()方法打亂牌堆集合的順序

​ 2.分别建立三個玩家集合對象和底牌集合對象

​ 3.周遊牌堆的每一張牌,分别将索引對3取模的值為0,1,2的牌存放到三個玩家集合中,将最後三張存放到底牌集合中

package cn.itcast.demo17;

import java.util.*;

/*
需求:模拟鬥地主發牌
     步驟:
         1.買牌
         2.洗牌
         3.發牌
         4.看牌
 */
public class SendPokerTest {
    public static void main(String[] args) {
        //1.買牌
        //1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
        Map<Integer, String> pokers = new HashMap<>();
        //1.2定義一個單列集合,用來存儲所有牌的編号
        List<Integer> list = new ArrayList<>();
        //1.3具體的買牌操作
        //普通牌:52
        String[] colors = {"紅桃", "黑桃", "梅花", "方塊"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int num = 0;//表示牌的編号
        //通過循環嵌套 造普通牌
        //外循環一次,内循環一圈
        for (String number : numbers) {
            //外循環擷取所有的點數
            for (String color : colors) {
                //内循環擷取所有的花色
                String poker = color + number;
                //将牌的編号,具體的牌放到雙列集合中
                pokers.put(num, poker);
                //将牌的編号放到單列集合中
                list.add(num);

                //每添加一張牌,編号要自增
                num++;
            }

        }


        //大小王
        //添加小王
        pokers.put(num, "小王");
        list.add(num++);
        //添加大王
        pokers.put(num, "大王");//添加完大王就是最後一張牌了不需要加加
        list.add(num);

        //列印牌
        System.out.println("所有的牌:" + pokers);
        System.out.println("牌的編号:" + list);

        //2.洗牌
        Collections.shuffle(list);
        System.out.println("洗好牌後,編号為:" + list);
        //3.發牌
        //3.1定義4個集合,分别表示3個玩家,底牌
        List<Integer> qiaofeng = new ArrayList<>();
        List<Integer> xuzhu = new ArrayList<>();
        List<Integer> duanyu = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //3.2具體的發牌動作,将索引和3取模,決定發給誰
        for (int i = 0; i < list.size(); i++) {
            //擷取編号
            Integer pokerNum = list.get(i);
            System.out.println(pokerNum);
            if (i >= list.size() - 3) {
                //底牌
                dipai.add(pokerNum);
            } else if (i % 3 == 0) {
                qiaofeng.add(pokerNum);
            } else if (i % 3 == 1) {
                xuzhu.add(pokerNum);
            } else if (i % 3 == 2) {
                duanyu.add(pokerNum);
            }
        }
                //3.3檢視玩家,底牌的編号
                System.out.println("qiaofeng: " + qiaofeng);
                System.out.println("xuzhu: " + xuzhu);
                System.out.println("duanyu: " + duanyu);
                System.out.println("dipai: " + dipai);
           }
        }


           

步驟四:看牌

分析:

​ 1.将玩家集合中的牌按自然順序進行排序

```java
           

Collections.sort(List);

```

​ 2.列印玩家集合中的牌

​ 3.重複上面的操作列印所有玩家的牌和底牌

package cn.itcast.demo17;

import javax.print.attribute.EnumSyntax;
import java.util.*;

/*
需求:模拟鬥地主發牌
     步驟:
         1.買牌
         2.洗牌
         3.發牌
         4.看牌
 */
public class SendPokerTest {
    public static void main(String[] args) {
        //1.買牌
        //1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
        Map<Integer, String> pokers = new HashMap<>();
        //1.2定義一個單列集合,用來存儲所有牌的編号
        List<Integer> list = new ArrayList<>();
        //1.3具體的買牌操作
        //普通牌:52
        String[] colors = {"紅桃", "黑桃", "梅花", "方塊"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int num = 0;//表示牌的編号
        //通過循環嵌套 造普通牌
        //外循環一次,内循環一圈
        for (String number : numbers) {
            //外循環擷取所有的點數
            for (String color : colors) {
                //内循環擷取所有的花色
                String poker = color + number;
                //将牌的編号,具體的牌放到雙列集合中
                pokers.put(num, poker);
                //将牌的編号放到單列集合中
                list.add(num);

                //每添加一張牌,編号要自增
                num++;
            }

        }


        //大小王
        //添加小王
        pokers.put(num, "小王");
        list.add(num++);
        //添加大王
        pokers.put(num, "大王");//添加完大王就是最後一張牌了不需要加加
        list.add(num);

        //列印牌
        System.out.println("所有的牌:" + pokers);
        System.out.println("牌的編号:" + list);

        //2.洗牌
        Collections.shuffle(list);
        System.out.println("洗好牌後,編号為:" + list);
        //3.發牌
        //3.1定義4個集合,分别表示3個玩家,底牌
        List<Integer> qiaofeng = new ArrayList<>();
        List<Integer> xuzhu = new ArrayList<>();
        List<Integer> duanyu = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //3.2具體的發牌動作,将索引和3取模,決定發給誰
        for (int i = 0; i < list.size(); i++) {
            //擷取編号
            Integer pokerNum = list.get(i);
            System.out.println(pokerNum);
            if (i >= list.size() - 3) {
                //底牌
                dipai.add(pokerNum);
            } else if (i % 3 == 0) {
                qiaofeng.add(pokerNum);
            } else if (i % 3 == 1) {
                xuzhu.add(pokerNum);
            } else if (i % 3 == 2) {
                duanyu.add(pokerNum);
            }
        }
                //3.3檢視玩家,底牌的編号
               /* System.out.println("qiaofeng: " + qiaofeng);
                System.out.println("xuzhu: " + xuzhu);
                System.out.println("duanyu: " + duanyu);
                System.out.println("dipai: " + dipai);*/
        System.out.println("================================");
        //4.檢視具體的編号
        /*String str = printPoker(qiaofeng,pokers);

        System.out.println("qiaofeng: " + str);*/
        //下面的是上面注釋了的代碼的優化

        System.out.println("qiaofeng: " + printPoker(qiaofeng,pokers));
        System.out.println("xuzhu: " + printPoker(xuzhu,pokers));
        System.out.println("duanyu: " + printPoker(duanyu,pokers));
        System.out.println("dipai: " + printPoker(dipai,pokers));

           }
           /*
           4.定義一個方法,用來看牌
                方法名:printPoker
                參數清單:List<Integer>,Map<Integer,String>
                傳回值:String
            */
    public static String printPoker(List<Integer>nums,Map<Integer,String>pokers){
        //1.對牌的編号進行升序排列
        Collections.sort(nums);


        //2.周遊牌的編号集合,擷取到每一個編号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            //num就是要查找的具體牌的編号
            //3.根據編号去雙列集合中查找該編号對應的具體牌
            String poker = pokers.get(num);

            //4.将擷取到的牌進行拼接
            sb.append(poker + " ");



        }


        //5.将最後拼接結果傳回即可
        String str = sb.toString();
        return str.trim();//去掉首尾空格



    }

        }