1. 程式人生 > 實用技巧 >java集合案例--模擬鬥地主

java集合案例--模擬鬥地主

案例:模擬鬥地主發牌
需求:使用一個集合物件儲存一副撲克牌,將所有撲克牌的順序打亂,然後分發給用集合表示的三個
玩家和底牌,並列印玩家和底牌的集合內容
步驟
1.買牌 四個花,52張牌。
將花色和數字分別進行組合,生成所有的普通牌,手動新增“小王”,“大王”
2.洗牌和發牌
使用Collections攻擊類的shuffle()方法打亂牌的順序
3.看牌
遍歷牌推,將每一張牌分發到三個玩家集合中
留三張作為底牌
4.看牌
分別列印每個玩家集合的內容

1.買牌
  花色和數字分別進行組合,生成所有的普通牌,手動新增“小王”,“大王”
//1.買牌
        //1.1定義一個雙列集合,鍵:表示牌的編號   值:表示具體的牌   規則,編號越小,牌越小
Map<Integer,String> map = new HashMap<>(); //1.2定義一個單列集合,用來儲存所有牌的編號 List<Integer> list = new ArrayList<>(); //1.3定義兩個陣列用來放牌 String[] colors = {"♥","♠","♦","♣"}; //花色 String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //
//1.3用迴圈巢狀,獲取每一張牌(一個花色有四張牌) int num = 0; for (String number : nums) { //外迴圈一次,內迴圈一圈 外迴圈:獲取所有的牌 for (String color : colors) { //內迴圈: 獲取所有的花色 String poker = number+color; //拼接字串 map.put(num,poker); //新增到雙列集合中 list.add(num); //
新增到單列集合中 num++; //編號自增一 } } map.put(num,"小王"); //新增小王 list.add(num++); //先運算 在自增 map.put(num,"大王"); //新增大王 list.add(num++); //先運算 在自增 System.out.println("所有的牌:"+map); System.out.println("所有的編號:"+ list);

2.洗牌和發牌

洗牌
2.1使用Collections攻擊類的shuffle()方法打亂牌的順序
2.2分別建立三個玩家集合物件和底牌集合物件
2.3遍歷牌推的每一張牌,分別將索引對3取模的值為0,1,2的牌存放到三個玩家集合中,將最後三張存放到底牌集合中
發牌
遍歷牌推,將每一張牌分發到三個玩家集合中
留三張作為底牌
 //2.洗牌
        Collections.shuffle(list); // 打亂單列集合中的編號
        System.out.println("洗好牌以後,編號為:"+list);
        //3.發牌
        //3.1建立四個玩家集合,一個集合存放底牌,三個玩家
        List duanyu = new ArrayList();
        List guojing = new ArrayList();
        List yasuo = new ArrayList();
        List dipai = new ArrayList();
        //3.2具體的發牌動作,將所有和3取模,決定發給誰
        for (int i = 0; i <list.size() ; i++) {
            Integer polerNum = list.get(i);  //獲取編號
            if(i<3){
                dipai.add(polerNum);
            }else if(i%3==0){
                duanyu.add(polerNum);
            }else if(i%3==1){
                guojing.add(polerNum);
            }else if(i%3==2){
                yasuo.add(polerNum);
            }
        }
//        System.out.println("底牌為:"+ dipai);
//        System.out.println("yasuo的牌:" + yasuo);

3.看牌

    1.將玩家集合中的牌按自然順序進行排序 :Collections.sort(List)
2.列印玩家集合中的牌
3.重複上面的操作列印所有玩家的牌和底牌
        //4.看牌
        //定義一個方法,用來看牌
            //方法名:printpoKer
            //引數列表 List<Integer>,Map<Integer,String>
            //返回值:String
        System.out.println("yasuo的牌為:"+printPoker(yasuo,map));
        System.out.println("guojing的牌為:"+printPoker(guojing,map));
        System.out.println("duanyu的牌為:"+printPoker(duanyu,map));
        System.out.println("底牌為:"+printPoker(dipai,map));
    }
    //看牌的方法
    public static String printPoker(List<Integer> nums, Map<Integer,String> pokers){
        //1.對牌的編號進行升序排列
        Collections.sort(nums);
        //2.遍歷牌的編號集合,獲取到每一個編號
        StringBuffer sb = new StringBuffer();
        for (Integer num : nums) {
            //num就是要查詢的具體牌,編號
        //3.根據編號到雙列集合中查詢該編號對應的具體牌
            String poker=pokers.get(num);
         //4.將獲取到的牌進行拼接
            sb.append(poker+ " ");
        }
        //5.將最後拼接結果返回即可
        String str = sb.toString();  //因為要返回的是字串, 所以需要轉換成字串
        return str.trim();    //去除首尾的空格
    }
}