模拟斗地主

本文介绍了两种使用Java实现斗地主游戏洗牌和发牌的方法。第一种方法使用无序数组进行洗牌,并直接发牌;第二种方法则利用有序数组确保玩家手中的牌保持有序状态。每种方法都详细说明了步骤并提供了完整的代码示例。

(1)无序
import java.util.ArrayList;
import java.util.Collections;

/*
模拟斗地主的洗牌和发牌

  • *思路:

  • 1)创建一个牌盒(容器:集合)
  • ArrayList<String>
  • 2)装牌
  • 定义花色数组和点数数组(A,K)
  • 红桃A
  • 黑桃A
  • 梅花A
  • 方片A
  • ....
  • 3)洗牌
  • Collections中的随机置换的功能
  • 4)发牌
  • 遍历集合(获取集合中的具体的牌)
  • 需要判断:选择结构语句
  • 1--->A 2--->B 3----C
  • 4---A .................
  • 斗地主三个玩
  • 发个三个人----->三个人分别ArrayList<String>
  • 如果当前牌 % 3 ==0/1/2
  • 5)看牌
  • 三个人看牌:将看牌封装成一个功能(独立的 代码块)
  • */
    public class Poker {

    public static void main(String[] args) {

    //1.创建牌盒
    ArrayList<String> array = new ArrayList<String>() ;
    
    //2.装牌
    //2.1创建花色数组
    String[] colors = {"♥","♠","♣","♦"} ;
    //2.2 创建点数数组
    String[] numbers = {"A","2","3","4","5","6","7","8","9",
                        "10","J","Q","K"} ;
    for(String color :colors) {
        for(String number:numbers) {
                String poker = color.concat(number) ;
                array.add(poker) ;
        }
    }
    
    //添加小王和大王
    array.add("小王") ;
    array.add("大王") ;
    
    //3. 洗牌
    Collections.shuffle(array);
    
    //4.发牌
    //现在三个人玩,把每一个看成集合ArrayList
    ArrayList<String> player1 = new ArrayList<String>() ;
    ArrayList<String> player2 = new ArrayList<String>() ;
    ArrayList<String> player3 = new ArrayList<String>() ;
    ArrayList<String> diPai = new ArrayList<String>() ;
    
    //有规律的:遍历ArrayList集合 使用普通for循环,获取到集合的元素
    //通过元素 % 人数 = 0  /1/2 /..
    for(int x = 0 ; x < array.size() ; x ++) {
        //获取到每一个元素
        if(x >= array.size() -3) {
            diPai.add(array.get(x)) ;
        }else if(x % 3 == 0) {
            //玩家1
            player1.add(array.get(x)) ;
        }else if(x % 3 == 1) {
            //玩家2
            player2.add(array.get(x)) ;
        }else if(x % 3 == 2) {
            player3.add(array.get(x)) ;
        }
    }
    
    //5)看牌 

    // * 三个人看牌:将看牌封装成一个功能(独立的 代码块)
    lookPoker("玩家1", player1);
    lookPoker("玩家2", player2);
    lookPoker("玩家3", player3);
    lookPoker("底牌", diPai);
    }

    public static void lookPoker(String name,ArrayList<String> array) {
    System.out.print(name+"的牌是:");
    for(String s : array) {
    System.out.print(s+" ");
    }
    System.out.println();
    }
    }
    (2)有序
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.TreeSet;

/**

  • 模拟斗地主的洗牌和发牌,发到每一个手上的牌是保证有序的.. 思考: 1)创建牌盒
  • 创建两个集合:HashMap<Integer,String>,ArrayList<Integer> 2)装牌 定义花色数组和点数数组
  • 从0开始编号,将编号和编号对应的牌都存储到HashMap集合中,同时往ArrayList单独存储编号 3)洗牌 洗的是编号 4)发牌
  • 发的也是编号,为了保证牌有序,集合由TreeSet集合接收 5)看牌 封装功能
  • */
    public class Porker2 {

    public static void main(String[] args) {
    // 1. 创建两个集合:HashMap<Integer,String>,ArrayList<Integer>
    HashMap<Integer, String> hm = new HashMap<Integer, String>();
    ArrayList<Integer> array = new ArrayList<Integer>();

    // 2.装牌
    // 2.1 定义花色数组和点数数组
    String[] colors = { "♥", "♠", "♣", "♦" };
    String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
    
    // 从0开始编号,将编号和编号对应的牌都存储到HashMap集合中,同时往ArrayList单独存储编号
    int index = 0;
    // 拼接
    for (String number : numbers) {
        for (String color : colors) {
            String poker = color.concat(number);
            hm.put(index, poker);
            array.add(index);
            index++;
        }
    }
    
    // 装小王和大王
    hm.put(index, "小王");
    array.add(index);
    index++;
    hm.put(index, "大王");
    array.add(index);
    // 不能++了,角标越界
    
    // 洗牌
    Collections.shuffle(array);
    
    // 4)发牌
    // 发的也是编号,为了保证牌有序,集合由TreeSet集合接收
    TreeSet<Integer> player1 = new TreeSet<Integer>();
    TreeSet<Integer> player2 = new TreeSet<Integer>();
    TreeSet<Integer> player3 = new TreeSet<Integer>();
    TreeSet<Integer> diPai = new TreeSet<Integer>();
    
    // 有规律的:遍历ArrayList集合 使用普通for循环,获取到集合的元素
    // 通过元素 % 人数 = 0 /1/2 /..
    for (int x = 0; x < array.size(); x++) {
        // 获取到每一个元素
        if (x >= array.size() - 3) {
            diPai.add(array.get(x));
        } else if (x % 3 == 0) {
            // 玩家1
            player1.add(array.get(x));
        } else if (x % 3 == 1) {
            // 玩家2
            player2.add(array.get(x));
        } else if (x % 3 == 2) {
            player3.add(array.get(x));
        }
    }

    // 5)看牌 封装功能
    lookPoker("玩家1", player1, hm);
    lookPoker("玩家2", player2, hm);
    lookPoker("玩家3", player3, hm);
    lookPoker("底牌", diPai, hm);

    }

    public static void lookPoker(String name,TreeSet<Integer> ts,
    HashMap<Integer, String> hm) {
    System.out.print(name+"的牌是:");
    //遍历TreeSet集合获取到每一个编号
    for(Integer key :ts) {
    //获取到编号,通过编号找牌(在HashMap中找)
    String value = hm.get(key) ;
    System.out.print(value+" ");
    }
    System.out.println();
    }
    }

