1. 程式人生 > 其它 >集合之鬥地主案例

集合之鬥地主案例

 1 package com.Lucky.AppUnit;
 2 
 3 /**
 4  * 開啟App入口
 5  */
 6 public class App {
 7     public static void main(String[] args) {
 8        // new startGame();
 9 //        new InnerGame();
10 //        new overGame();
11         new valuesGame();
12     }
13 }
package com.Lucky.AppUnit;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
/*
初級版
 */
public class startGame {
        //1.準備一副撲克牌
       static ArrayList<String> house=new ArrayList<>();  //撲克牌盒子

       //利用程式碼塊載入:與類一起載入,只加載一次
    static{
        //定義花色
           String[] huase={"♠","♥","♦","♣"};
       //定義牌面數字
           String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};


           //方法一:用for迴圈遍歷新增不同花色的撲克牌
           for (int i = 0; i < huase.length; i++) {
               //遍歷新增同一花色的撲克牌
               for (int j = 0; j < num.length; j++) {
                   house.add(huase[i]+num[j]);
               }
           }

         //方法二:用增強for迴圈新增資料
//           for (String s : huase) {
//               for (String n : num) {
//                   house.add(s+n);
//               }
//           }

           //還有大王和小王
           house.add("大王");
           house.add("小王");
       }


    public startGame() {
       /// System.out.println(house);
        //2.  洗牌
        Collections.shuffle(house);
      //  System.out.println(house);
        //3.發牌
         ArrayList<String> lord=new ArrayList<>();  //底牌
         ArrayList<String> player1=new ArrayList<>();
         ArrayList<String> player2=new ArrayList<>();
         ArrayList<String> player3=new ArrayList<>();


        for (int i = 0; i < house.size(); i++) {
           String val= house.get(i);
            if(i<3){ //前三張牌作為底牌
                lord.add(val);
                continue;  //跳出本次迴圈,進入下次迴圈
            }

            //底牌完成之後,輪流發牌
            if(i%3==0){  //發牌給第一個人
                player1.add(val);
            }else if(i%3==1){  //發牌給第二個人
                player2.add(val);
            }else if(i%3==2){//發牌給第三個人
                player3.add(val);
            }
        }

        //看牌
        lookPoker("底牌",lord);
        lookPoker("唯易",player1);
        lookPoker("大帥哥",player2);
        lookPoker("SB",player3);

    }

    public void lookPoker(String name,ArrayList<String> lists){
        lists.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println();
        System.out.print(name+"的牌=");
        for (String list : lists) {
            System.out.print(list+"\t");
        }
    }
}

  

package com.Lucky.AppUnit;
import java.util.*;

/*
中級版 :利用指定序號排序
 */
public class InnerGame {
        //1.準備一副撲克牌
       static HashMap<Integer,String> map=new HashMap<>();   //牌盒
       static ArrayList<Integer> ArrList=new ArrayList<>();  //裝序號的盒子

       //利用程式碼塊載入:與類一起載入,只加載一次
    static{
        //定義花色
           String[] huase={"♠","♥","♦","♣"};
       //定義牌面數字
           String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};


          int index=1;   //牌的序號
           //遍歷新增牌
           for (String s : num) {
               //遍歷新增牌的數字
               for (String n : huase) {
                   //新增牌的花色
                   map.put(index,n+s);  //序號以及牌
                   index++;
               }
           }

           //還有大王 /小王
           map.put(index,"小王");
           index++;
           map.put(index,"大王");

       }


    public InnerGame() {
//        System.out.println(map);
        //1.將牌盒序號加入 ArrList 集合
        Set<Integer> integers = map.keySet();
        for (Integer in : integers) {
            ArrList.add(in);
        }

        //2.打亂順序【洗牌】
        Collections.shuffle(ArrList);


        //發牌跟準備各自的牌集合
        ArrayList<Integer> lord=new ArrayList<>();
        ArrayList<Integer> palyer1=new ArrayList<>();
        ArrayList<Integer> palyer2=new ArrayList<>();
        ArrayList<Integer> palyer3=new ArrayList<>();



        for (int i = 0; i < ArrList.size(); i++) {
           int num= ArrList.get(i);
            if(i<3){  //底牌
                lord.add(num);
                continue;
            }

            //輪流發牌給三個人
            if(i%3==0){
                palyer1.add(num);
            }else if(i%3==1){
                palyer2.add(num);
            }else if(i%3==2){
                palyer3.add(num);
            }
        }

        //看牌
        lookPoker("地主",lord);  //底牌
        lookPoker("唯易",palyer1);  //玩家1
        lookPoker("大帥哥",palyer2);  //玩家2
        lookPoker("大SB",palyer3);  //玩家3
    }

    public void lookPoker(String name,ArrayList<Integer> lists){
        //再將lists集合中的數字排序
        lists.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });
        //將序號的資料經過map遍歷獲取到值,新增到集合中
        ArrayList<String> New=new ArrayList<>();


        System.out.println();
        System.out.print(name+"的牌=");
        //根據鍵遍歷map集合來獲取相對應的值
        Set<Map.Entry<Integer, String>> entries = map.entrySet();

        for (Integer list : lists) {
            for (Map.Entry<Integer, String> entry : entries) {
                Integer key = entry.getKey();
                String value = entry.getValue();
                if(key==list){
                    New.add(value);
                }
            }
        }

        for (String s : New) {
            System.out.print(s+"\t");
        }
    }
}

  

package com.Lucky.AppUnit;
import java.util.*;

/*
中級版 :利用指定序號排序【簡化寫法】
 */
public class overGame {
        //1.準備一副撲克牌
       static HashMap<Integer,String> map=new HashMap<>();   //牌盒
       static ArrayList<Integer> ArrList=new ArrayList<>();  //裝序號的盒子

