斗地主游戏的案例开发

关于java后端的斗地主游戏开发案例(只实现后端部分)

斗地主游戏的案例开发

业务需求分析:

斗地主的做牌, 洗牌, 发牌, 排序(拓展知识), 看牌。
业务: 总共有54张牌。
点数: “3”,”4″,”5″,”6″,”7″,”8″,”9″,”10″,”J”,”Q”,”K”,”A”,”2″
花色: “♠”, “♥”, “♣”, “♦”
大小王: “👲” , “🃏”
点数分别要组合4种花色,大小王各一张。
斗地主:发出51张牌,剩下3张作为底牌。

功能实现:

1.做牌。
2.洗牌。
3.定义3个玩家
4.发牌。
5.排序(拓展)
6.看牌

代码部分:

牌类及其属性方法:

public class Card {
    private String size;
    private String color;
    private int index; // 牌的真正大小

    public Card(){
    }

    public Card(String size, String color, int index) {
        this.size = size;
        this.color = color;
        this.index = index;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    @Override
    public String toString() {
        return size + color;
    }
}

game实现类:

public class GameDemo {
    /**
      1、定义一个静态的集合存储54张牌对象
     */
     public static List allCards = new ArrayList<>();

    /**
      2、做牌:定义静态代码块初始化牌数据
     */
    static {
        // 3、定义点数:个数确定,类型确定,使用数组
        String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        // 4、定义花色:个数确定,类型确定,使用数组
        String[] colors = {"♠", "♥", "♣", "♦"};
        // 5、组合点数和花色
        int index = 0; // 记录牌的大小
        for (String size : sizes) {
            index++;
            for (String color : colors) {
                // 6、封装成一个牌对象。
                Card c = new Card(size, color, index);
                // 7、存入到集合容器中去
                allCards.add(c);
            }
        }
        // 8 大小王存入到集合对象中去 "👲" , "🃏"
        Card c1 = new Card("" ,  "🃏", ++index);
        Card c2 = new Card("" ,  "👲",++index);
        Collections.addAll(allCards , c1 , c2);
        System.out.println("新牌:" + allCards);
    }

    public static void main(String[] args) {

        // 9.洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后" + allCards);

        // 10.发牌 (定义三个玩家,每个玩家的牌也是一个集合容器)
        List lingchuchong = new ArrayList<>();
        List jiumozhi = new ArrayList<>();
        List renyingying = new ArrayList<>();

        // 11.发牌 (从牌集合中发出51张牌给三个玩家,留3张底牌)
        for (int i = 0; i < allCards.size() - 3; i++) {
            //先拿到当前牌对象
            Card c = allCards.get(i);

            if (i % 3 == 0) {
                //请阿冲接牌
                lingchuchong.add(c);
            } else if (i % 3 == 1) {
                jiumozhi.add(c);
            } else if (i % 3 == 2) {
                renyingying.add(c);
            }
        }

        // 12.拿到最后三张牌(把最后三张牌截取成一个子集合)
        List lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());

        // 13.给玩家的牌排序(从大到小)
        sortCards(lingchuchong);
        sortCards(jiumozhi);
        sortCards(renyingying);

        // 14.输出玩家的牌 和底牌
        System.out.println("令狐冲的牌:"+lingchuchong);
        System.out.println("鸠摩智的牌:"+jiumozhi);
        System.out.println("任盈盈的牌:"+renyingying);
        System.out.println("三张底牌:"+lastThreeCards);

    }

    /*
        public static  void sort(List list, Comparator c) {
            list.sort(c);
        }
     */
//    public static void sortCards(List cards) {
//        Collections.sort(cards, new Comparator() {
//            @Override
//            public int compare(Card o1, Card o2) {
//                return o1.getIndex() - o2.getIndex();
//            }
//        });
//
//    }
    public static void sortCards(List cards) {Collections.sort(cards, (o1, o2) -> o2.getIndex() - o1.getIndex());}

}

总结:

首先定义一个静态的集合存储54张牌对象,然后使用静态代码块将牌初始化,组合牌的花色大小并封装为一个对象,存储到静态集合容器中,使用Collections工具类进行洗牌操作,并定义三个玩家对象,将打乱后的牌按顺序分别发给三个对象,重写比较规则,按照规则,将三个对象的牌按 降序 进行排序并输出。

