斗地主案例:

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

  • 总共有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();
    }
}
相关推荐
Lhappy嘻嘻44 分钟前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
科技道人1 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
伊玛目的门徒1 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇3 小时前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾5 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾5 小时前
Rust 学习目录
开发语言·学习·rust
我命由我123455 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑6 小时前
Sentinel安装
java·后端·微服务
云泽8086 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范