Java——使用集合实现简单的斗地主发牌功能(两种方式简单粗暴!!!)

简介: Java——使用集合实现简单的斗地主发牌功能(两种方式简单粗暴!!!)

大家好啊!!!暑假在家,想必大家该追剧的追剧,该打游戏的打游戏,反正总会找点喜欢的事情去做,可以说是无忧无虑咯!!! 然而我却和 Java 集合打了一个星期的交道,不管怎样,也算是对集合有了一点了解吧。


所以,我就想着用刚学过的集合搞点什么有趣的小程序来感受一下编程的乐趣,因博主能力有限,思来想去,不如自己写一个模拟斗地主发牌的这样一个小程序吧!!!(虽然博主经常把欢乐斗输完,但还是很喜欢玩欢乐斗地主的。😁😁😁)


好了,话不多说,我用了下面这两种方式来实现斗地主发牌功能,如果你学过 Java 集合,那么这块内容理解起来对你一定不是问题,我在代码中也给出了详细的注释,我们一起来看一下吧:👇👇👇


方式1:(使用ArrayList集合实现无序发牌)


import java.util.*;
class FightAgainstLandlord {
  private ArrayList<String> poker;//poker集合存储54张牌
  private String[] colors;//colors数组存储牌的花色
  private String[] numbers;//numbers数组存储牌的大小
  //定义类的构造方法
  public FightAgainstLandlord(ArrayList<String> poker,String[] colors,String[] numbers) {
    this.poker=poker;
    this.colors=colors;
    this.numbers=numbers;
  }
  //存储54张牌
  public ArrayList<String> fiftyfive() {
    for(String color: colors) {
      for(String number: numbers) {
        //使用poker集合依次获取54张牌的花色和大小,例如:color 黑桃 + number 5
        poker.add(color + number);
      }
    }
    poker.add("大王");//我们在玩斗地主,所以别忘了还有大小王!!!
    poker.add("小王");
    //使用Collections工具类的shuffle()方法将获取到的54张牌的顺序打乱,也就是“洗牌”
    Collections.shuffle(poker);
    return poker;//这是一个使用泛型、接收集合的方法,最后要返回poker集合
  }
  public ArrayList<String> licensing(int k,ArrayList<String> poker) {
    /**获取三位玩家以及底牌
     * k=1,2,3分别代表三位玩家的牌
     * k=其他数字(在这里,我定义为4)代表底牌
     */
    //三位玩家和底牌需要创建成相应的集合来存储各自的牌
    ArrayList<String> player1=new ArrayList<String>();
    ArrayList<String> player2=new ArrayList<String>();
    ArrayList<String> player3=new ArrayList<String>();
    ArrayList<String> basepoker=new ArrayList<String>();
    for(int i=0;i<poker.size();i++) {//poker集合中存储了54张牌,使用size()方法获取集合中元素个数
      String card=poker.get(i);//使用get(index)方法返回该索引对应poker集合中的那张牌
      if(i<51) {//区间[0,51)一共51张牌,为玩家牌
        if(i%3==0) {//三位玩家按照顺序发牌,对3求余即可
          player1.add(card);//玩家1的牌
        }else if(i%3==1) {
          player2.add(card);//玩家2的牌
        }else {
          player3.add(card);//玩家3的牌
        }
      }else {
        basepoker.add(card);//底牌
      }
    }
    /**返回每位玩家各自的牌,以及底牌
     * 这是一个使用泛型、接收集合的方法,最后要返回相应的集合
     */
    if(k==1) {
      return player1;
    }else if(k==2) {
      return player2;
    }else if(k==3) {
      return player3;
    }else {
      return basepoker;
    }
  }
}
public class LandlordDemo {
  public static void main(String[] args) {
    ArrayList<String> poker=new ArrayList<String>();//创建一个ArrayList集合来存储扑克牌
    String[] colors= {"♠","♥","♦","♣"};//四种花色
    String[] numbers={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};//从A到K
    //这里我们new一个斗地主,使用构造方法创建一个实例对象
    FightAgainstLandlord fight=new FightAgainstLandlord(poker,colors,numbers);
    //再创建一个ArrayList集合去接收54张牌
    ArrayList<String> pokers=fight.fiftyfive();
    //获取三位玩家各自的17张牌,以及3张底牌
    ArrayList<String> player1=fight.licensing(1,pokers);
    ArrayList<String> player2=fight.licensing(2,pokers);
    ArrayList<String> player3=fight.licensing(3,pokers);
    ArrayList<String> basepoker=fight.licensing(4,pokers);
    //输出本次斗地主三位玩家分到的牌,以及3张底牌
    System.out.println("player1:" + player1);
    System.out.println("player2:" + player2);
    System.out.println("player3:" + player3);
    System.out.println("basepoker:" + basepoker);
  }
}



