Java通过枚举类型的部分遍历实现创建一副54张扑克牌(含大小王)

编程入门 行业动态 更新时间:2024-10-21 09:18:22

Java通过枚举类型的部分遍历实现创建一副54张扑克牌(含大<a href=https://www.elefans.com/category/jswz/34/1766301.html style=小王)"/>

Java通过枚举类型的部分遍历实现创建一副54张扑克牌(含大小王)

开篇声明:只是学习过程中碰到的问题与解决方案的一个记录,内容可能有错漏,在大佬们看来也可能很简单,有问题欢迎指出,谢谢~

今天在写DEMO练手时,碰一个“创建一副扑克牌”的需求。最方便的做法自然是通过数组实现:

public class Card {/*** 花色*/private String color;/*** 点数*/private String point;
}        public void initCardHeap(){List<Card> cardsHeap = new ArrayList<>(54);String[] colors = {"♥", "♦", "♣", "♠"};String[] points = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};for (String color : colors) {for (String point : points) {cardsHeap.add(new Card(color, point));}}cardsHeap.add(new Card("", "大🤡"));cardsHeap.add(new Card("", "小🤡"));
}

这种做法用是没问题的。不过前几天刚学了枚举类型,那必须得试试啊。用枚举类型又该怎么做呢?

上网查了一下,用枚举类型创建扑克牌的例子有很多,但都是52张的(不含大小王),因为扑克牌正好是4花色,每种花色13张牌,通过获取枚举值的迭代器,可以很轻松地完成遍历生成:

 for (Color color : Color.values()) {for (Point point : Point.values) {cardsHeap.add(new Card(color, point));}
}

但如果在枚举值里加上大小王,就无法再用这种方式生成了,不然会生成每种花色的大小王各一对。如此一来,就必须通过部分遍历枚举值来实现,将大小王排除在遍历范围外。

一开始没想到做法,不过仔细看了下枚举值的方法,发现values()方法返回的正是枚举值的数组。既然能拿到数组,那就好办了,直接通过i下标访问限制遍历范围就好了。

public enum Color {/*** 黑桃,红桃,方块,梅花,无花色(大小王)*/SPADE("♠"),HEART("♥"),DIAMOND("♦"),CLUB("♣"),NULL("");/*** 花色图案*/private String figure;
}public enum Point {/*** 扑克牌点数,从2到A,外加鬼牌*/THREE("3"),FOUR("4"),FIVE("5"),SIX("6"),SEVEN("7"),EIGHT("8"),NINE("9"),TEN("10"),JACK("J"),QUEEN("Q"),KING("K"),ACE("A"),DEUCE("2"),BLACK_JOKER("小🤡"),RED_JOKER("大🤡");/*** 点数*/private String value;
}private void prepareCardsHeap() {//初始化牌堆cardsHeap = new ArrayList<>(54);Color[] colors = Color.values();Point[] points = Point.values();//通过下标限制枚举值数组访问范围for (int i = 0; i < 4; i++) {for (int j = 0; j < 13; j++) {cardsHeap.add(new EnumCard(colors[i], points[j]));}}cardsHeap.add(new EnumCard(Color.NULL, Point.BLACK_JOKER));cardsHeap.add(new EnumCard(Color.NULL, Point.RED_JOKER));

还可以通过EnumCard类实现comparable接口的方式实现扑克排序(比如斗地主洗牌发牌后给玩家手牌的排序):

    @Overridepublic int compareTo(EnumCard o) {if (this.getPoint().ordinal() > o.getPoint().ordinal()) {return 1;} else if (this.getPoint().ordinal() < o.getPoint().ordinal()) {return -1;//点数相等,比花色} else {return Integerpare(this.getColor().ordinal(), o.getColor().ordinal());}}

更多推荐

Java通过枚举类型的部分遍历实现创建一副54张扑克牌(含大小王)

本文发布于:2024-02-26 05:53:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701535.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小王   遍历   扑克牌   类型   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!