       //利用程式碼塊載入:與類一起載入,只加載一次
    static{
        //定義花色
           String[] huase={"♠","♥","♦","♣"};
       //定義牌面數字
           String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};


          int index=1;   //牌的序號
           //遍歷新增牌
           for (String s : num) {
               //遍歷新增牌的數字
               for (String n : huase) {
                   //新增牌的花色
                   map.put(index,n+s);  //序號以及牌
                   index++;
               }
           }

           //還有大王 /小王
           map.put(index,"小王");
           index++;
           map.put(index,"大王");

       }


    public overGame() {
//        System.out.println(map);
        //1.將牌盒序號加入 ArrList 集合
        Set<Integer> integers = map.keySet();
        for (Integer in : integers) {
            ArrList.add(in);
        }

        //2.打亂順序【洗牌】
        Collections.shuffle(ArrList);


        //發牌跟準備各自的牌集合【TreeSet集合有排序的作用】
        TreeSet<Integer> lord=new TreeSet<>();
        TreeSet<Integer> palyer1=new TreeSet<>();
        TreeSet<Integer> palyer2=new TreeSet<>();
        TreeSet<Integer> palyer3=new TreeSet<>();



        for (int i = 0; i < ArrList.size(); i++) {
           int num= ArrList.get(i);
            if(i<3){  //底牌
                lord.add(num);
                continue;
            }

            //輪流發牌給三個人
            if(i%3==0){
                palyer1.add(num);
            }else if(i%3==1){
                palyer2.add(num);
            }else if(i%3==2){
                palyer3.add(num);
            }
        }

        //看牌
        lookPoker("地主",lord);  //底牌
        lookPoker("唯易",palyer1);  //玩家1
        lookPoker("大帥哥",palyer2);  //玩家2
        lookPoker("大SB",palyer3);  //玩家3
    }

    public void lookPoker(String name,TreeSet<Integer> lists){
        //將序號的資料經過map遍歷獲取到值,新增到集合中
        ArrayList<String> New=new ArrayList<>();

        System.out.println();
        System.out.print(name+"的牌=");
        for (Integer list : lists) {
            String val = map.get(list);  //根據鍵獲取相對應的值
            New.add(val);  //將值新增到New集合中

        }
        for (String s : New) {  //遍歷New集合輸出牌
            System.out.print(s+"\t");
        }
    }
}

  

package com.Lucky.AppUnit;
import java.util.*;

/*
高階版 :利用自定義價值排序
 */
public class valuesGame {
        //1.準備一副撲克牌
       static ArrayList<String> array=new ArrayList<>();   //牌盒
       static TreeMap<String,Integer> List=new TreeMap<>();  //自定義價值盒子

       //利用程式碼塊載入:與類一起載入,只加載一次
    static{
        //定義花色
           String[] huase={"♠","♥","♦","♣"};
       //定義牌面數字
           String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};


           //遍歷新增牌
           for (String s : num) {
               //遍歷新增牌的數字
               for (String n : huase) {
                   //新增牌的花色
                   array.add(n+s);  //序號以及牌
               }
           }

           //還有大王 /小王
           array.add(" 小王"); //前面的空格是用於統一擷取字串的要求
           array.add(" 大王");

       }


    public valuesGame() {
        List.put("J",20);
        List.put("Q",21);
        List.put("K",22);
        List.put("A",23);
        List.put("2",24);
        List.put("大王",30);
        List.put("小王",50);



        //2.打亂順序【洗牌】
        Collections.shuffle(array);


        //發牌跟準備各自的牌集合
        ArrayList<String> lord=new ArrayList<>();
        ArrayList<String> palyer1=new ArrayList<>();
        ArrayList<String> palyer2=new ArrayList<>();
        ArrayList<String> palyer3=new ArrayList<>();


        //發牌
        for (int i = 0; i < array.size(); i++) {
            String str=array.get(i);  //實際牌面的數字
            if(i<3){  //底牌
                lord.add(str);
                continue;
            }
            //輪流發牌給三個人
            if(i%3==0){
                palyer1.add(str);
            }else if(i%3==1){
                palyer2.add(str);
            }else if(i%3==2){
                palyer3.add(str);
            }
        }

        //看牌
        lookPoker("地主",lord);  //底牌
        lookPoker("唯易",palyer1);  //玩家1
        lookPoker("大帥哥",palyer2);  //玩家2
        lookPoker("大SB",palyer3);  //玩家3
    }

    public void lookPoker(String name,ArrayList<String> lists){
        //再將lists集合中的數字排序
        lists.sort(new Comparator<String>() {
            @Override
            //Array.sort[插入排序+二分排序]
            public int compare(String o1, String o2) {
                /*
                 o1:代表現在要新增的資料
                 o2:已經儲存在集合中的資料
                 */
               //計算花色和價值
                String color = o1.substring(0, 1);
                int val=getValue(o1);

                String color1 = o2.substring(0, 1);
                int val1=getValue(o2);

               //比價價值
                int i=val-val1;
                return i==0 ? color.compareTo(color1):i;  //價值相同,就比較花色大小
            }
        });

        //輸出牌面
        System.out.print(name+"的牌=");
        System.out.println(lists);

    }

    //計算價值的方法
    public static int getValue(String str){
             //獲取數字
            String sub = str.substring(1);

            //判斷獲取的數字在map集合中是否存在
         //注意點:存在大王/小王的Bug,要統一擷取,令其在集合中存在
            if(List.containsKey(sub)){
                //存在,就獲取值
                return List.get(sub);
            }else {
                //不存在,就將鍵強制轉換成價值【int】型別作為價值
                return Integer.parseInt(sub);

            }
    }
}