天天看點

模拟鬥地主,洗牌、發牌、看牌。牌沒有順序. 簡單操作.

public classDemo02 {

    // 模拟鬥地主,洗牌、發牌、看牌。牌沒有順序

    // 1、建立一個集合,把牌裝進去

    // 2、洗牌:shuffle

    // 3、發牌:三個人+3張底牌

    // 4、看牌(列印)

    public static void main(String[] args) {

       // 一、買了一副牌

       List<String>poker = new ArrayList<String>();

       // 四種花色

       String[]color = { "黑桃", "紅桃", "梅花", "方片" };

       // 13個數字

       String[] num= { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10",

              "J", "Q", "K" };

       for (String cl : color) {

           for (String nu : num) {

              poker.add(cl + nu);

           }

       }

       // System.out.println(poker);

       poker.add("大王");

       poker.add("小王");

       // System.out.println(poker);

       // 二、洗牌:

       Collections.shuffle(poker);

       // 三、發牌

       List<String>player1 = newArrayList<String>();

       List<String>player2 = newArrayList<String>();

       List<String>player3 = newArrayList<String>();

       List<String>other = newArrayList<String>();

       for (int i =0; i < poker.size();i++) {

           if (i < 3) {

              other.add(poker.get(i));

           } else { //i>=3

              if (i % 3 == 0) {

                  player1.add(poker.get(i));

               } else if (i %3 == 1) {

                  player2.add(poker.get(i));

              } else {

                  player3.add(poker.get(i));

              }

           }

       }

       // 四、看牌

       System.out.println("player1:" + player1);

       System.out.println("player2:" + player2);

       System.out.println("player3:" + player3);

       System.out.println("other:" + other);

    }

}

但是這種代碼是沒有發牌順序的,可以用Treeset,

保證牌發到三個人手中是已經排好序了的.

public static void main(String[] args) {

       // 一、建立牌

       Map<Integer,String> poker = newHashMap<Integer, String>();

       // 花色

       String[]color = { "方片", "梅花", "紅桃", "黑桃" };

       // 數字

       String[] num= { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",

              "K", "A", "2" };

       List<Integer>list = newArrayList<Integer>();

       int index = 0; // 索引

       // 拼接

       for (String n : num) {

           for (String c : color) {

              list.add(index);// 把0-51添加到list中

              poker.put(index,c + n);

              index++;

           }

       }

       // 有前面的52張牌

       // System.out.println(index);

       list.add(index);

       poker.put(index,"小王");

       index++;

       list.add(index);

       poker.put(index,"大王");

       // System.out.println(list);

       // 二、洗牌

       Collections.shuffle(list);

       // System.out.println(list);

       // 三、發牌

       Set<Integer>player1 = newTreeSet<Integer>();

       Set<Integer>player2 = newTreeSet<Integer>();

       Set<Integer>player3 = newTreeSet<Integer>();

       Set<Integer>other = newTreeSet<Integer>();

       for (int i =0; i < list.size(); i++) {

           if (i >= list.size() - 3) {

              other.add(list.get(i));

           } else {

              if (i % 3 == 0) {

                  player1.add(list.get(i));

              } else if (i %3 == 1) {

                  player2.add(list.get(i));

              } else {

                  player3.add(list.get(i));

              }

           }

       }

       // 四、看牌

       show(player1, poker, "惠明的牌");

       show(player2, poker, "有根的牌");

       show(player3, poker, "發生的牌");

       show(other, poker, "底牌");

    }

    public static void show(Set<Integer> set, Map<Integer, String>map,

           Stringplayer) {

       System.out.println(player + "是:");

       StringBuildersb = newStringBuilder();

       for (Integer key : set) {

           sb.append(map.get(key)+ ",");

       }

       System.out.println(sb.deleteCharAt(sb.lastIndexOf(",")));

    }

}

可以看到用Treeset進行改進的方法已經能夠做到發到三人手中的牌是按照一定的順序的.

它的原理是:除大小王之外的,52張牌,每張牌編上一個特有的序号...排序的時候隻要按照編号排序.