多方式实现斗地主快速发牌

多方式实现斗地主快速发牌


思路

  • 装牌
  • 洗牌
  • 发牌
  • 看牌
  • 扑克牌一共包含以下牌

♦2,♦3…,♦K,♦A
♣2…♣K,♣A
♠2,♠3…,♠A
♥2…,♥A
大王,小王

方案一

组成:

  • 每张牌都是由花色和字母或数字组成的(大小王除外)
 ArrayList<String> array = new ArrayList<String>();
        //通过双重循环的方式将牌插入数组
        String[] colors = {
    
    "♦", "♣", "♠", "♥"};
        String[] numbers = {
    
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        for (String color : colors) {
    
    
            for (String number : numbers) {
    
    
                array.add(color + number);
            }
        }
        array.add("大王");
        array.add("小王");

洗牌

  • 现在需要把数组打乱 ,这里使用shuffle( )来打乱
  • shuffle( )使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。
Collections.shuffle(array);

发牌

  • 众所周知斗地主一共有三个玩家,但是千万不要忘记还要留三张底牌

  • 这里有个小技巧,有几个玩家就用几来取模

ArrayList<String> di = new ArrayList<>();
ArrayList<String> min1 = new ArrayList<>();
ArrayList<String> min2 = new ArrayList<>();
ArrayList<String> dipa = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
    
    
    String poker = array.get(i);
    //留出底牌
    if (i >= array.size() - 3) {
    
    
        dipa.add(poker);
    } else if (i % 3 == 0) {
    
    
        di.add(poker);
    } else if (i % 3 == 1) {
    
    
        min1.add(poker);
    } else if (i % 3 == 2) {
    
    
        min2.add(poker);
    }
}

看牌

  • 定义看牌方法
 public static void lookpuker(String name, ArrayList<String> array) {
    
    
        System.out.print(name + "的牌是:");
        for (String puker : array) {
    
    
            System.out.print(puker + " ");
        }
        System.out.println();
    }
  • 调用方法
lookpuker("唐三", di);
lookpuker("唐昊", min1);
lookpuker("唐晨", min2);
lookpuker("底牌", dipa);

源代码

public class pukeDemo {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<String> array = new ArrayList<String>();

        //通过双重循环的方式将牌插入数组
        String[] colors = {
    
    "♦", "♣", "♠", "♥"};
        String[] numbers = {
    
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        for (String color : colors) {
    
    
            for (String number : numbers) {
    
    
                array.add(color + number);
            }
        }
        array.add("大王");
        array.add("小王");
        Collections.shuffle(array);
        //  System.out.println(array);
        ArrayList<String> di = new ArrayList<>();
        ArrayList<String> min1 = new ArrayList<>();
        ArrayList<String> min2 = new ArrayList<>();
        ArrayList<String> dipa = new ArrayList<>();
        for (int i = 0; i < array.size(); i++) {
    
    
            String poker = array.get(i);
            //留出底牌
            if (i >= array.size() - 3) {
    
    
                dipa.add(poker);
            } else if (i % 3 == 0) {
    
    
                di.add(poker);
            } else if (i % 3 == 1) {
    
    
                min1.add(poker);
            } else if (i % 3 == 2) {
    
    
                min2.add(poker);
            }
        }
        lookpuker("唐三", di);
        lookpuker("唐昊", min1);
        lookpuker("唐晨", min2);
        lookpuker("底牌", dipa);

    }

    public static void lookpuker(String name, ArrayList<String> array) {
    
    
        System.out.println(name + "的牌是:");
        for (String puker : array) {
    
    
            System.out.print(puker + " ");
        }
        System.out.println();
    }
}
  • 运行结果

唐三的牌是:♠9 ♣3 ♠8 ♦A ♣4 ♥8 ♠3 ♥K ♣A ♠2 ♦5 ♦2 ♥10 ♥4 ♥7 ♦4 ♠6
唐昊的牌是:♣7 ♦8 ♥A ♥2 ♦7 ♣2 ♥5 ♥9 ♣6 ♥Q 小王 ♦10 ♠K ♥3 ♠5 ♦3 ♦Q
唐晨的牌是:♣K ♠Q ♥6 ♠A ♣Q ♠J ♣10 ♣J ♦9 ♦6 ♥J ♠10 ♦J ♠7 ♠4 ♦K ♣9
底牌的牌是:大王 ♣8 ♣5


方案二(体验优化)

优化点

  • 在方案一中,我们发出来的牌都是乱序的,游戏体验会非常糟糕,因此我们需要把玩家分到的牌进行排序

组成

  • 注意这里我们把牌进行编号
  • HashMap集合中存储编号以及对应的扑克牌,同时往ArrayList集合中存储编号
  • 我们需要把numberscolors的位置换一下
  • 注意如果不进行调换会出现以下情况(一种花色的牌排序完成后,才会去排下一种花色)

虎牙直播搜麦克的牌是:
♦4 ♦5 ♦9 ♦K ♣7 ♣9 ♠4 ♠5 ♠7 ♠8 ♠J ♠Q ♠A ♥7 ♥8 ♥9 小王

