斗地主案例:

我们先分析一下业务需求:

  • 总共有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();
    }
}
相关推荐
阿丰资源1 小时前
基于SpringBoot的电影评论网站(含源码)
java·spring boot·后端
小码哥0681 小时前
2026版基于springboot的家政服务预约系统
java·spring boot·后端
赏金术士1 小时前
Kotlin Flow 完全指南
android·开发语言·kotlin
石榴树下的七彩鱼1 小时前
AI抠图效果实测:基于Python的3种背景移除模型对比
开发语言·人工智能·python·ai抠图·石榴智能·背景移除·rmbg
xuhaoyu_cpp_java1 小时前
SpringMVC学习(三)
java·经验分享·笔记·学习·spring
小谢小哥1 小时前
59-消息推送系统详解
java·后端·架构
逻辑驱动的ken1 小时前
Java高频面试考点场景题30
java·开发语言·深度学习·面试·职场和发展
panshihao1 小时前
SSE 是什么?从原理到实战(Java+Vue+Node全示例)
java·后端·http