• 斗地主案例及一些实现规则


    4. 斗地主发牌

    4.1 案例介绍

    按照斗地主的规则,完成洗牌发牌的动作。 具体规则:

    使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。

    4.2 案例分析

    • 准备牌:

      牌可以设计为一个ArrayList,每个字符串为一张牌。 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。 牌由Collections类的shuffle方法进行随机排序。

    • 发牌

      将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

    • 看牌

      直接打印每个集合。

    4.3 代码实现

    1. public class App {
    2.    public static void main(String[] args) {
    3.      /*
    4.        完成控制台版的三步:
    5.          准备牌
    6.          洗牌
    7.          发牌
    8.       */
    9.        //从程序的主入口开启斗地主游戏
    10.        new PokerGame();
    11.   }
    12. }
    13. public class PokerGame {
    14.    //牌盒
    15.    //♥3 ♣3
    16.    static ArrayList list = new ArrayList<>();
    17.    //静态代码块
    18.    //特点:随着类的加载而在加载的,而且只执行一次。
    19.    static {
    20.        //准备牌
    21.        // "♦", "♣", "♥", "♠"
    22.        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
    23.        String[] color = {"♦", "♣", "♥", "♠" };
    24.        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
    25.        for (String c : color) {
    26.            //c依次表示每一种花色
    27.            for (String n : number) {
    28.                //n 依次表示每一个数字
    29.                list.add(c + n);
    30.           }
    31.       }
    32.        list.add("小王");
    33.        list.add("大王");
    34.   }
    35.    public PokerGame(){
    36.        //洗牌
    37.        Collections.shuffle(list);
    38.        //发牌
    39.        ArrayList lord = new ArrayList<>();
    40.        ArrayList player1 = new ArrayList<>();
    41.        ArrayList player2 = new ArrayList<>();
    42.        ArrayList player3 = new ArrayList<>();
    43.        //遍历牌盒得到每一张牌
    44.        for (int i = 0; i < list.size(); i++) {
    45.            //i:索引
    46.            String poker = list.get(i);
    47.            if(i <= 2){
    48.                lord.add(poker);
    49.                continue;
    50.           }
    51.            //给三个玩家轮流发牌
    52.            if(i % 3 == 0){
    53.                player1.add(poker);
    54.           }else if(i % 3 == 1){
    55.                player2.add(poker);
    56.           }else{
    57.                player3.add(poker);
    58.           }
    59.       }
    60.        //看牌
    61.        lookPoker("底牌",lord);
    62.        lookPoker("钢脑壳",player1);
    63.        lookPoker("大帅比",player2);
    64.        lookPoker("蛋筒",player3);
    65.   }
    66.    /*
    67.    * 参数一:玩家的名字
    68.    * 参数二:每位玩家的牌
    69.    * */
    70.    public void lookPoker(String name, ArrayList list){
    71.        System.out.print(name + ": ");
    72.        for (String poker : list) {
    73.            System.out.print(poker + " ");
    74.       }
    75.        System.out.println();
    76.   }
    77. }

    4.4 排序(第一种排序方式)

    1. public class App {
    2.    public static void main(String[] args) {
    3.      /*
    4.        完成控制台版的四步:
    5.          准备牌
    6.          洗牌
    7.          发牌
    8.          排序
    9.       */
    10. //从程序的主入口开启斗地主游戏
    11.        new PokerGame();
    12.   }
    13. }
    14. public class PokerGame {
    15.    //牌盒 Map
    16.    //此时我们只要把牌跟序号产生对应关系就可以了,不需要按照序号进行排序,所以只要HashMap就可以了
    17.    static HashMap hm = new HashMap<>();
    18.    static ArrayList list = new ArrayList<>();
    19.    static {
    20.        String[] color = {"♦", "♣", "♥", "♠"};
    21.        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
    22.        //序号
    23.        int serialNumber = 1;
    24.        //细节
    25.        for (String n : number) {
    26.            //依次表示每一个数字
    27.            for (String c : color) {
    28.                //依次表示每一个花色
    29.                hm.put(serialNumber, c + n);
    30.                list.add(serialNumber);
    31.                serialNumber++;
    32.           }
    33.       }
    34.        hm.put(serialNumber, "小王");
    35.        list.add(serialNumber);
    36.        serialNumber++;
    37.        hm.put(serialNumber, "大王");
    38.        list.add(serialNumber);
    39.   }
    40.    public PokerGame() {
    41.        //洗牌
    42.        Collections.shuffle(list);
    43.        //发牌
    44.        TreeSet lord = new TreeSet<>();
    45.        TreeSet player1 = new TreeSet<>();
    46.        TreeSet player2 = new TreeSet<>();
    47.        TreeSet player3 = new TreeSet<>();
    48.        for (int i = 0; i < list.size(); i++) {
    49.            //i :依次表示集合中的每一个索引
    50.            //list.get(i)元素:牌的序号
    51.            int serialNumber = list.get(i);
    52.            if(i <= 2){
    53.                lord.add(serialNumber);
    54.                continue;
    55.           }
    56.            if(i % 3 == 0){
    57.                player1.add(serialNumber);
    58.           }else if(i % 3 == 1){
    59.                player2.add(serialNumber);
    60.           }else{
    61.                player3.add(serialNumber);
    62.           }
    63.       }
    64.        //看牌
    65.        lookPoker("底牌",lord);
    66.        lookPoker("钢脑壳",player1);
    67.        lookPoker("大帅比",player2);
    68.        lookPoker("蛋筒",player3);
    69.   }
    70.    /*
    71.    * 参数一:玩家的名字
    72.    * 参数二:牌的序号
    73.    * */
    74.    public void lookPoker(String name, TreeSet ts){
    75.        System.out.print(name + ": ");
    76.        //遍历TreeSet集合得到每一个序号,再拿着序号到Map集合中去找真正的牌
    77.        for (int serialNumber : ts) {
    78.            String poker = hm.get(serialNumber);
    79.            System.out.print(poker + " ");
    80.       }
    81.        System.out.println();
    82.   }
    83. }

    4.5 排序(第二种排序方式)

    1. public class App {
    2.    public static void main(String[] args) {
    3.        new PokerGame();
    4.   }
    5. }
    6. public class PokerGame {
    7.    //牌盒
    8.    static ArrayList list = new ArrayList<>();
    9.    //创建一个集合,用来添加牌的价值
    10.    static HashMap hm = new HashMap<>();
    11.    static {
    12.        //准备牌
    13.        String[] color = {"♦", "♣", "♥", "♠"};
    14.        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
    15.        for (String c : color) {
    16.            for (String n : number) {
    17.                list.add(c + n);
    18.           }
    19.       }
    20.        list.add(" 小王");
    21.        list.add(" 大王");
    22.        //指定牌的价值
    23.        //牌上的数字到Map集合中判断是否存在
    24.        //存在,获取价值
    25.        //不存在,本身的数字就是价值
    26.        hm.put("J", 11);
    27.        hm.put("Q", 12);
    28.        hm.put("K", 13);
    29.        hm.put("A", 14);
    30.        hm.put("2", 15);
    31.        hm.put("小王", 50);
    32.        hm.put("大王", 100);
    33.   }
    34.    public PokerGame() {
    35.        //洗牌
    36.        Collections.shuffle(list);
    37.        //发牌
    38.        ArrayList lord = new ArrayList<>();
    39.        ArrayList player1 = new ArrayList<>();
    40.        ArrayList player2 = new ArrayList<>();
    41.        ArrayList player3 = new ArrayList<>();
    42.        for (int i = 0; i < list.size(); i++) {
    43.            String poker = list.get(i);
    44.            //发底牌
    45.            if (i <= 2) {
    46.                lord.add(poker);
    47.                continue;
    48.           }
    49.            //给三个玩家轮流发牌
    50.            if (i % 3 == 0) {
    51.                player1.add(poker);
    52.           } else if (i % 3 == 1) {
    53.                player2.add(poker);
    54.           } else {
    55.                player3.add(poker);
    56.           }
    57.       }
    58.        //排序
    59.        order(lord);
    60.        order(player1);
    61.        order(player2);
    62.        order(player3);
    63.        //看牌
    64.        lookPoker("底牌",lord);
    65.        lookPoker("钢脑壳",player1);
    66.        lookPoker("大帅比",player2);
    67.        lookPoker("蛋筒",player3);
    68.   }
    69.    /*
    70.     * 参数一:玩家的名字
    71.     * 参数二:每位玩家的牌
    72.     * */
    73.    public void lookPoker(String name, ArrayList list){
    74.        System.out.print(name + ": ");
    75.        for (String poker : list) {
    76.            System.out.print(poker + " ");
    77.       }
    78.        System.out.println();
    79.   }
    80.    //利用牌的价值进行排序
    81.    //参数:集合
    82.    //♥5 ♥3 ♥6 ♥7 ♥9
    83.    public void order(ArrayList list){
    84.        Collections.sort(list, new Comparator() {
    85.            //Array.sort (插入排序 + 二分查找)
    86.            @Override
    87.            public int compare(String o1, String o2) {
    88.                //o1:表示当前要插入到有序序列中的牌
    89.                //o2:表示已经在有序序列中存在的牌
    90.                //负数:o1小 插入到前面
    91.                //正数:o1大 插入到后面
    92.                //0:o1的数字跟o2的数字是一样的,需要按照花色再次排序
    93.                //1.计算o1的花色和价值   大王
    94.                String color1 = o1.substring(0, 1);
    95.                int value1 = getValue(o1);
    96.                //2.计算o2的花色和价值
    97.                String color2 = o2.substring(0, 1);
    98.                int value2 = getValue(o2);
    99.                //3.比较o1和o2的价值   ♥3 ♠3
    100.                int i = value1 - value2;
    101.                return i == 0 ? color1.compareTo(color2) : i;
    102.           }
    103.       });
    104.   }
    105.    //计算牌的价值
    106.    //参数:牌
    107.    //返回值:价值
    108.    public int getValue(String poker){//♥3
    109.        //获取牌上的数字
    110.        String number = poker.substring(1);//把这里截取出来的结果,让这个结果再Map集合中存在 “ 大王”
    111.        //拿着数字到map集合中判断是否存在
    112.        if(hm.containsKey(number)){
    113.            //存在,获取价值
    114.            return hm.get(number);
    115.       }else{
    116.            //不存在,类型转换
    117.            return Integer.parseInt(number);
    118.       }
    119.   }
    120. }
  • 相关阅读:
    idea中创建jsp项目详细步骤
    大数据开发 hadoop集群1. 概论
    PEG聚乙二醇功能上转换荧光纳米颗粒
    Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C语言)
    【JVM】内存快照分析工具Jprofiler
    RGB+深度图像 语义分割paper阅读笔记(ICRA2021)
    智慧工地抽烟识别检测系统
    经常遇到的问题
    【面试系列】后端开发工程师 高频面试题及详细解答
    Flink保证exactly-once机制介绍:checkpoint及TwoPhaseCommitSinkFunction
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/132927818