JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)

news2024/12/23 0:54:48

目录

需求与分析

具体实现

牌类定义

房间类定义

初步测试 

启动游戏

运行案例


需求与分析

需求

  • 总共有54张牌
  • 点数:"3","4","5","6","7","8","9","10","J","Q","K","A","2"
  • 花色:"♠","♥","♣","♦"
  • 大小王:"👲","🃏"
  • 斗地主:发出51张牌,剩下3张作为底牌

分析实现

  • 在启动游戏房间的时候,应该提前准备好54张牌
  • 接着,需要完成洗牌、发牌、对牌排序、看牌

具体实现

牌类定义

package user.Collection;

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 number + color;
    }
}

房间类定义

package user.Collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Room {
    //首先必须有一副牌
    private List<Card> allCards = new ArrayList<>();

    public Room(){
        //1.做出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 3 ......
            for(String color:colors){
                //得到一张牌
                Card d = new Card(number,color,size);
                allCards.add(d);    //存入牌库
            }
        }

        //单独存入大小王
        Card d1 = new Card("","🃏",++size);  //小王
        Card d2 = new Card("","👲",++size); //大王
        Collections.addAll(allCards,d1,d2);
    }
}

初步测试 

在Room类中加一下输出语句:(已重写Card类的toString方法)

在主程序中运行:

 

运行结果:

启动游戏

在Room类中编写启动游戏的方法,再调用

    public void start() {
        //1.洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);

        //2.发牌,发给三个玩家 还是使用List集合
        List<Card> MegMarch = new ArrayList<>();
        List<Card> JoMarch = new ArrayList<>();
        List<Card> BethMarch = new ArrayList<>();

        //正式发牌给这三个玩家,依次发出51张牌,剩余三张作为底牌
        for(int i = 0;i < allCards.size();i++){
            Card c = allCards.get(i);
            //判断发牌给谁
            if(i % 3 == 0){
                //发牌给梅格
                MegMarch.add(c);
            }else if(i % 3 == 1){
                //发牌给乔
                JoMarch.add(c);
            }else if(i % 3 == 2){
                //发牌给贝丝
                BethMarch.add(c);
            }
        }
        
        //3.对三个玩家的牌进行排序
        sortCards(MegMarch);
        sortCards(JoMarch);
        sortCards(BethMarch);

        //4.看牌
        System.out.println("梅格 :" + MegMarch);
        System.out.println("乔   :" + JoMarch);
        System.out.println("贝丝 :" + BethMarch);
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3,allCards.size());
        System.out.println("底牌 :" + lastThreeCards);
        //假设乔抢到了地主
        JoMarch.addAll(lastThreeCards);
        sortCards(JoMarch);
        System.out.println("乔抢到地主后:" + JoMarch);
    }

    private void sortCards(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o2.getSize() - o1.getSize(); //降序排序
            }
        });
    }

运行案例


END


学习自:黑马程序员——JavaSE课程

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

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

相关文章

C++ 如何快速实现一个容器的迭代器

100编程书屋_孔夫子旧书网 引言 C++的标准库中的容器都会提供迭代器,如果一个容器满足forward_range,那么这个容器一般会提供以下成员类型和函数: iteratorconst_iteratorbeginendbegincend如果该容器还满足bidirectional_range,那么该容器还会额外提供以下成员类型和函数…

MES在数字化工厂中怎么落地?西门子,施耐德为例

在当前制造业高度竞争的环境下&#xff0c;制造企业为了提高生产效率、降低成本以及优化资源利用&#xff0c;需要借助现代化的制造执行系统&#xff08;MES&#xff09;。MES&#xff0c;作为制造业中一种重要的管理信息系统&#xff0c;是数字化工厂中至关重要的一环&#xf…

