JavaSE学习笔记 集合终极小练习:模拟斗地主的洗牌、发牌与看牌

本节我们将集合作以回顾复习,用集合方面的知识来完成模拟斗地主的洗牌发牌与看牌的操作。在进行这个小练习之前,我们还需要将Java中Collection集合中Collections工具类的方法作以介绍。

1.Collection工具类概述与常见方法介绍

Collections类概述:针对单列集合操作的工具类。

Collections成员方法作用
public static void sort(List list)排序,默认按照自然顺序
public static int binarySearch(List<?> list,T key)二分查找
public static void reverse(List<?> list)反转
public static void shuffle(List<?> list)随机置换
Collections工具类中的成员方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class MyTest {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(300);
        list.add(200);
        list.add(400);
        list.add(500);
        list.add(100);

        //将集合中的元素按照从小到大的顺序进行排序
        Collections.sort(list);
        System.out.println(list);

        //将集合中的元素按照从大到小的顺序进行排序
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(list);

        //public static <T> int binarySearch(List<?> list,T key):二分查找
        //二分查找的前提就是元素必须有序
        int index = Collections.binarySearch(list, 300);
        System.out.println(index);

        //public static <T> T max(Collection<?> coll):获取最大值
        Integer max = Collections.max(list);
        System.out.println(max);
        //public static <T> T min(Collection<?> coll):获取最小值
        Integer min = Collections.min(list);
        System.out.println(min);

       //public static void reverse(List<?> list):反转
        Collections.reverse(list);
        System.out.println(list);

        //public static void shuffle(List<?> list):随机置换
        Collections.shuffle(list);
        System.out.println(list);

    }
}


2.模拟斗地主基础版:每个人拿到手牌没有顺序

斗地主,是一种在中国流行的纸牌游戏,游戏由3个玩家进行,用一副54张牌(连鬼牌),其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。

在这里插入图片描述

现用集合来模拟斗地主洗牌发牌与看牌的操作,而且每个人拿到手上的牌没有顺序。

  • 实现思路:
  • 1.首先创建一个ArrayList集合充当牌盒来存储54张纸牌,使用两个数组(花色数组与字数组)嵌套循环来添加52张普通牌,大小王使用手动自己进行添加。
  • 2.洗牌:利用Collections.shuffle()方法将牌盒中牌来进行打乱,实现洗牌的操作。
  • 3.发牌:首先创建三个ArrayList集合来存储三个人的手牌,其次还得创建一个ArrayList集合来存储底牌。发牌时需要进行判断,可以对3整除取余,来实现每个人的发牌操作,牌盒中的最后三张牌来充当底牌。
  • 4.看牌:抽出一个方法,来看每个人手上的手牌以及底牌。

