zoukankan      html  css  js  c++  java
  • JAVA学习笔记(十八)

    经典案例:模拟斗地主洗牌发牌

    案例介绍:按照斗地主的规则,完成洗牌发牌的动作。

    案例需求分析:

    准备牌:

      完成数字与纸牌的映射关系:

      使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。

    洗牌:

      通过数字完成洗牌发牌

    发牌:

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

      存放的过程中要求数字大小与斗地主规则的大小对应。

      将代表不同纸牌的数字分配给不同的玩家与底牌。

    看牌:

      通过Map集合找到对应字符展示。

      通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

    实现步骤:

      首先,要修改java文件编码,由GBK修改为UTF-8,因为默认的字符编码GBK没有我们要的梅花、方片、黑桃、红桃(♠♥♦♣)等特殊字符。

    下面是具体代码:

    package homework0418;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.TreeSet;
    
    public class DoudiZhu {
    
        public static void main(String[] args) {
            //创建一个HashMap集合
            HashMap<Integer,String> pokers=new HashMap<Integer,String>();
            //创建花色数组
            String[] colors= {"黑桃","梅花","方块","红桃"};
            //创建点数数组
            String[] numbers= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
            //创建一副牌 花色+点数
            int count=0;
            //创建一个存储索引的ArrayList集合
            ArrayList<Integer> indexs=new ArrayList<Integer>();
            for(String num:numbers) {
                for(String c:colors) {
                pokers.put(count, c+num);
                indexs.add(count);
                count++;
            }
                }
            indexs.add(0);
            pokers.put(0, "小王");
            indexs.add(1);
            pokers.put(1, "大王");
            //洗牌
            Collections.shuffle(indexs);
            //发牌
            //创建四个TreeSet集合分别存储三个人的牌和底牌编号
            TreeSet<Integer> zhangsan=new TreeSet<Integer>();
            TreeSet<Integer> lisi=new TreeSet<Integer>();
            TreeSet<Integer> wangwu=new TreeSet<Integer>();
            TreeSet<Integer> bottom=new TreeSet<Integer>();
            for(int i=0;i<indexs.size();i++) {
                if(i<3) {
                    bottom.add(indexs.get(i));
                }else if(i%3==0) {
                    zhangsan.add(indexs.get(i));
                }else if(i%3==1) {
                    lisi.add(indexs.get(i));
                }else if(i%3==2) {
                    wangwu.add(indexs.get(i));
                }
            }
            //通过索引查看pokers中对应的牌
            look("张三",zhangsan,pokers);
            look("李四",lisi,pokers);
            look("王五",wangwu,pokers);
            look("底牌",bottom,pokers);
        }
        private static void look(String name,TreeSet<Integer> ts,HashMap<Integer,String> pokers) {
            System.out.print(name+"的牌是:");
            for(int i:ts) {
                System.out.print(pokers.get(i)+" ");
            }    
            System.out.println();
                }
    }
  • 相关阅读:
    WIN32弹窗报时间【CSDN】
    函数返回类型为引用的好处
    计算机补码的秘密【转】
    设计模式之Singleton模式【类只有一个对象】
    bitwise constness与logical constness【EC++笔记】
    避免使用隐式类型转换【转】
    private, public, protected,继承【转】
    nonlocal static对象初始化【EC++笔记】
    在资源管理类中提供对原始资源的访问【EC++笔记】
    copy构造函数与copy赋值操作符【EC++笔记】
  • 原文地址:https://www.cnblogs.com/boringLee/p/9020308.html
Copyright © 2011-2022 走看看