java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢?

1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。

故我们优先创建一个牌的类(Card):包含大小和花色。

public class Card {   //单张牌的大小及类型//牌的花色,数量及返回值private String suit; //花色private int rank; //大小public Card(String suit, int rank){   //牌的构造方法this.suit = suit;this.rank = rank;}@Overridepublic String toString(){ //返回这张牌的属性return "{" + suit+rank+ "}";}
}

2.牌类创建好之后,我们就可以再创建一个CardDemo类来着重实现它的功能。

2.1:扑克牌的创建:

   实现功能之前我们要有一个容纳52张牌的数组(列表),其中这52张卡牌有四种花色,并且有1~13的大小(暂定),我们就要创建一个字符数组来存储其花色类型,再创建一个可以存储Card类型的泛型列表cardList来存放52张扑克牌,之后,通过两个for循环,一个通过花色(suit),一个通过牌的大小(rank),将每次循环的成员属性(suit、rank)放到新创建的卡牌类card中,最后通过add方法将这个新牌添加到cardList列表中,具体代码如下:

 public List<Card> buyCard(){    List<Card> cardList = new ArrayList<>();  //创建牌的列表//大小为i的牌的四张j类型的花色for (int i = 1; i <=13 ; i++) {for(int j =0;j<4;j++){int rank = i; //第i张牌String suit = suits[j] ; // j类型的花色Card card = new Card(suit,rank); //获取新的牌cardList.add(card);//将这个牌添加到列表中}}return cardList;}

         

  2.2    洗牌功能的实现:

如何进行随机洗牌呢?

想到随机二字,你是否联想到了Random函数?我们不妨用下面的思路来解决这个问题:

从最后一张牌(索引为51)开始,for循环,通过random函数随机获取前i-1(i是最后一张牌的索引)张牌的索引,通过索引与最后张牌进行交换。这样一套循环下来可以实现随机洗牌的功能。

具体代码如下:

    //洗牌功能的实现:public void shuffle(List<Card> cardList){Random random = new Random();for (int i = cardList.size()-1; i >0 ; i--) {//将第i位置的元素与索引为0~i-1的元素进行交换位置int index = random.nextInt(i); //随机获取索引为0~i-1的位置swap(cardList,i,index); //将位置index的元素和i像交换}}

那么这里问题又来了,如何实现交换两个牌的方法swap呢?通过ArrayList中的get、set方法获取、设置元素,通过类似于创建第三变量的方式将两个元素实现交换,不同的是作为媒介的第三方元素类型必须是Card。

 private void swap(List<Card> cardList,int i,int j){Card tmp = cardList.get(i); //将i位置的元素赋值给tmpcardList.set(i,cardList.get(j)); //将j位置的元素赋值到i位置cardList.set(j,tmp);  //tmp与j位置的元素互换}

2.3:发牌功能的实现:

          假设一共有三个人    假设每个人分到的手牌为5张,则先分别创建3个泛型为Card的列表用来存储这三个人分到的手牌,之后再创建一个二维列表hand来存储三个人的手牌,便于管理和访问不同玩家或不同伦次的手牌。

发牌过程中,两个for循环一次给每个人发牌,发牌时需要注意,第一张牌被人抽走之后,第二张牌便排在了第一位,这里我们每次发牌前移除第一个元素,并将这个移除元素分给对应 的人。

public List<List<Card>> play(List<Card> cardList) {List<Card> hand0 = new ArrayList<>();List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand0);hand.add(hand1);hand.add(hand2);for(int i=0;i<5;i++) //5张牌{for (int j = 0; j < 3; j++) { //3个人Card card = cardList.remove(0); //移除第一张牌,并将这张移除的牌赋给card,同时下一次card的第二个元素变为第一个//把对应的牌放到对应的人手中hand.get(j).add(card);}}return hand;}}

3.在main方法里进行测试:

public class Test {public static void main(String[] args) {CardDemo cardDemo = new CardDemo();//1.创建52张牌List<Card> cardList = cardDemo.buyCard();System.out.println(cardList);//2.洗牌:cardDemo.shuffle(cardList);System.out.println(cardList);//3每个人拿五张牌List<List<Card>> ret = cardDemo.play(cardList);for (int i = 0; i < ret.size(); i++) {System.out.println("第"+(i+1)+"个人的牌:"+ret.get(i));}System.out.println("剩下的人的牌");System.out.println(cardList);}
}

实现后:

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

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

相关文章

伊犁-linux 硬盘添加,分区,格式化

主要是linux 下操作硬盘分区&#xff0c;格式化 这样1个sata 盘就添加成功了 &#xff01;  继续添加三块 sata1 hda sata hdb sata hdc sata hdd scsi sda 作为启动盘 进行操作系统的引导 如果scsi 往下调整 先敲enter 在用&#xff0d; 号往下 如果是往上调整敲…

【IDEA】使用IDEA连接MySQL数据库并自动生成MySQL的建表SQL语句

前言&#xff1a; 在软件开发过程中&#xff0c;数据库的设计与实现是至关重要的一环。IntelliJ IDEA作为一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的数据库工具&#xff0c;使得连接MySQL数据库并自动生成建表SQL语句变得简单快捷。本文将详细…

《python语言程序设计》2018版第8章18题几何circle2D类(上部)

一、利用第7章的内容来做前5个点 第一章之1--从各种角度来测量第一章之2--各种结果第二章之1--建立了针对比对点在圆内的几段第二章之2--利用建立的对比代码&#xff0c;得出的第2点位置 第一章之1–从各种角度来测量 class Circle2D:def __init__(self, x, y, radius):self._…

Stable Diffusion绘画 | ControlNet应用-qrcode 二维码控制器:艺术二维码来啦

qrcode 二维码控制器&#xff0c;是一款专用于生成艺术二维码的控制器&#xff0c; 需要单独下载&#xff0c;下载后&#xff0c;将文件放置在&#xff1a;SD安装目录\extensions\sd-webui-controlnet\models 实操 开启第一个 ControlNet&#xff0c;上传一个二维码图片&…

【24华为杯数模研赛赛题思路已出】国赛E题第二套思路丨附参考代码丨免费分享

2024年数模研赛E题解题思路 在高速公路建设中&#xff0c;通常会设置应急车道&#xff0c;以便应对救援和医疗需求。应急车道一般不允许占用&#xff0c;但在某些情况下&#xff0c;如监测到某路段即将拥堵且没有事故时&#xff0c;合理使用应急车道可以帮助降低车流密度&…

对不起,放弃了wiki.js转向了obsidian

wifi.js可以满足我的以下要求: 支持文档在线编辑支持浏览器编辑支持二进制文件上传和下载支持历史记录和回滚支持用户账号分权支持数据和nas同步支持markdown的预览模式 但是wiki.js不能满足如下&#xff1a; markdown编辑无法做到图片复制粘贴无法查看pdf无法独立于文档上传…

影刀RPA实战:网页爬虫之药品数据

1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据&#xff0c;主要获取药品名称&#xff0c;介绍&#xff0c;药品类型&#xff0c;处方类型&#xff0c;医保类型&#xff0c;参考价格&#xff0c;药品成分&#xff0c;性状&#xff0c;适应病症&#…

SAP B1 Web Client MS Teams App集成连载四

过程/Procedure&#xff1a; 1.通过点击选项卡旁边的下拉箭头&#xff0c;可以重新配置、重命名和移除现有选项卡。 You can reconfigure, rename and remove an existing tab by clicking the drop down arrow alongside the tab. 要重新配置选项卡&#xff0c;请选择“设置”…

HTML-DOM模型

1.DOM模型 window对象下的document对象就是DOM模型。 DOM描绘了一个层次化的节点树&#xff0c;每一个节点就是一个html标签&#xff0c;而且每一个节点也是一个DOM对象。 2.操作DOM 2.1.获取DOM对象常用方法 获取DOM对象的常用方法有如下几种&#xff1a; getElementById(…

无线麦克风哪个好,麦克风哪个品牌音质最好,领夹麦克风推荐

​无线领夹麦克风作为直播、视频录制等场景必备的设备之一&#xff0c;用起来很方便&#xff0c;功能多样且易于操作&#xff0c;在音频设备领域占据着重要地位。但当前市场乱象较为严重&#xff0c;有许多商家纷纷打起价格战&#xff0c;忽视了产品质量&#xff0c;造成耐用性…

李沐 多层感知机【动手学深度学习v2】

学习XOR 同或操作&#xff1a;相同为1&#xff0c;不同为0。 先进入蓝色和黄色分类器&#xff0c;最后进入灰色分类器来得到最终的结果。 单隐藏层 输入为x1~x4&#xff0c;加入隐藏层后&#xff0c;x1~x4需要先进入h1~h5&#xff0c;该隐藏层再作为输入&#xff0c;连接下一层…

【24华为杯数模研赛赛题思路已出】国赛E题思路丨附参考代码丨免费分享

2024年华为杯研赛E题解题思路 E题 高速公路应急车道紧急启用模型 问题1 1. 某路段&#xff08;长度约5000m&#xff0c;行车道2应急车道1&#xff09;上有四个视频观测点&#xff08;见示意图1&#xff09;。请基于该路段四个视频数据解决如下问题&#xff1a; &#xff08;…

任天堂发言人:不会透露起诉《幻兽帕鲁》开发商细节

任天堂在昨天突然宣布将起诉《幻兽帕鲁》开发商 Pocketpair&#xff0c;除了引起许多玩家不满外&#xff0c;更多的是所有人的疑惑&#xff1a;因为实际上大家内心里觉得任天堂出手是理所当然的&#xff0c;但是为什么是在游戏发布数月后才选择起诉&#xff1f;此次诉讼是“专利…

解决引入ethereumjs-wallet报错Uncaught ReferenceError: process is defined

最近在学习web3.0开发DApp的视频教程&#xff0c;遇到用助记词生成秘钥对报错Uncaught ReferenceError: process is defined。具体报错如下截图&#xff1a; 在网上搜了好几个小时都没找到解决方法。突然在学习的视频论坛找到有哥们说是引入的包不兼容问题导致报这个错。我试了…

集合框架(一):Collection集合的遍历方式

一.迭代器遍历Collection集合 package com.njau.d2_collection_traverse;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;/*** 目标&#xff1a;Collection集合的遍历方式一&#xff1a;使用迭代器Iterator对象遍历Collection集合*/ pub…

嵌入式常用硬件电路设计及分析 — 通信篇

目录 一、简介 二、RS232通信 1、硬件电路设计 2、硬件电路设计分析 &#xff08;1&#xff09;常规电路 &#xff08;2&#xff09;EMC设计使用注意事项 3、DB9接头定义 三、RS485通信 1、硬件电路设计 2、硬件电路设计分析 &#xff08;1&#xff09;自动收发电路…

【C++】C++入门概念(一)

C关键字 C总计63个关键字&#xff0c;C语言32个关键字 ps&#xff1a;下面我们只是看一下C有多少关键字&#xff0c;不对关键字进行具体的讲解。后面我们学到以后再详细讨论。 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、…

神州数码社招校招入职北森测评笔试:语言理解、图形推理、材料计算

神州数码入职测评使用的是北森CATA-能力倾向计算机自适应测评 国内唯一被国际计算机自适应测验协会(IACAT)收录产品&#xff0c;基于企业大量招聘下对认知能力考察的需求&#xff0c;通过最新的测评技术手段&#xff0c;快速高效,评价候选人的认知能力&#xff0c;平均作答时…

Linux环境Docker安装Mongodb

Linux环境Docker安装Mongodb 环境要求拉取指定版本镜像创建映射目录&#xff08;相当于数据存放于容器外&#xff0c;容器被删除不会影响数据&#xff09;启动容器 进入mongo命令行为指定db创建新用户查看mongodb的容器id进入命令行查看所有db切换db为指定db创建新用户使用新账…

CZ 即将回归,这四个月币安疯狂上币用意何在?

随着币安创始人赵长鹏&#xff08;CZ&#xff09;即将在2024年9月29日刑满释放&#xff0c;市场上对于他的回归以及币安未来战略方向的讨论愈演愈烈。自今年4月&#xff0c;CZ因违反美国反洗钱法被判四个月监禁后&#xff0c;币安并没有停下发展的步伐&#xff0c;反而在CZ缺席…