Original: https://www.cnblogs.com/zhangyouren/p/16451642.html
Author: Haziy
Title: 斗地主游戏的案例开发

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621996/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python–反射

    反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法: 1、getattr 获取指定字符串名称的对象属性 2、se…

    数据库 2023年6月9日
    081
  • Java并发

    Java并发 JAVA技术交流群:737698533 CAS compare and swap 比较并交换,cas又叫做无锁,自旋锁,乐观锁,轻量级锁 例如下面的代码,如果想在多线…

    数据库 2023年6月16日
    083
  • 详解Mysql事务隔离级别与锁机制

    一.概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能 就会导致我们说的脏写、 胀读和不可重复读、幻读这些问题。 这些问题的本质…

    数据库 2023年5月24日
    0146
  • 牛客SQL刷题第三趴——SQL必知必会

    【问题】编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现 toy 和 carrots …

    数据库 2023年5月24日
    076
  • 如何把 MySQL 备份验证性能提升 10 倍

    JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考我们的官方文档。最近有个客户在测试时反馈,备份验证的数据准备( xtrabackup –prepare)过程非常…

    数据库 2023年5月24日
    071
  • MySQL启动报:[ERROR] The server quit without updating PID file

    修改配置后 MySQL启动不了,报错: 看见这个不要惊慌,先把刚才修改的配置注释掉,看是不是配置有误!大部分是手误造成。 如果不行,再尝试一下方法: 解决方法 : 给予权限,执行 …

    数据库 2023年6月14日
    097
  • 通过Python收集MySQL MHA 部署及运行状态信息的功能实现

    一. 背景介绍 当集团的MySQL数据库实例数达到2000+、MHA集群规模数百个时,对MHA的及时、高效管理是DBA必须面对的一个挑战。MHA 集群 节点信息 和 运行状态 是管…

    数据库 2023年6月16日
    0116
  • 面试记录

    JVM线程属于用户态还是内核态 当进程运行在ring3级别时为用户态,ring0级别时为内核态 有些操作需要有内核权限才能进行,那么有三种由用户态切换到内核态的情况: 系统调用:操…

    数据库 2023年6月16日
    0104
  • Kafka集群部署

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    077
  • 12 用最有效率的方法计算 2 乘以 8

    2 << 3 左移是位运算符,直接操作内存中整数对应的二进制位,效率高; 左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方。 Original: https:…

    数据库 2023年6月6日
    073
  • 【Java代码之美】 — Java11新特性解读

    1.背景 美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。非常值得大家的关注,可以通过下面的地址进行下载: h…

    数据库 2023年6月6日
    0102
  • MySQL专题1: 字段和索引

    MySQL中存在 float, double 等非标准数据类型, 也有 decimal 这种标准数据类型 其区别在于: float, double等非标准类型在DB中保存的是近似值…

    数据库 2023年5月24日
    091
  • 微信登录前端开发指南

    使用场景 微信公众号内嵌H5网页调用微信登录 在微信浏览器中的网页唤起微信登录界面 详情可以查阅微信登录官方文档 链接地址 功能思路 后台先在微信给开发者提供的测试账号平台上创建应…

    数据库 2023年6月11日
    087
  • HTML&CSS-盒模型运用居中方式合集

    { margin: 0; padding: 0; list-style: none; 清除浏览器默认样式 .father1 { width: 400px; height: 400p…

    数据库 2023年6月11日
    0100
  • HTTP Study

    定义:在两点之间传输文本,视频,图片等超文本数据的协议和规范 HTTP风险 通信使用明文,https通过信息加密(混合加密)解决 无法验证报文的完整性,https通过校验机制(摘要…

    数据库 2023年6月16日
    071
  • 安装多个Jdk

    安装 官方下载地址 目录结构: 配置 PATH 修改 注意:此处的操作可能会有其他未知的问题,最好还是理解window的命令查找机制,然后还是需要根据具体问题具体分析解决。 测试 …

    数据库 2023年6月11日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球