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

数据结构算法篇洗牌算法(特别有意思的算法)

一、算法结构

1.我们需要Card类来定义卡牌

卡牌需要一个rank(牌面数字),和一个suit(花色)

注意要记得写一个toString方法

public int rank;//牌面数字 public String suit;//花色 public Card(int rank, String suit) { this.rank = rank; this.suit = suit; } public String toString() { return String.format("[%s %d]",suit,rank); }

2.我们需要CardDemo类来定义方法(拿牌,洗牌,发牌)

上面我们已经把卡牌制作好了接下来来拿牌

2.1、拿牌也就是制作卡牌,我们以52张牌为例,

我们先定义一个数组来放花色

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

这里制作牌有两种逻辑,一种是以一个数字来遍历4种花色,另一种是用一个花色来定义13个数字

我们采用第一种:

我们的对象的类型是Card ,所以这里是List<Card>,

public List<Card> buyCard(){ List<Card> cardList = new ArrayList<>(); for (int i = 1; i <=13 ; i++) {//把每个数字取出来进行花色遍历 for (int j = 0; j < 4; j++) { int rank =i;//拿数字 String suit = suits[j];//拿花色 Card card = new Card(rank,suit);//拿到属性制作出一张牌 cardList.add(card);//把牌放到数组中 } } return cardList;//形成一副52张牌的数组 }

2.2、洗牌

洗牌我们要用到Random类,用来生成随机数

public void shuffle(List<Card> cardList){ Random random = new Random(); for (int i = cardList.size()-1; i >0; i--) { int index = random.nextInt(i);//生成比i小的随机数 swap(cardList,index,i);//生成i下标的值和index下标的值交换,实现洗牌 } } private void swap(List<Card> cardList,int i , int j){ Card tmp = cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,tmp); }

2.3发牌

我们以三个人玩牌一人发五张牌为例:

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>> List<List<Card>> hand = new ArrayList<>(); hand.add(hand0); hand.add(hand1); hand.add(hand2); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card card = cardList.remove(i);//每发一张就把最上面的牌给到另一个Card对象,并在原来的牌堆中删除 hand.get(j).add(card);//把牌挨个放回开始定义的三个对象的手中。 } } return hand;//返回二维数组。 }

二、总结

代码总结

Card类

package fisherYates; public class Card { //定义扑克牌 public int rank;//牌面数字 public String suit;//花色 public Card(int rank, String suit) { this.rank = rank; this.suit = suit; } public String toString() { return String.format("[%s %d]",suit,rank); } }

CardDemo类:

package fisherYates; import java.util.ArrayList; import java.util.List; import java.util.Random; public class CardDemo { public static final String[] suits = {"♠","♣","♦","♥"}; public List<Card> buyCard(){ List<Card> cardList = new ArrayList<>(); for (int i = 1; i <=13 ; i++) { for (int j = 0; j < 4; j++) { int rank =i; String suit = suits[j]; Card card = new Card(rank,suit); cardList.add(card); } } return cardList; } public void shuffle(List<Card> cardList){ Random random = new Random(); for (int i = cardList.size()-1; i >0; i--) { int index = random.nextInt(i); swap(cardList,index,i); } } private void swap(List<Card> cardList,int i , int j){ Card tmp = cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,tmp); } 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++) { for (int j = 0; j < 3; j++) { Card card = cardList.remove(i); hand.get(j).add(card); } } return hand; } }

写完这个算法对泛型,以及二维数组的使用,有新的认识,更能实际体验Java面向对象

http://www.cnnetsun.cn/news/117303.html

相关文章:

  • 论文查重合格标准:从AI工具到学术规范的深度解析
  • 论文新手写作工具:9大AI工具推荐+步骤指南排名
  • 使用 pylintrc 配置 Python 代码检查的详细指南
  • 在 VS Code 中使用 Black 格式化 Python 代码
  • 文科查重率标准:8大平台+降重技巧排名
  • Lime编辑器:终极开源解决方案能否终结代码编辑器的选择困境?
  • 多模态舆情监测技术深度解析:Infoseek 如何实现 AI 造假与短视频舆情的精准捕捉?
  • 终极指南:如何快速掌握Admin.NET通用权限框架的10个核心技巧
  • 云端电子书制作新体验:EPubBuilder深度解析
  • GP2040-CE终极攻略:打造你的专属游戏控制神器
  • Matlab Simulink三相四桥臂逆变器仿真模型详解:电压外环电流内环控制,适应不平衡负...
  • 【数据集】上市公司-人工智能采纳程度测算数据(2003-2024年)
  • Uppy智能文件过滤:从混乱上传到精准控制的革命性方案
  • Nginx性能优化终极指南:Linux服务器加速实战技巧
  • AI销售自动化与客户管理的最佳获客软件选择--VertGrow AI销冠
  • Naive UI 图片预览实用技巧:打造专业画廊效果的高效方法
  • 前沿速递 | Adv. Eng. Mater.:基于LPBF与压力渗透的FeSi2.9-Bakelite多功能复合材料设计与性能调控
  • Mermaid Live Editor 终极指南:实时图表编辑的完整解决方案
  • Drawnix白板工具:用代码思维重塑图形设计工作流
  • Monaco Editor代码提示响应优化实战指南
  • 下一代前端开发:用Next.js与大模型AI,零代码解锁你的智能助手
  • 跨越浏览器壁垒:Skyvern如何实现自动化脚本的通用兼容性
  • 应用现代化 | 金融智能风控的新标尺——《金融级智能应用能力要求 风控场景》标准正式发布
  • Undetectable接入亮数据代理ip做自媒体矩阵
  • 如何用lidR包3步完成激光雷达林业精准分析:从点云到决策的完整指南
  • 初识操作系统
  • Android端AI模型部署终极指南:从入门到精通
  • RuoYi-Vue3企业级管理系统:现代化开发框架实战指南
  • MCP协议驱动企业级AI集成:芋道源码的智能化升级实践
  • 终极指南:使用gsplat.js实现高性能3D高斯点云渲染