news 2026/5/14 14:01:24

斗地主案例:

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
斗地主案例:

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

- 总共有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(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 14:01:22

DSP28335 ePWM模块实战:从基础波形到高级功能配置

1. DSP28335 ePWM模块基础配置实战 第一次接触DSP28335的ePWM模块时&#xff0c;我被它强大的功能震撼到了。这个模块不仅能生成基本的PWM波形&#xff0c;还能实现死区控制、斩波调制等高级功能&#xff0c;特别适合电机驱动和数字电源开发。下面我就从最基础的PWM波形生成开始…

作者头像 李华
网站建设 2026/5/14 14:01:16

3个维度解锁GanttProject:从零开始掌握开源项目管理神器

3个维度解锁GanttProject&#xff1a;从零开始掌握开源项目管理神器 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 你是否曾为项目管理软件的复杂操作和高昂费用而头疼&#xff1f;是否在…

作者头像 李华
网站建设 2026/5/14 14:01:15

8英寸晶圆市场韧性解析:特色工艺与第三代半导体如何驱动长期需求

1. 市场现状与核心矛盾&#xff1a;短期承压与长期韧性的博弈最近和几位在晶圆厂和设计公司工作的朋友聊天&#xff0c;大家普遍的感觉是&#xff0c;半导体行业这阵子有点“冰火两重天”。一方面&#xff0c;消费电子市场的寒气还没完全散去&#xff0c;库存高企、需求疲软的声…

作者头像 李华
网站建设 2026/5/14 14:01:15

阴阳师自动化脚本技术架构深度解析与性能优化方案

阴阳师自动化脚本技术架构深度解析与性能优化方案 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化脚本&#xff08;OnmyojiAutoScript&#xff09;是一款基于现代Py…

作者头像 李华
网站建设 2026/5/14 14:00:15

服务器转发表完全教程:路由表vs转发表的区别与联系

一、什么是服务器转发表服务器转发表&#xff08;Forwarding Table&#xff0c;亦称FIB表&#xff09;是网络设备中决定数据包“从哪个口发出去”的核心数据结构。它不像路由表那样只告诉你“方向”&#xff08;如下一跳IP&#xff09;&#xff0c;而是直接告诉你“具体走哪条路…

作者头像 李华
网站建设 2026/5/14 13:59:15

AI Agent部署的碎片化困局:为什么推理层和托管层总是两张账单

一个被反复忽视的工程问题做过AI Agent生产部署的人&#xff0c;大概都经历过这个流程&#xff1a;1. 租一台VPS&#xff08;AWS / 阿里云 / DigitalOcean&#xff09; 2. 注册OpenAI或Anthropic账号&#xff0c;充值&#xff0c;申请API Key 3. 在服务器上搭Agent运行环境 4. …

作者头像 李华