代码实现:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class 斗地主 {
    public static void main(String[] args) {
        //首先创建牌盒
        ArrayList<String> pokerBox = new ArrayList<>();
        //牌的组成,花色与数字
        //花色
        String [] color={"♠","♥","♣","♦"};
        //大小
        String [] value={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

        //添加52张普通牌
        for (String s: color) {
            for (String s1: value) {
                pokerBox.add(s.concat(s1)+" ");
            }
        }
        //System.out.println(pokerBox);
        //将大小王手动装入牌盒
        pokerBox.add("‍🐉‍");
        pokerBox.add("🐱‍");
        //System.out.println(pokerBox);

       //洗牌
        Collections.shuffle(pokerBox);
        Collections.shuffle(pokerBox);
        Collections.shuffle(pokerBox);
        //System.out.println(pokerBox);
        
        //发牌
        //定义三个斗地主玩家以及底牌
        ArrayList<String> 小明 = new ArrayList<>();
        ArrayList<String> 小红 = new ArrayList<>();
        ArrayList<String> 小黄 = new ArrayList<>();
        ArrayList<String> 底牌 = new ArrayList<>();


        //遍历牌盒
        for (int i = 0; i < pokerBox.size(); i++) {
            if(i>=pokerBox.size()-3){
                //当牌为最后三张时,留作底牌
                底牌.add(pokerBox.get(i));
            }
           //对3整除进行取余,来进行分发牌
            else if(i%3==0){
                小明.add(pokerBox.get(i));
            }
            else if(i%3==1){
                小红.add(pokerBox.get(i));
            }
           else{
               小黄.add(pokerBox.get(i));
            }
        }

        //看牌
        lookPoke("小明",小明);
        lookPoke("小红",小红);
        lookPoke("小黄",小黄);
        lookPoke("底牌",底牌);
    }

    private static void lookPoke(String name, ArrayList<String> list) {
        System.out.print(name);
        for (String s : list) {
            System.out.print(s);
        }
        System.out.println();
    }
}

运行后的结果为:

在这里插入图片描述


3.模拟斗地主升级版:每个人拿到的手牌有顺序

模拟斗地主升级版:基于上面的要求,且要求我们实现每个人拿到的手牌和底牌是有顺序的

  • 实现思路:
  • 1.创建一个HashMap来存储键为索引,值为牌的牌盒,并且创建一个ArrayList索引集合用来存储与HashMap中一一对应的索引值。将52张牌通过花色与大小的组合,将52张带有索引的牌添加到牌盒中,并且手动添加大小网。
  • 2.洗牌:通过Collections集合中的shuffle方法来打乱顺序,实现洗牌的操作。这里需要注意的是将索引集合进行打乱。
  • 3.发牌:首先创建三个treeset集合来存储三个人的手牌,可以实现对牌的排序,其次还得创建一个treeset集合来存储底牌。发牌时需要进行判断,可以对3整除取余,来实现每个人的发牌操作,牌盒中的最后三张牌来充当底牌。
  • 4.看牌:抽出一个方法,来看每个人手上的手牌以及底牌。传入的形参:姓名,最后分别存储牌的集合,以及双列集合牌盒。

图示思路:
在这里插入图片描述

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class 斗地主升级版 {
    public static void main(String[] args) {
        //定义键为Integer类型,值为String类型的双列集合
        HashMap<Integer, String> map = new HashMap<>();
        //定义索引集合
        ArrayList<Integer> indexlist = new ArrayList<>();

        //牌的花色
        String [] color={"♠","♥","♣","♦"};
        //大小
        String [] value={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        //定义初始索引
        int index=0;
        //将花色和大小进行组合,添加52张普通牌
        for (String s : value) {
            for (String s1 : color) {
               map.put(index,s1.concat(s)+" ");
               indexlist.add(index);
               index++;
            }

        }
        //手动添加大小王
        map.put(index,"🐉");
        indexlist.add(index);
        index++;
        map.put(index,"🐱");
        indexlist.add(index);

        /*System.out.print(map);
        System.out.println();
        System.out.print(indexlist);
         */

        //洗牌
        Collections.shuffle(indexlist);

        //发牌
        TreeSet<Integer> 小明= new TreeSet<>();
        TreeSet<Integer> 小黄 = new TreeSet<>();
        TreeSet<Integer> 小红 = new TreeSet<>();
        TreeSet<Integer> 底牌= new TreeSet<>();
        //遍历索引集合,按索引集合中的索引进行发牌
        for (int i = 0; i < indexlist.size(); i++) {
            if(i>=indexlist.size()-3){
                底牌.add(indexlist.get(i));
            }
            else if(i%3==0){
                小明.add(indexlist.get(i));
            }else if(i%3==1){
                小黄.add(indexlist.get(i));
            }else{
                小红.add(indexlist.get(i));
            }
        }

        //看牌
        lookPoker("小明",小明,map);
        lookPoker("小黄",小黄,map);
        lookPoker("小红",小红,map);
        lookPoker("底牌",底牌,map);


    }

    private static void lookPoker(String name, TreeSet<Integer> set, HashMap<Integer,String> hashmap) {
        //键找值,查看每个人手上的手牌以及底牌
        System.out.print(name+": ");
        for (Integer i : set) {
            System.out.print(hashmap.get(i)+" ");

        }
        System.out.println();
    }

}

运行后的结果:
在这里插入图片描述


总结

本节主要以斗地主小案例来对集合部分知识的学习做以回顾,里面用到的集合知识也很基础,关键在于活学活用。
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值