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

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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】深入解析选择排序

文章目录 什么是选择排序&#xff1f;选择排序的基本实现代码解释选择排序的优化选择排序的性能分析选择排序的实际应用结论 在C语言编程中&#xff0c;选择排序是一种简单且直观的排序算法。尽管它在处理大型数据集时效率不高&#xff0c;但由于其实现简单&#xff0c;常常用于…

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本文介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

直播美颜工具开发教学:视频美颜SDK集成详解

本篇文章&#xff0c;笔者将详细介绍如何在直播应用中集成视频美颜SDK&#xff0c;让你的直播画面焕然一新。 一、什么是视频美颜SDK&#xff1f; 视频美颜SDK是一种软件开发工具包&#xff0c;提供了视频处理和图像增强功能。通过集成视频美颜SDK&#xff0c;开发者可以轻松…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

Win11鼠标卡顿 - 解决方案

问题 使用Win11系统使&#xff0c;鼠标点击任务栏的控制中心&#xff08;如下图&#xff09;时&#xff0c;鼠标会有3秒左右的卡顿&#xff0c;同时整个显示屏幕也有一定程度的卡顿。 问题原因 排除鼠标问题&#xff1a;更换过不同类型的鼠标&#xff0c;以及不同的连接方式…

昇思25天学习打卡营第22天|应用实践之DCGAN生成漫画头像

基本介绍 今日要实践的模型是DCGAN&#xff0c;用于生成漫画头像&#xff0c;生成头像原理可参考GAN图像生成。使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为96*96。本文会先简单介绍DCGAN模型&#xff0c;然后展示自己的运行结果&#xff0c;不作代码…

新增支持GIS地图、数据模型引擎升级、增强数据分析处理能力

为了帮助企业提升数据分析处理能力&#xff0c;Smartbi重点围绕产品易用性、用户体验、操作便捷性进行了更新迭代&#xff0c;同时重磅更新了体验中心。用更加匹配项目及业务需求的Smartbi&#xff0c;帮助企业真正发挥数据的价值&#xff0c;赋能决策经营与管理。 Smartbi用户…

端到端拥塞控制的本质

昨天整理了一篇 bbr 的微分方程组建模(参见 bbr 建模)&#xff0c;算是 bbr 算法终极意义上的一个总结&#xff0c;最后也顺带了对 aimd 的描述&#xff0c;算是我最近比较满意的一篇分享了。那么接下来的问题&#xff0c;脱离出具体算法&#xff0c;上升到宏观层面&#xff0c…

百度“文心•跨模态大模型”又有新动态,支持内容分析时输出自定义标签库

大模型真正的价值在于应用。 一、基本概念 AI大模型具有强大的表征学习能力&#xff0c;能够在海量数据中提取有用的特征&#xff0c;为各种复杂任务提供解决方案。例如GPT-4o、BERT等模型的出现&#xff0c;不仅展示了大规模参数和复杂计算结构的优势&#xff0c;还在自然语…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写&#xff0c;它是Android SDK 中的一个调试工具&#xff0c;允许开发者通过命令行界面与设备进行交互&#xff0c;执行各种操作&#xff0c;如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

如何申请抖音本地生活服务商?3种方式优劣势分析!

随着多家互联网大厂在本地生活板块的布局力度不断加大&#xff0c;以抖音为代表的头部互联网平台的本地生活服务商成为了创业赛道中的大热门&#xff0c;与抖音本地生活服务商怎么申请等相关的帖子&#xff0c;更是多次登顶创业者社群的话题榜单。 就目前的市场情况来看&#x…

微信小程序,订阅消息

微信小程序&#xff0c;订阅消息&#xff0c;完整流程 1.选择需要的模版 2.前端调用订阅消息 注&#xff1a;tmplIds&#xff1a;模板ID模版id,这里也可以选多个 wx.requestSubscribeMessage({tmplIds: [7UezzOrfJg_NIYdE1p*******],success (res) { console.log(res);wx.g…

为什么要使用加密软件?

一、保护数据安全&#xff1a;加密软件通过复杂的加密算法对敏感数据进行加密处理&#xff0c;使得未经授权的人员即使获取了加密数据&#xff0c;也无法轻易解密和获取其中的内容。这极大地提高了数据在存储、传输和使用过程中的安全性。 二、遵守法律法规&#xff1a;在许多国…

axios 下载大文件时,展示下载进度的组件封装——js技能提升

之前面试的时候&#xff0c;有遇到一个问题&#xff1a;就是下载大文件的时候&#xff0c;如何得知下载进度&#xff0c;当时的回复是没有处理过。。。 现在想到了。axios中本身就有一个下载进度的方法&#xff0c;可以直接拿来使用。 下面记录一下处理步骤&#xff1a; 参考…

一款好用的特殊字符处理工具

跟mybatis代码的时候&#xff0c;偶然发现的一款特殊字符处理工具java.lang.StringTokenizer。平常&#xff0c;我们看到的mybatis mapper.xml里面各种换行各种缩进&#xff0c;但日志文件里面的sql都是整整齐齐的。没有换行符&#xff0c;缩进等。就是利用该工具做的格式化处理…

Web前端知识视频教程分享

资料下载地址: https://545c.com/f/45573183-1323561488-e4957b?p7526 (访问密码: 7526)

《前端开发实战 · videojs 视频需求开发》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

026-GeoGebra中级篇-曲线(2)_极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、非线性动力系统的轨迹

除了参数曲线、隐式曲线和显式曲线之外&#xff0c;还有其他类型的曲线表示方法。本篇主要概述一下极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、和非线性动力系统的轨迹&#xff0c;可能没有那么深&#xff0c;可以先了解下。 目录 1. 极坐…

docker学习笔记-03

docker学习笔记 ---每特教育 docker命令 1.docker images 镜像缓存 docker images 镜像缓存 REPOSITORY 存储库名称 Tag 镜像的标签 不写版本号码 默认下载最新latest镜像 IMAGE ID 镜像id CREATED 创建时间 SIZE 大小 docker images 查看本地镜像…

【常见开源库的二次开发】基于openssl的加密与解密——Base的编解码(二进制转ascll)(二)

目录&#xff1a; 目录&#xff1a; 一、 Base64概述和应用场景 1.1 概述 1.2 应用场景 二、Base16 2.1 Base16编码 2.2 Base16编解码 三、Base64 四、OpenSSL BIO接☐ 4.1 Filter BIOs&#xff1a; 4.2 Source/Sink BIOs&#xff1a; 4.3 应用场景&#xff1a; 4.4 具体使用&…