转载于:https://blog.51cto.com/13670525/2117644

【源码免费下载链接】:https://renmaiwang.cn/s/os2te 大整数乘法是计算机科学中的个重要领域,特别是在算法设计和数学计算中有着广泛应用。它涉及到处理超过标准整型变量范围的数值运算。在C++编程语言中,处理大整数通常需要自定义数据结构和算法,因为内置的`int`、`long long`等类型无法满足大整数的存储和计算需求。以下是对这个主题的详细阐述:1. **大整数数据结构**: 在C++中,实现大整数通常采用数组或链表来存储每位数字。例如,可以使用个动态分配的数组,每个元素表示个位上的数字,从低位到高位排列。这种数据结构允许我们方便地进行加减乘除等操作。2. **乘法算法**: - **暴力乘法**:最直观的方法是类似于小学的竖式乘法,但效率较低,时间复杂度为O(n^2)。 - **Karatsuba算法**:由Alexander Karatsuba提出,将两个n位数的乘法转化为三个较小的乘法,时间复杂度为O(n^1.585)。 - **Toom-Cook算法**:比Karatsuba更通用,通过多项式插值和分解进行计算,有不同的变体,如Toom-3、Toom-4等。 - **快速傅里叶变换(FFT)**:当处理的大整数可以看作是多项式系数时,可以利用FFT进行高效的乘法,时间复杂度为O(n log n)。FFT在数论和密码学中尤其重要。3. **算法实现**: 实现这些算法时,需要考虑如何处理进位、溢出等问题,以及如何优化代码以提高效率。例如,使用位操作可以加速某些步骤,同时要确保代码的正确性和可读性。4. **源代码分析**: "大整数乘法全解"的源代码应包含了上述算法的实现,可能还包括了测试用例和性能比较。通过阅读源码,我们可以学习如何将理论算法转化为实际的程序,并理解各种优化技巧。5. **加说明**: 通常,源代码附带的说明会解释
内容概要:本文详细介绍了个基于Java与Vue技术栈的向量数据库语义检索与相似文档查重系统的设计与实现。系统通过集成BERT等深度学习模型将文本转化为高维语义向量,利用Milvus等向量数据库实现高效存储与近似最近邻检索,结合前后端分离架构完成从文档上传、向量化处理、查重分析到结果可视化的完整流程。项目涵盖需求分析、系统架构设计、数据库建模、API接口规范、前后端代码实现及部署运维等多个方面,并提供了完整的代码示例和模块说明,支持多格式文档解析、智能分段、自适应查重阈值、高亮比对报告生成等功能,具备高扩展性、安全性和多场景适用能力。; 适合群:具备定Java和Vue开发基础的软件工程师、系统架构师以及从事自然语言处理、知识管理、内容安全等相关领域的技术员,尤其适合高校、科研机构、企业IT部门中参与智能文档管理系统开发的专业员。; 使用场景及目标:①应用于学术论文查重、企业知识产权保护、网络内容监控、政务档案管理等需要高精度语义比对的场景;②实现深层语义理解下的文档查重,解决传统关键词匹配无法识别语义改写的问题;③构建可扩展、高可用的智能语义检索平台,服务于多行业数字化转型需求。; 阅读建议:建议读者结合提供的完整代码结构与数据库设计进行实践操作,重点关注文本向量化、向量数据库集成、前后端协同逻辑及安全权限控制等核心模块。在学习过程中应逐步部署运行系统,调试关键接口,深入理解语义检索与查重机制的工作原理,并可根据实际业务需求进行功能扩展与模型优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值