基于Java的斗地主游戏案例开发(做牌、洗牌、发牌、看牌

news2024/12/24 8:04:12

package Game;

import java.util.ArrayList;
import java.util.Collections;

public class PokerGame01 {
    //牌盒
    //♥3 ♣3
    static ArrayList<String> list = new ArrayList<>();

    //静态代码块
    //特点:随着类的加载而在加载的,而且只执行一次。
    static {
        //准备牌
        // "♦", "♣", "♥", "♠"
        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
        String[] color = {"♦", "♣", "♥", "♠"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        for (String c : color) {
            //c表示每一个牌的花色
            for (String n : number) {
                //n表示每一种牌号
                list.add(c + n);
            }
        }
        list.add("大王");
        list.add("小王");

    }

    public PokerGame01() {
        // 洗牌
        Collections.shuffle(list);
        // 发牌
        //定义4个集合,其中3个选手的牌,还要一个是用来存储地主多出来的3张牌
        ArrayList<String> dizhu = new ArrayList<>();
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            //根据索引找到牌号,本质是要把前三张牌给地主
            String poke = list.get(i);//得到了第i张牌
            if (i <= 2) {
                dizhu.add(poke);//前三张给地主
                //依次轮流给3个选手发牌
            } else if (i % 3 == 0) {
                player1.add(poke);
            } else if (i % 3 == 1) {
                player2.add(poke);
            } else {
                player3.add(poke);
            }

        }
        //看牌
        lookpoke("张三",player1);
        lookpoke("李四",player2);
        lookpoke("王五",player3);

    }

    public void lookpoke(String name, ArrayList<String> list) {
        System.out.print(name + ": ");
        for (String poke : list) {
            //循环遍历得到每一张牌
            System.out.print(poke + " ");

        }
        System.out.println();
    }
}

排序的

package Game;

import java.util.*;

public class PokerGame02 {
    //牌盒
    //♥3 ♣3
    //键是序号,牌是值
    //此时只要把牌跟序号产生对应关系即可,不需要按照序号进行排序,所以只需HashMap即可
    static HashMap<Integer, String> hm = new HashMap<>();

    //用来存储序号的单列集合
    static ArrayList<Integer> list = new ArrayList<>();

    //静态代码块
    //特点:随着类的加载而在加载的,而且只执行一次。
    static {
        //准备牌
        // "♦", "♣", "♥", "♠"
        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
        String[] color = {"♦", "♣", "♥", "♠"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
/*
        {1=♦3, 2=♦4, 3=♦5, 4=♦6, 5=♦7, 6=♦8, 7=♦9, 8=♦10, 9=♦J, 10=♦Q, 11=♦K, 12=♦A, 13=♦2, 14=♣3,
        15=♣4, 16=♣5, 17=♣6, 18=♣7, 19=♣8, 20=♣9, 21=♣10, 22=♣J, 23=♣Q, 24=♣K, 25=♣A, 26=♣2, 27=♥3,
         28=♥4, 29=♥5, 30=♥6, 31=♥7, 32=♥8, 33=♥9, 34=♥10, 35=♥J, 36=♥Q, 37=♥K, 38=♥A, 39=♥2, 40=♠3,
         41=♠4, 42=♠5, 43=♠6, 44=♠7, 45=♠8, 46=♠9, 47=♠10, 48=♠J, 49=♠Q, 50=♠K, 51=♠A, 52=♠2}
         很明显可以看出没有按照顺序起好牌 应该先把数字一样的放在一起,而不是把花色一样的放在一起
         解决: 交换color和number即可
*/
        //定义一个序号
        int num = 1;

        for (String n : number) {
            //n表示每一种牌号
            for (String c : color) {
                //c表示每一个牌的花色
                hm.put(num, c + n);
                list.add(num);
                num++;
            }
        }
        hm.put(num, "小王");
        list.add(num);
        num++;
        hm.put(num, "大王");
        list.add(num);
    }

    public PokerGame02() {
        // 洗牌
        Collections.shuffle(list);
        // 发牌
        /*
[39, 35, 7]
[28, 31, 15, 54, 14, 24, 3, 46, 43, 22, 37, 41, 29, 45, 16, 30, 48]
[33, 49, 11, 13, 38, 27, 25, 50, 20, 9, 1, 32, 19, 10, 44, 21, 40]
[53, 8, 34, 36, 17, 42, 5, 18, 2, 23, 12, 26, 4, 47, 6, 51, 52]
用ArrayList集合存储的索引是乱序的,我们本质是要根据序号也就是索引去到map集合里面找到牌,所以序号要有序
 */
        /*
        [5, 10, 34]
        [2, 4, 7, 8, 13, 17, 18, 19, 20, 22, 27, 35, 37, 38, 39, 40, 42]
        [1, 9, 14, 16, 23, 24, 28, 29, 30, 31, 32, 36, 41, 43, 46, 51, 52]
        [3, 6, 11, 12, 15, 21, 25, 26, 33, 44, 45, 47, 48, 49, 50, 53, 54]
         */
        //定义4个集合,其中3个选手的牌,还要一个是用来存储地主多出来的3张牌
        TreeSet<Integer> dizhu = new TreeSet<>();
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();


        //获取所有的键,把这些键放入单列集合当中
        // Set<Integer> integers1 = hm.keySet();

        for (int i = 0; i < list.size(); i++) {
            //根据索引找到牌的序号,本质是要把前三张牌的序号给地主
            int number = list.get(i);  //得到了第i张牌的序号
            if (i <= 2) {
                dizhu.add(number); //前三张牌的序号给地主
                // integers1.add(poke);
                //依次轮流给3个选手发牌
            } else if (i % 3 == 0) {
                player1.add(number);
            } else if (i % 3 == 1) {
                player2.add(number);
            } else {
                player3.add(number);
            }

        }


        //看牌
        lookpoke("底牌",dizhu);
        lookpoke("张三",player1);
        lookpoke("李四",player2);
        lookpoke("王五",player3);


        // look("赵六",integers1);
    }


    /*
     * 参数一:玩家的名字
     * 参数二:牌的序号
     * */
    public void lookpoke(String name, TreeSet<Integer> ts) {
        System.out.print(name + ": ");
        for (int num : ts) {
            //num就是代表的是序号,遍历方法1 通过键找值的方式遍历map集合

            //遍历TreeSet集合得到每一个序号,再拿着序号到Map集合中去找真正的牌
            String poke = hm.get(num);//通过键(序号)拿到了每一张牌(值)
            System.out.print(poke + " ");
        }
        System.out.println();

    }

    //遍历单列集合,得到每一个键;
   /* public void look(String name, Set<Integer> key) {
        System.out.print(name+": ");
        //遍历单列集合,得到每一个键
        for (int num : key) {
            //num代表就是序号
            //通过序号(键)去找到map集合里面的值
            String value = hm.get(num);
            System.out.print(value+" ");

        }
        System.out.println();

    }*/
}

package Game;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;

public class PokerGame03 {
    //牌盒
    //♥3 ♣3
    static ArrayList<String> list = new ArrayList<>();
    //创建一个集合,用来添加牌的价值,牌号是键,价值是值
    static HashMap<String, Integer> hm = new HashMap<>();

    //静态代码块
    //特点:随着类的加载而在加载的,而且只执行一次。
    static {
        //准备牌
        // "♦", "♣", "♥", "♠"
        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
        String[] color = {"♦", "♣", "♥", "♠"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        for (String c : color) {
            //c表示每一个牌的花色
            for (String n : number) {
                //n表示每一种牌号
                list.add(c + n);
            }
        }
        list.add(" 大王");
        list.add(" 小王");
        //指定牌的价值
        //牌上的数字到Map集合中判断是否存在
        //存在,获取价值
        //不存在,本身的数字就是价值
        hm.put("J", 11);
        hm.put("Q", 12);
        hm.put("K", 13);
        hm.put("A", 14);
        hm.put("2", 15);
        hm.put("小王", 50);
        hm.put("大王", 100);
    }

    public PokerGame03() {
        // 洗牌
        Collections.shuffle(list);
        // 发牌
        //定义4个集合,其中3个选手的牌,还要一个是用来存储地主多出来的3张牌
        ArrayList<String> dizhu = new ArrayList<>();
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            //根据索引找到牌号,本质是要把前三张牌给地主
            String poke = list.get(i);//得到了第i张牌
            if (i <= 2) {
                dizhu.add(poke);//前三张给地主
                //依次轮流给3个选手发牌
            } else if (i % 3 == 0) {
                player1.add(poke);
            } else if (i % 3 == 1) {
                player2.add(poke);
            } else {
                player3.add(poke);
            }

        }
        //排序
        order(dizhu);
        order(player1);
        order(player2);
        order(player3);
        //看牌
        lookpoke("张三",player1);
        lookpoke("李四",player2);
        lookpoke("王五",player3);
        lookpoke("底牌",dizhu);

    }

    //利用牌的价值进行排序
    //参数:集合
    //♥5 ♥3 ♥6 ♥7 ♥9
    private void order(ArrayList<String> list) {
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //o1:表示当前要插入到有序序列中的牌
                //o2:表示已经在有序序列中存在的牌

                //负数:o1小 插入到前面
                //正数:o1大 插入到后面
                //0:o1的数字跟o2的数字是一样的,需要按照花色再次排序

                //1.计算o1的花色和价值  
                String color1 = o1.substring(0, 1);;//♥3中的♥
                //价值
                int value1 = getValue(o1);
                //2.计算o2的花色和价值
                String color2= o1.substring(0, 1);//♥3中的♥
                //价值
                int value2 = getValue(o2);
                //3.比较o1和o2的价值    ♥3  ♠3
                int i = value1 - value2;
                return i == 0 ? color1.compareTo(color2) : i;
            }
        });
    }

    //计算牌的价值
    //参数:牌
    //返回值:价值
    public int getValue(String poker) {  //♥3
        //获取牌上的数字
        String number = poker.substring(1);//比如♥3中的3
        //把这里截取出来的结果,让这个结果再Map集合中存在
         /*
        hm.put("J", 11);
        hm.put("Q", 12);
        hm.put("K", 13);
        hm.put("A", 14);
        hm.put("2", 15);
        hm.put("小王", 50);
        hm.put("大王", 100);
       */
        //如果不存在类型转换 如"3"的价值就值3
        //如果存在在map集合里面拿出对应的价值即可

        //拿着数字到map集合中判断是否存在
        if (hm.containsKey(number)) {
            //存在,获取价值
            return hm.get(number);
        } else {
            //不存在,类型转换
            return Integer.parseInt(number);
        }
    }
    public void lookpoke(String name, ArrayList<String> list) {
        System.out.print(name + ": ");
        for (String poke : list) {
            //循环遍历得到每一张牌
            System.out.print(poke + " ");

        }
        System.out.println();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何评估代理的可靠性和安全性

使用IP代理最主要的是要看是否安全&#xff0c;代理IP是否稳定可靠&#xff0c;但是又如何评估一个代理IP的安全性与可靠性呢&#xff0c;下面具体介绍一下。 评估代理的可靠性 服务稳定性 代理服务的稳定性直接影响到业务的连续性和效率。评估代理的服务稳定性重点查看下面…

vue2学习笔记1-官网使用指南和搭建开发环境

官网使用指南 官网地址&#xff1a;介绍 — Vue.js 1、学习 1.1 教程和API 最重要的两个板块。API是VUE的字典&#xff0c;需要时来查阅。 1.2、风格指南 如何写出风格优雅的VUE代码。规则分为四类&#xff1a;必要的&#xff0c;强烈推荐、推荐、谨慎使用。 1.3、示例 …

正点原子STM32(基于HAL库)6

目录 TFTLCD&#xff08;MCU 屏&#xff09;实验TFTLCD 简介TFTLCD 简介液晶显示控制器FSMC 简介FSMC 关联寄存器简介 硬件设计程序设计FSMC 和SRAM 的HAL 库驱动程序流程图程序解析 下载验证 LTDC LCD&#xff08;RGB 屏&#xff09;实验RGBLCD<DC 简介RGBLCD 简介LTDC 简介…

使用Keepalived实现双机热备(虚拟漂移IP地址)详细介绍

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

影响代理运行速度的因素有哪些?

在当今数字化时代&#xff0c;代理服务器被广泛应用于网络接入、数据收集、隐私保护等各种场景。然而代理服务器的运行速度对用户体验和运行效率至关重要。在本文中&#xff0c;我们将讨论影响代理运行速度的主要因素&#xff0c;并介绍如何优化代理服务器以提高运行速度。 第一…

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…

【Orange Pi AIpro测评】基于OrangePi AIpro开发板从零搭建部署小雅影音库

文章目录 一、OrangePi AIpro介绍1.1 OrangePi AIpro 实物图1.2 OrangePi AIpro 示意图1.3 OrangePi AIpro详细信息介绍 二、为 OrangePi 安装 xfce4 桌面及 VNC 服务三、将 Ubuntu 镜像烧写到 TF 卡四、将 Ubuntu 镜像烧写到 NVMe SSD五、远程连接OrangePi AIpro的方式5.1 通过…

[C/C++入门][变量和运算]7、交换变量(空杯思想)

计算机中交换变量的值&#xff0c;可谓是非常常见&#xff0c;常见到几乎考试卷子里都有它。 如图&#xff0c;一杯牛奶&#xff0c;一杯咖啡&#xff0c;如何进行交换呢&#xff1f; 相信懂的都懂&#xff0c;不懂的看完这个图也就懂了。 生活中非常简单的例子&#xff0c;放…

新160个crackme - 003-Cruehead-CrackMe-3

运行分析 发现只有一个退出 PE分析 32位&#xff0c;未知程序&#xff0c;壳未知 静态分析 发现关键字符串 找到关键函数&#xff0c;分析函数&#xff0c;设置断点 动态调试 到断点到if语句&#xff0c;tab键切换至汇编代码 找到跳转语句 右键Assemble jnz改为jz然后回…

Matlab 判断直线上一点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 判断一个点是否位于一直线上有很多方法,这里使用一种很有趣的坐标:Plucker线坐标,它的定义如下所示: 这个坐标有个很有趣的性质,我们可以使用Plucker坐标矢量构建一个Plucker矩阵: 则它与位于对应线上的齐次点…

LaTeX教程(015)-LaTeX文档结构(15)

LaTeX教程(015)- LaTeX \LaTeX LATE​X文档结构(15) 2.4 管理引用 LaTeX \LaTeX LATE​X有一些命令能够很容易的管理文档中的引用。它支持交叉引用(cross-references&#xff0c;文档内部对象的引用)&#xff0c;文献引用(bibliographic&#xff0c;对外部文档的引用)&#xf…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript&#xff0c;自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient&#xff1a;开始听写&#xff0c;注意下一步要尽快开启识别和传数据&#xff0c;否则6秒后会关闭 startRecognition…

AndroidStudio 删除未使用的资源精简apk体积

历史项目开发下来&#xff0c;会有很多未使用的类、布局xml 、资源文件等。 未使用的图片资源&#xff0c;会增大apk体积。 为了精简应用&#xff0c;需要去掉。 查找未使用的资源 Code – Analyze Code – Run Inspection by Name 输入 Unused 会有提示 选择要查找的目录…

C#环境与数据类型

文章目录 C#环境.NET 框架集成开发环境 创建一个C#项目数据类型值类型引用类型对象类型object动态类型dynamic字符串类型string 指针类型 类型转换隐式转换显示转换&#xff08;强制转换&#xff09;C#提供的类型转换方法Convert类Parse方法TryParse方法 C#环境 .NET 框架 C#是…

ESP32CAM人工智能教学13

ESP32CAM人工智能教学13 openCV 安装 小智发现openCV是一款非常出色的机器视觉软件&#xff0c;可以配合ESP32Cam的摄像头&#xff0c;开发出许许多多的人工智能应用情境。 下载视频服务驱动库 OpenCV是开源的计算机视觉驱动库&#xff0c;可以应用于机器人的图形处理、机器学…

Mac清理软件cleanmymac x4.14.4破解版,2024年有免费cleanmymac x激活码

​ CleanMyMac X 4.14.4破解版可以快速识别并删除占用磁盘空间的无用文件&#xff0c;提升我们系统的存储空间。它还可以优化启动项、修复系统错误和保护隐私等。总之CleanMyMac X十分强大有需要的赶快下载吧&#xff0c; CleanMyMac X 许可证激活码:ak39840506641bjckr 需要…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细&#xff0c;具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多&#xff0c;主要功能是…

7.16做题总结

今日也是让我看到了繁神的ACM历程&#xff0c;确实&#xff0c;我觉得繁神的历程里面确实有一句很好 不想打算法竞赛了。这是因为有别的事情要做&#xff0c;不是因为我打不动。    不想打比赛凌晨两点才睡了。因为我会困。    不想在群里和高水平选手水群了&#xff0c;因…

BayesPrism(贝叶斯棱镜法)可提取单细胞数据去卷积后将信息映射至bulkRNA数据

贝叶斯棱镜法作为一种工具可以根据scRNA数据(作为先验模型)去推断bulkRNA数据中肿瘤微环境组成(不同免疫细胞组分/不同细胞群)和基因表达情况。 开发者展示的图片就很形象了&#xff0c;左边图展示了把标注了不同细胞类型的单细胞数据作为先验信息(prior info)的基因信息和bul…

【内网渗透】内网渗透学习之域渗透常规方法

域渗透常规方法和思路 1、域内信息收集1.1、获取当前用户信息1.1.1、获取当前用户与域 SID1.1.2、查询指定用户的详细信息 1.2、判断是否存在域1.2、查询域内所有计算机1.3、查询域内所有用户组列表1.4、查询所有域成员计算机列表1.5、获取域密码信息1.6、获取域信任信息1.7、查…