当前位置: 首页 > news >正文

Java-简单的洗牌抽牌小游戏

一、描述什么是牌?

public class Card { private String suit; private int rank; public Card(String suit, int rank) { this.suit = suit; this.rank = rank; } @Override public String toString() { return "Card{" + "suit='" + suit + '\'' + ", rank=" + rank + '}'; } }

我们描述的牌有花色,有数值,我们还准备了构造方法和toString方法,已被后续创建新对象,打印用。

二、Carddemo

接下来,我们创建一个Carddemo类,其中就存放着String类型数组suits,里面放着各种花色:

public static final String[] suits = {"♥️","♠️","♣️","♦️"};

1.buyCard方法(赋值)

生活中,我们的扑克牌一般有52张,不同花色的牌有13种不同的数值,接下来,我们就要创建52个Card类型的对象并对他们一一赋值,也就是我们的buyCard方法

public List<Card> buyCard(){ List<Card> list = new ArrayList<Card>(); for (int i = 0; i <13 ; i++) { for (int j = 0; j <4 ; j++) { String suit = suits[j]; int rank = i; Card card = new Card(suit,rank); list.add(card); } } return list; }

这样,我们就成功创建了52个不同的对象了,每一个对象都有独属于自己的花色配数值

写到这里,我们就可以在主类的main方法中写出:

Carddemo carddemo = new Carddemo(); List<Card> cardList = carddemo.buyCard();

这样,我们就成功创建了存放Card类型的表cardList,并在cardList里add了52个对象

2.shuffle方法(洗牌)

2-1.swap(交换)

思路:我们通过Card类型的引用temp,将i位置的牌存起来,在通过set方法,让i位置上的牌更新为j位置上的牌,再通过set方法,让j位置的牌更新为temp,也就是原来i位置的牌

具体实现:

private void swap(List<Card> cardList,int i,int j){ Card temp = cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,temp); }

对于洗牌的思路,其实也很简单,我们让for循环中的i从cardList.size()-1开始,也就是从51开始,取一个 [0,51) 的随机数,此时i无法取到51位,就访问不到第52张牌,我们让第52张牌与随机数n号位的牌进行交换即可,循环一次后,i--,变为50,此时i无法取到第50位,也就是第51张牌,我们让第51张牌与 [0,50)的随机数n号位的牌进行交换,以此类推

具体实现很简单:

public void shuffle(List<Card> cardList){ Random random = new Random(); for (int i = cardList.size()-1; i >0 ; i--) { int n = random.nextInt(i); swap(cardList,i,n); } }

我们可以在main方法中试验一下:

carddemo.shuffle(cardList); for (int i = 0; i <cardList.size() ; i++) { System.out.println(cardList.get(i)); }

得到的结果为52张打乱顺序的牌,多次实验,并没找到洗牌规则,我们成功做到了打乱52张牌

3.play(玩)

在创建play方法时,我们未来肯定要让这个方法返回一个引用,并打印这个引用,但具体情况我们要返回一个什么类型的引用,我们并不清楚

我们play的规则为:三个玩家,一副扑克,我们将扑克打乱后(只洗一次),从第一位玩家到第三位玩家,每人得到一张牌,重复五次,每人得到5张牌,并打印出这三位玩家手中的牌

由目前的信息来看,我们可以写出以下代码:

public ? play(List<Card> cardList){ List<Card> hand0 = new ArrayList<>(); List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>();

由于我们的规则是,每人发一张牌,重复五次,所以我们的for循环是外面循环5次,里面循环三次:

for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { } }

我们可以在forj循环里写上一行

Card card = cardList.remove(0);//remove方法会返回这张被删掉的牌

这样我们就可以做出动态的效果,当我们删除0号位这张牌时,1号位的牌就会成为新的0号位牌,以此类推,我们向三位玩家发出的牌就会每张都不一样

接下来要写点什么呢?想一想,我们最终只返回一个引用,这个引用里还要放着三个玩家各自的5张牌,你想到了吗?没错,就是我们的List自己的二维数组!

那么要返回引用的类型也明了了,就是 List<List<Card>> 类型

由此我们在for循环外,先组装好这个二维数组

List<List<Card>> sum = new ArrayList<>(); sum.add(hand0); sum.add(hand1); sum.add(hand2); //通过二维数组来接牌

通过get和add方法,我们可以在for循环内写出:

sum.get(j).add(card);

组装一下,最终fori循环:

for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card card = cardList.remove(0);//remove方法会返回这张被删掉的牌 sum.get(j).add(card); //在remove完后,下一张牌会成为新的0号位牌 } }

最终我们返回一个List<List<Card>>类型的sum即可

随后我们在main方法中写下一行:

List<List<Card>> sum = carddemo.play(cardList);

进行测试,发现每一次运行,三位玩家手里的牌都会改变,写到这里,我们就成功实现了简单的洗牌抽牌小游戏啦!

http://www.jsqmd.com/news/457858/

相关文章:

  • 探讨品牌FRP采光瓦厂家,潍坊泰霖建材的服务区域有哪些? - myqiye
  • 关于智榜样一阶段01-网络安全导论的学习心得
  • 东北变压器设备厂家TOP5:行业领先者的背后秘密
  • 【Linux系统编程】进程环境 进程终止/命令行参数分析/环境变量/main函数
  • 1111111111111111111
  • 《C++11 :列表初始化、initializer_list、引用折叠、完美转发与可变参数模板》
  • 多服务器数据集中自动化备份方案
  • 计算机毕业设计之springboot羊场养殖数据管理与分析系统设计与实现
  • 2026年钢格栅厂家排名,看看哪些品牌值得选购 - 工业推荐榜
  • 盘点2026年粮库门窗制造商,选择靠谱厂家的技巧 - mypinpai
  • 二、虚拟化技术与云计算-2-virtualization-technology-guide(2)
  • 写论文写到崩溃?试试这 4 款 “AI 写作利器”,导师都看不出是 AI 写的!
  • OpenClaw 大更新:支持 GPT-5.4、记忆热插拔,GitHub Star 突破 28 万
  • 众期期现系统多业务主体协同机制
  • 英伟达推出EgoScale,利用以自我为中心的操作数据进行扩展
  • 真的太省时间了!AI论文平台 千笔·专业论文写作工具 VS speedai,专科生专属利器!
  • 宠物友好型社区排行,金华宠物医生给出参考建议,宠物绝育/狗狗绝育/母猫绝育/宠物神经外科/异宠医院,宠物医院哪家靠谱 - 品牌推荐师
  • 您的Android联系人消失了?本指南可以帮助您!
  • 有哪些性价比高的头戴式耳机?分享2026十大性价比高的头戴式耳机
  • 清唱歌词的音频直接用,原创音乐人用AI编曲软件直接生成完整歌曲的编曲伴奏
  • 酒店旅游业新服务:集成化国际代驾模块的源码设计与对接实践
  • 计算机毕业设计之springboot疫情访客信息智能收集系统
  • QT生成exe和打包exe文件
  • 零基础本地部署小龙虾 OpenClaw:超详细保姆级教程
  • 别再死守工资了!2026跑腿创业,可能是普通人最后的上车机会
  • Kamailio dispather 选中目标节点后获取目标属性
  • 合同系统实施踩坑实录(二):当蓝图未定,开发已跑——一个“高效”背后的交付陷阱
  • Ingestion服务介绍(数据摄取服务,把外部系统的数据导入到内部数据系统中)(Batch Ingestion批处理摄取、Streaming Ingestion实时摄取)
  • OpenClaw 深度解析
  • Kamailio 对CC发起外呼出局时加0拨打