上位机图像处理和嵌入式模块部署(f103 mcu的按键输入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 做技术的同学,大部分都会把精力放在技术本身,却忽视了学的东西有什么实际的用途。就拿gpio来说,一般我们点灯也好、做输入也好,最多也就是当成一个实验demo在使用。可是大家有没…

JavaEE---多线程进阶之JUC的常见类

JUC(java.util.conccurrent) : concurrent(并发)是多线程相关的组件 Callable接口 也是一种创建线程的方式,适用于想让某个线程执行逻辑后,返回一个结果 相比之下Runnable不关注结果 改进 以下是Callable的基本使用方法 运行结果: ReentrantLock 信号量Semaphore 也就…

记录关联(笛卡尔积)——kettle开发24

一、记录关联(笛卡尔积) 记录关联就是对两个数据流进行笛卡尔积操作。如下图所示&#xff0c;我们有两组数据分别为aaa和bbb,笛卡尔积后我们生成了4种结果&#xff0c;即2*24条记录。 记录关联(笛卡尔积)需要注意的是我们需要指定一个主步骤。即参考基准的数据 &#xff1a; 二…

安装依赖报-gyp: No Xcode or CLT version detected!

错误 > node-gyp rebuild No receipt for com.apple.pkg.CLTools_Executables found at /. No receipt for com.apple.pkg.DeveloperToolsCLILeo found at /. No receipt for com.apple.pkg.DeveloperToolsCLI found at /. gyp: No Xcode or CLT version detected! gyp ERR!…

信息系统项目管理师0135:输入(8项目整合管理—8.9结束项目或阶段—8.9.1输入)

点击查看专栏目录 文章目录 8.9 结束项目或阶段8.9.1 输入8.9 结束项目或阶段 结束项目或阶段是终结项目、阶段或合同的所有活动的过程。本过程的主要作用: 存档项目或阶段信息,完成计划的工作;释放组织团队资源以开展新的工作。它仅开展一次或仅在项目或阶段的结束点开展。…

11 Goroutine-并发与并行、阻塞与非阻塞

并发 顺序执行&#xff1a;按照事先计划好的顺序&#xff0c;执行完一个操作后&#xff0c;再执行下一个操作。 顺序执行效率不高的原因&#xff1a; 每个操作由多个步骤组成&#xff0c;每个步骤所需要的时间长短不一&#xff0c;有些步骤可能相当耗时。顾客点菜需要时间&a…

辅助科技照亮道路,携手共促盲文书写技能新飞跃

在这个科技日新月异的时代&#xff0c;创新的力量正以前所未有的方式融入我们的日常生活&#xff0c;特别是对于视觉障碍群体而言&#xff0c;技术的每一次进步都是通往更加独立生活的桥梁。今天&#xff0c;让我们聚焦于一款名为“蝙蝠避障”的辅助软件&#xff0c;它不仅为盲…

【Git】使用tortoiseGit

参考视频 【TortoiseGit常用的基本使用教程】 https://www.bilibili.com/video/BV193411h7FP/?share_sourcecopy_web&vd_source77e36f24add8dc77c362748ffb980148 拉取远程代码 创建分支 拉取远端dev分支的代码&#xff1a; 先创建本地的dev分支&#xff1a; 拉取&…

微信小程序中使用vantUI步骤

第一步&#xff0c;配置project.config.json 在setting中新增如下&#xff1a; "packNpmManually": true,"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}], 第…

packstack一键部署OpenStack云平台

OpenStack一键部署 文章目录 OpenStack一键部署资源列表基础环境一、基础环境配置1.1、配置时间同步1.2、配置网络1.3、添加hosts绑定1.4、更新系统并安装常用软件 二、使用packstack一键部署OpenStack2.1、Train版YUM源安装2.2、Packstack软件包安装2.3、Packstack一键部署Ope…

搜索网盘资源、在线抠图、动图在线制作、Logo在线制作,这些全都免费!!

搜索网盘资源、免费在线抠图、免费动图在线制作、Logo在线制作&#xff0c;这些都能免费做到&#xff0c;而且效果还真的好&#xff01; 今天&#xff0c;阿星就给大家带来了5个稀缺的神奇网站&#xff0c;这5个神奇网站让你白嫖全网最全干货&#xff01;每一个都是全网最全&a…

【PHP小课堂】PHP中的网络组件相关函数

PHP中的网络组件相关函数 作为一门以 WEB 开发为主战场的编程语言来说&#xff0c;PHP 即使是在目前这个大环境下&#xff0c;依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件&#xff0c;而且它们都是不需要安装扩展就能够使用的。今天&a…

面试官:说说Loader和Plugin的区别?编写Loader,Plugin的思路?

一、区别 前面两节我们有提到Loader与Plugin对应的概念&#xff0c;先来回顾下 loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的…

深度学习——自己的训练集——测试模型(CNN)

测试模型 1.导入新图片名称2.加载新的图片3.加载图片4.使用模型进行预测5.获取最可能的类别6.显示图片和预测的标签名称7.图像加载失败输出 导入新的图像&#xff0c;显示图像和预测的类别标签。 1.导入新图片名称 new_image_path 456.jpg2.加载新的图片 new_image cv2.imr…

SQL——SELECT相关的题目(力扣难度等级:简单)

目录 197、上升的温度 577、员工奖金 586、订单最多的客户 596、超过5名学生的课 610、判断三角形 620、有趣的电影 181、超过经理收入的员工 1179、重新格式化部门表&#xff08;行转列&#xff09; 1280、学生参加各科测试的次数 1965、丢失信息的雇员 1068、产品销售分…

【Rust日报】Rust 中的形式验证

文章 - 未来的愿景&#xff1a;Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念&#xff0c;作者展示了如何使用 Hoare triples 来描述和推理程序的正确性&#xff0c;以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证&#xff0c;以…

实现网:评价较好的程序员招聘与接单平台

其实我一直很羡慕敲敲代码就能实现自己的人生梦想的程序员们&#xff0c;想当年&#xff0c;作为初级程序员的我阴差阳错没能走上专业码农的道路&#xff0c;至今仍引以为憾。当然做个程序员并不是件容易的事&#xff0c;今天给大家分享个可通过编程赚钱的靠谱平台——实现网&a…

python max_min标准化

python max_min标准化 max_min标准化sklearn实现max_min标准化手动实现max_min标准化 max_min标准化 Max-Min标准化&#xff08;也称为归一化或Min-Max Scaling&#xff09;是一种将数据缩放到特定范围&#xff08;通常是0到1&#xff09;的标准化方法。这种方法通过线性变换将…