2.(使用HashMap、ArrayList、TreeSet集合实现有序发牌)


import java.util.*;
public class PokerDemo {
  public static void main(String[] args) {
    //创建一个HashMap集合,键对应牌的编号Integer类型,值对应牌的大小String类型
    HashMap<Integer,String> hashmap=new HashMap<Integer,String>();
    //创建一个ArrayList集合,存储牌的编号
    ArrayList<Integer> arraylist=new ArrayList<Integer>();
    //创建牌的花色数组
    String[] colors={"♠","♥","♦","♣"};
    //创建牌的大小数组
    String[] numbers={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    //索引从0开始向hashmap集合中存储牌的编号的大小,向arraylist集合中存储牌的编号
    int index=0;
    for(String number : numbers) {
      for(String color : colors) {
        //使用String类的concat()方法连接字符串,显然是将牌的大小连接到花色后面
        String poker=color.concat(number);//例如:color 红桃 + number 5
        hashmap.put(index,poker);//将每张牌对应的编号存储在hashmap集合的键中
        arraylist.add(index);//将每张牌的编号同样存储在arraylist集合中
        index++;//每存储一张牌,编号加1
      }
    }
    //我们玩的是斗地主,所以别忘了还有大小王哦!!!
    hashmap.put(index,"大王");//存入大王
    arraylist.add(index);//大王对应的编号
    index++;//编号加1
    hashmap.put(index,"小王");//存入小王
    arraylist.add(index);//小王对应的编号
    /*使用Collections工具类的shuffle()方法将牌的编号顺序打乱
      因为每张牌的都有对应的编号,所以将牌的编号打乱,也就是将牌的花色大小给打乱*/
    Collections.shuffle(arraylist);//俗称“洗牌”
    //发牌:为了保证发出的牌类似欢乐斗地主那样是排好序的,所以这里我们使用TreeSet集合接收
    TreeSet<Integer> player1=new TreeSet<Integer>();//玩家1
    TreeSet<Integer> player2=new TreeSet<Integer>();//玩家2
    TreeSet<Integer> player3=new TreeSet<Integer>();//玩家3
    TreeSet<Integer> basepoker=new TreeSet<Integer>();//底牌
    for(int i=0;i<arraylist.size();i++) {//arraylist集合的长度为54,下标则是从0到53
      if(i<51) {//前51张牌按顺序依次发给3位玩家
        if(i%3==0) {
          //这里通过ArrayList集合中的get(index)方法获取索引i对应的牌的编号
          player1.add(arraylist.get(i));
        }else if(i%3==1) {
          player2.add(arraylist.get(i));
        }else {
          player3.add(arraylist.get(i));
        }
      }else {
        basepoker.add(arraylist.get(i));
      }
    }
    //通过遍历TreeSet集合,获取牌的编号,进而到HashMap集合中找到对应牌的花色大小
    PokerDemo.licensing("player1:",player1,hashmap);
    PokerDemo.licensing("player2:",player2,hashmap);
    PokerDemo.licensing("player3:",player3,hashmap);
    PokerDemo.licensing("basepoker:",basepoker,hashmap);
  }
  public static void licensing(String name,TreeSet<Integer> ts,HashMap<Integer,String> hashmap) {
    System.out.print(name + "[");
    int num=0;
    for(Integer key : ts) {//遍历形参中的每一个TreeSet集合
      //通过HashMap集合中的get(key)方法获取键对应的值(也就是牌的编号对应牌的花色大小)
      String value=hashmap.get(key);
      //这里的if-else是控制一下输出格式,保证最后一张牌的后面没有多余的逗号
      if(num<ts.size()-1) {
        System.out.print(value + " , ");
      }else {
        System.out.print(value);
      }
      num++;
    }
    System.out.println("]");
  }
}


相关文章
|
1天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
13 6
|
1天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
11 4
|
1天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
9 3
|
3天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
11 5
|
1天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
7 2
|
1天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
10 2
|
3天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
4天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
19 3