0
点赞
收藏
分享

微信扫一扫

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

7dcac6528821 2022-03-18 阅读 30

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

目录


思路

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

组成:

  • 每张牌都是由花色和字母或数字组成的(大小王除外)
 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();
    }
}
  • 运行结果

方案二(体验优化)

优化点

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

组成

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

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

举报

相关推荐

0 条评论