2022年04月03日报告

本文介绍了Java集合框架中的Collections工具类,展示了如何使用其方法对List集合进行排序、反转、交换等操作。此外,还设计了一个扑克牌游戏,包括卡牌类、玩家类、卡牌管理类和执行类,详细说明了游戏规则和得分计算,并实现了发牌、排序和计分等功能。
摘要由CSDN通过智能技术生成

2022年03月30日讲到了 Set集合,同志们

1. Collection工具类

可以用来操作 List集合, 这样更方便些

下面是 Collections类 里的一些方法:

public class CollectionsDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(1);
        list.add(1);
        list.add(1);
        // 1. reverse()   对已有元素进行倒序排列
        Collections.reverse(list);

        // 2. shuffle()   对已有元素进行随机排列
        Collections.shuffle(list);
        System.out.println("随机排序:" + list);

        // 3. sort()      对已有元素进行升序排列
        Collections.sort(list);
        System.out.println("自然排序:" + list);

        // 4. sort(List list,Comparator comp)      按照指定顺序对已有元素进行排列
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return -(o1.compareTo(o2));
            }
        });
        System.out.println("指定排序:" + list);

        // 5. swap()      将 list集合 中的指定元素交换位置
        Collections.swap(list, 0, 3);
        System.out.println("交换:" + list);

        // 6. rotate()    若 distance为正数,则将集合后的 distance个元素挪到前头,
        //                若 distance为负数, 则将集合前的 distance个元素挪到最后
        Collections.rotate(list,-3);
        System.out.println("挪动:"+list);

        // 7. frequency()     返回集合中 某个元素 出现的次数
        System.out.println(Collections.frequency(list,1));

        // 8. fill()      用一个元素 把集合中所有元素 都替换掉
        Collections.fill(list,10);
        System.out.println(list);

        // 9. replaceAll()    将集合中的 所有指定元素 换成另一个元素
        Collections.replaceAll(list,10,1);
        System.out.println(list);
    }
}

2. 纸牌练习

现在有一副扑克牌(除大小王), {"♠","♥","♦","♣"},{"1","2","3","4","5","6","7","8","9","10","J","Q","K"},有四种花色,13个牌号。

进行一场扑克游戏,玩家数量控制在3-5人之内。为每个人分发5张扑克牌。

按照点数大小进行排序输出 只考虑点数。

最后 按照一个规则 给出玩家的得分

这个规则会写在卡牌管理类里

小编写了四个类 

第一个是卡牌类:

public class Poker {
    // 这里保存着 每张扑克牌的信息
    private String type;        // 卡牌花色
    private String point;       // 卡牌点数
    // 这里的 value 指的是 每张牌对应的 附加分数
    private Integer value;

    public Poker(String type, String point) {
        this.type = type;
        this.point = point;
    }

    // 小编在这里省略了 get和 set方法

