我们先分析一下业务需求:
- 总共有54张牌,每一张牌有花色和点数两个属性、为了排序还可以再加一个序号
- 点数可以是:`"3","4","5","6","7","8","9","10","J","Q","K","A","2"`
- 花色可以是:`"♣","♠","♥","♦"`
- 斗地主时:三个玩家没人手里17张牌,剩余3张牌作为底牌
第一步:为了表示每一张牌有哪些属性,首先应该新建一个扑克牌的类
第二步:启动游戏时,就应该提前准备好54张牌
第三步:接着再完全洗牌、发牌、对牌排序、看牌的业务逻辑
```
先来完成第一步,定义一个扑克类Card
public class Card { private String number; private String color; // 每张牌是存在大小的。 private int size; // 0 1 2 .... public Card() { } public Card(String number, String color, int size) { this.number = number; this.color = color; this.size = size; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } @Override public String toString() { return color + number ; } }再完成第二步,定义一个房间类,初始化房间时准备好54张牌
public class Room { // 必须有一副牌。 private List<Card> allCards = new ArrayList<>(); public Room(){ // 做出54张牌,存入到集合allCards // a、点数:个数确定了,类型确定。 String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; // b、花色:个数确定了,类型确定。 String[] colors = {"♠", "♥", "♣", "♦"}; int size = 0; // 表示每张牌的大小 // c、遍历点数,再遍历花色,组织牌 for (String number : numbers) { // number = "3" size++; // 1 2 .... for (String color : colors) { // 得到一张牌 Card c = new Card(number, color, size); allCards.add(c); // 存入了牌 } } // 单独存入小大王的。 Card c1 = new Card("", "🃏" , ++size); Card c2 = new Card("", "👲" , ++size); Collections.addAll(allCards, c1, c2); System.out.println("新牌:" + allCards); } }最后完成第三步,定义一个启动游戏的方法,完成洗牌、发牌、捋牌、看牌的业务逻辑
/** * 启动游戏 */ public void start() { // 1、洗牌: allCards Collections.shuffle(allCards); System.out.println("洗牌后:" + allCards); // 2、发牌,首先肯定要定义 三个玩家。 List(ArrayList) Set(TreeSet) List<Card> linHuChong = new ArrayList<>(); List<Card> jiuMoZhi = new ArrayList<>(); List<Card> renYingYing = new ArrayList<>(); // 正式发牌给这三个玩家,依次发出51张牌,剩余3张做为底牌。 // allCards = [♥3, ♣10, ♣4, ♥K, ♦Q, ♣2, 🃏, ♣8, .... // 0 1 2 3 4 5 6 ... % 3 for (int i = 0; i < allCards.size() - 3; i++) { Card c = allCards.get(i); // 判断牌发给谁 if(i % 3 == 0){ // 请啊冲接牌 linHuChong.add(c); }else if(i % 3 == 1){ // 请啊鸠来接牌 jiuMoZhi.add(c); }else if(i % 3 == 2){ // 请盈盈接牌 renYingYing.add(c); } } // 3、对3个玩家的牌进行排序 sortCards(linHuChong); sortCards(jiuMoZhi); sortCards(renYingYing); // 4、看牌 System.out.println("啊冲:" + linHuChong); System.out.println("啊鸠:" + jiuMoZhi); System.out.println("盈盈:" + renYingYing); /** * 5、获取底牌 51 52 53 * public List<E> subList(int fromIndex, int toIndex){...} * 作用:返回包含从索引 fromIndex(包括)到索引 toIndex(不包括)元素的List集合。 */ List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size()); System.out.println("底牌:" + lastThreeCards); // 比如啊鸠是地主 需要获取到底牌 jiuMoZhi.addAll(lastThreeCards); // 获取到底牌后再次进行排序 sortCards(jiuMoZhi); System.out.println("啊鸠抢到地主后:" + jiuMoZhi); } /** * 集中排序 * @param cards */ private void sortCards(List<Card> cards) { Collections.sort(cards, new Comparator<Card>() { @Override public int compare(Card o1, Card o2) { return o1.getSize() - o2.getSize(); // 升序排序 // return o2.getSize() - o1.getSize(); // 降序排序 } }); }测试类:
/** * 我们先分析一下业务需求: * * - 总共有54张牌,每一张牌有花色和点数两个属性、为了排序还可以再加一个序号 * - 点数可以是:`"3","4","5","6","7","8","9","10","J","Q","K","A","2"` * - 花色可以是:`"♣","♠","♥","♦"` * - 斗地主时:三个玩家每人手里17张牌,剩余3张牌作为底牌 */ public class GameDemo { public static void main(String[] args) { // 1、牌类 // 2、房间 Room m = new Room(); // 3、启动游戏 m.start(); } }