随缘的牌是:
♦6 ♦7 ♦10 ♦A ♣10 ♠3 ♠6 ♠10 ♠K ♥3 ♥5 ♥6 ♥J ♥K ♥A ♥2 大王

马花疼的牌是:
♦3 ♦8 ♦J ♦Q ♦2 ♣3 ♣4 ♣6 ♣8 ♣J ♣Q ♣K ♣2 ♠9 ♥4 ♥10 ♥Q

底牌的牌是:
♣5 ♣A ♠2

  • 更改后
 HashMap<Integer, String> hm = new HashMap<>();     
 ArrayList<Integer> array = new ArrayList<>();      
 String[] colors = {
    
    "♦", "♣", "♠", "♥"};            
 String[] numbers = {
    
    "3", "4", "5", "6", "7", "8", "
 int indexs = 0;                                    
 for (String number : numbers) {
    
                        
     for (String color : colors) {
    
                      
         hm.put(indexs, color + number);            
         array.add(indexs);                         
         indexs++;                                  
     }                                              
 }                                                  
 hm.put(indexs, "大王");                              
 array.add(indexs);                                 
 indexs++;                                          
 hm.put(indexs, "小王");                              
 array.add(indexs);                                 

洗牌

  • 洗的是编号,这里使用shuffle( )来打乱

  • shuffle( )使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。

Collections.shuffle(array);

发牌

  • 发的是编号,为了保证扑克牌排好序,创建TreeSet集合来接收
 //构造一个新的空树集,根据其元素的自然顺序排序。
        TreeSet<Integer> di = new TreeSet<>();
        TreeSet<Integer> min1 = new TreeSet<>();
        TreeSet<Integer> min2 = new TreeSet<>();
        TreeSet<Integer> dip = new TreeSet<>();
        for (int i = 0; i < array.size(); i++) {
    
    
            int x = array.get(i);
            if (i >= array.size() - 3) {
    
    
                dip.add(x);
            } else if (i % 3 == 0) {
    
    
                di.add(x);
            } else if (i % 3 == 1) {
    
    
                min1.add(x);
            } else if (i % 3 == 2) {
    
    
                min2.add(x);
            }
        }

看牌

 public static void lookpuker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
    
    
        System.out.println(name + "的牌是: ");
        for (Integer key : ts) {
    
    
            String puker = hm.get(key);
            System.out.print(puker + " ");
        }
        System.out.println();
    }

源代码

public class pukerplus {
    
    
    public static void main(String[] args) {
    
    
        HashMap<Integer, String> hm = new HashMap<>();
        ArrayList<Integer> array = new ArrayList<>();
        String[] colors = {
    
    "♦", "♣", "♠", "♥"};
        String[] numbers = {
    
    "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int indexs = 0;
        for (String number : numbers) {
    
    
            for (String color : colors) {
    
    
                hm.put(indexs, color + number);
                array.add(indexs);
                indexs++;
            }
        }
        hm.put(indexs, "大王");
        array.add(indexs);
        indexs++;
        hm.put(indexs, "小王");
        array.add(indexs);
        Collections.shuffle(array);
        //构造一个新的空树集,根据其元素的自然顺序排序。
        TreeSet<Integer> di = new TreeSet<>();
        TreeSet<Integer> min1 = new TreeSet<>();
        TreeSet<Integer> min2 = new TreeSet<>();
        TreeSet<Integer> dip = new TreeSet<>();
        for (int i = 0; i < array.size(); i++) {
    
    
            int x = array.get(i);
            if (i >= array.size() - 3) {
    
    
                dip.add(x);
            } else if (i % 3 == 0) {
    
    
                di.add(x);
            } else if (i % 3 == 1) {
    
    
                min1.add(x);
            } else if (i % 3 == 2) {
    
    
                min2.add(x);
            }
        }
        lookpuker("虎牙直播搜麦克", di, hm);
        lookpuker("随缘", min1, hm);
        lookpuker("马花疼", min2, hm);
        lookpuker("底牌", dip, hm);
    }

    public static void lookpuker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
    
    
        System.out.println(name + "的牌是: ");
        for (Integer key : ts) {
    
    
            String puker = hm.get(key);
            System.out.print(puker + " ");
        }
        System.out.println();
    }
}

结果

虎牙直播搜麦克的牌是:
♣3 ♠3 ♥3 ♥4 ♦5 ♣5 ♦6 ♠6 ♥7 ♣8 ♥9 ♥K ♦A ♣A ♠A ♦2 小王
随缘的牌是:
♦3 ♠4 ♥6 ♣7 ♠7 ♠8 ♥8 ♦10 ♣10 ♠10 ♥10 ♠J ♣Q ♠Q ♥Q ♣2 大王
马花疼的牌是:
♣4 ♠5 ♥5 ♣6 ♦7 ♦8 ♠9 ♦J ♣J ♥J ♦Q ♦K ♣K ♠K ♥A ♠2 ♥2
底牌的牌是:
♦4 ♦9 ♣9


看到这里了,点个关注再走吧

猜你喜欢

转载自blog.csdn.net/m0_57025749/article/details/123586342
今日推荐