    @Override
    public String toString() {
        return type+point;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Poker poker = (Poker) o;
        // 这里的 equals()方法 只会比对 value值
        // 也就是 两张牌 额外分数相等 就算它们一样了
        return Objects.equals(value, poker.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
}

第二个是玩家类:

public class User {
    //这里保存了玩家的信息
    private String name;        //玩家姓名
    private int point;          //玩家分数
    private List<Poker> pokers=new ArrayList<>();       //玩家持有的牌
   
    // 同样省略了 get和 set方法

    public User(String name) {
        this.name = name;
    }
    // toString() 打印玩家信息
    @Override
    public String toString() {
        return name+"\t"+pokers+"\t";
    }
}

第三个是卡牌管理类:

public class pokerManager {
    // 这个类里定义了 整理扑克牌 所需的方法
    public static void sort(List<Poker> pokers) {
        // 这个方法 用来给扑克牌 排序
        pokers.sort(new Comparator<Poker>() {
            @Override
            public int compare(Poker o1, Poker o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });}

    public static boolean fre1(List<Poker> pokers, int fre) {
        // 如果 有一个扑克 出现的次数 等于输入的 fre,返回 true
        // 如果都没有 就返回 false
        for (int i = 0; i < pokers.size(); i++) {
            if (Collections.frequency(pokers, pokers.get(i)) == fre) {
                return true;
            } else if (i == pokers.size() - 1) {
                return false;}}
        return false;}

    public static int fre2(List<Poker> pokers, int fre) {
        // 这个方法 可以查找有多少种扑克 出现次数等于 fre
        int num = 0;
        for (int i = 0; i < pokers.size(); i++) {
            if (Collections.frequency(pokers, pokers.get(i)) == fre) {
                num++;
                if (fre != 1) {
                    i = i + fre;}}}
        return num;}

    public static Poker fre3(List<Poker> pokers, int f) {
        // 这个方法通过 扑克出现的频率 找到扑克对象
        // 并把 相同的扑克 删除
        int num = 0;
        for (int i = 0; i < pokers.size(); i++) {
            if (Collections.frequency(pokers, pokers.get(i)) == f) {
                if (f == 1) {
                    return pokers.remove(i);
                } else {
                    for (int j = i; j <= i + f - 1; j++) {
                        pokers.remove(j);
                        num++;
                        if (num == f - 1) {
                            return pokers.remove(j);
                        }
                        j--;}}}}
        return new Poker("", "");}

    public static boolean isQueue(List<Poker> pokers) {
        // 这个方法用来判断是否为顺子    1 2 3 4 5
        for (int i = 0; i < pokers.size() - 1; i++) {
            if (pokers.get(i).getValue() + 10 != pokers.get(i + 1).getValue()) {
                return false;
            } else if (i == pokers.size() - 2) {
                return true;}}
        return false;}

    public static int calculateScore(List<Poker> p) {
        // 这个方法 用来计算总分
        // 下面是判断 是否为顺子
        if (isQueue(p)) {
            return 10000;
        }
        // 下面是     1 1 1 1 4   ---   2 3 3 3 3    (一个四,一个单)
        if (fre1(p, 4)) {
            return 9000 + extraScore(fre3(p, 4), 4) + extraScore(fre3(p, 1), 1);
        }// 下面是    1 1 2 2 2   ---  1 1 1 2 2     (一个仨,一个对)
        else if (fre1(p, 3) && fre1(p, 2)) {
            return 8000 + fre3(p, 3).getValue() * 3 + fre3(p, 2).getValue() * 2;
        }// 下面是    1 1 1 2 3   ---   1 2 2 2 3  ---  1 2 3 3 3       (一个仨,两个单)
        else if (fre1(p, 3) && fre2(p, 1) == 2) {
            return 7000 + extraScore(fre3(p, 3), 3, fre3(p, 1), 1, fre3(p, 1), 1);
        }// 下面是    1 1 2 2 3   ---   1 2 2 3 3  ---  1 1 2 3 3        (两个对,一个单)
        else if (fre2(p, 2) == 2) {
            return 6000 + extraScore(fre3(p, 2), 2, fre3(p, 2), 2, fre3(p, 1), 1);
        }// 下面是    1 1 2 3 4   ---   1 2 2 3 4  ---  1 2 3 3 4  ---  1 2 3 4 4      (一个对,三个单)
        else if (fre2(p, 2) == 1 && fre2(p, 1) == 3) {
            return 5000 + extraScore(fre3(p, 2), 2, fre3(p, 1), 1, fre3(p, 1), 1, fre3(p, 1), 1);
        } else {
            return 4000;}}

    // 这些方法是 用来计算 额外分数的
    public static int extraScore(Poker poker, int fre) {
        return poker.getValue() * fre;
    }

    public static int extraScore(Poker p1, int f1, Poker p2, int f2, Poker p3, int f3) {
        return p1.getValue() * f1 + p2.getValue() * f2 + p3.getValue() * f3;
    }

    public static int extraScore(Poker p1, int f1, Poker p2, int f2, Poker p3, int f3, Poker p4, int f4) {
        return p1.getValue() * f1 + p2.getValue() * f2 + p3.getValue() * f3 + p4.getValue() * f4;}}

第四个是执行类:

public class run {
        // 这个类 用于最终的执行
    public static void main(String[] args) {
        // 创建 扑克牌集合
        List<Poker> pokers = new ArrayList<>(60);
        // 创建 玩家集合
        List<User> users = new ArrayList<>(10);

        String[] type = {"♠", "♥", "♦", "♣"};
        String[] point = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        // 将 扑克牌 放入集合中
        for (String element : type) {
            for (String s : point) {
                Poker poker = new Poker(element, s);
                // 为每张扑克牌 设置附加分数
                switch (poker.getPoint()) {
                    case "A":
                        poker.setValue(10);
                        break;
                    case "J":
                        poker.setValue(110);
                        break;
                    case "Q":
                        poker.setValue(120);
                        break;
                    case "K":
                        poker.setValue(130);
                        break;
                    default:
                        poker.setValue(Integer.parseInt(poker.getPoint()) * 10);
                        break;
                }
                pokers.add(poker);
            }
        }
        // 这里进行洗牌
        Collections.shuffle(pokers);
        // 将玩家们 放入集合
        User user1 = new User("杜老师");
        User user2 = new User("苏坡");
        User user3 = new User("小源");
        User user4 = new User("麦丝平方");
        User user5 = new User("酷爱ZERO");
        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);
        users.add(user5);
        // 给玩家发牌
        int num = 0;
        for (User item : users) {
            List<Poker> pokers1 = new ArrayList<>();
            for (int i = num; i < num + 5; i++) {
                pokers1.add(pokers.get(i));
            }
            item.setPokers(pokers1);
            num = num + 5;
        }
        // 将 玩家手中的牌 排好顺序
        for (User value : users) {
            pokerManager.sort(value.getPokers());
        }
        // 最后的打印输出
        for (User user : users) {
            // 这里 计算分数的方法 要放在打印信息的后面
            System.out.print(user + "\t");
            user.setPoint(pokerManager.calculateScore(user.getPokers()));
            System.out.println(user.getPoint());
        }
        System.out.println();
    }
}

最终的输出:

THE EHD≯(๑° . °๑)≮ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒂法挤挤挤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值