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

ArrayList——简单洗牌算法

特殊语法介绍:

List<List<E>>

该语法情况比较特殊,相当于一个“二维数组”存着一个个线性表的结构,如图:

该语法的灵活性强,可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。

基本流程:

我们想实现的是一副牌(去鬼牌),三个人玩,每个人开始五张牌,轮流摸。

以上述图片为例:

1.先实现52张牌,设为买牌(BuyCard)操作,牌(Card)里面有不同花色(四种)和数字(假设J,Q,K)也为数字。可以另外定义花色,通过重写toString方法来实现打印为:【花色,数字】的形式

2.再实现洗牌操作,打乱顺序,这里得用到随机数方法:Random random = new Random();

打乱顺序的实现可以为,从后往前遍历,遍历的该位置与前面随机位置调换:

则洗牌操作就可以完成了。

3.再实现摸牌操作,需要使用remove操作(删除操作),将删除的牌放入各个人的卡槽,每人放五张牌。然后可以打印出来看效果如何

实现流程:

先定义一个牌类,存放数字和花色:

再有一个类,实现买牌,洗牌,发牌操作:

先看买牌操作:

牌定义好后,就有了一副牌,然后我们需要将其打乱,写出洗牌操作:

然后进行摸牌操作,每个玩家有着五个牌:

然后可以看看甲乙丙各持的牌,顺便打印剩下的牌:

这样我们的买牌,洗牌,发牌操作就全部完成啦!

上面就是简单的洗牌操作,后续我们可以研究出怎样玩牌打牌的操作,待我后续更新!

谢谢各位的观看!

附上测试代码:

test:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;public class Test {//简单洗牌算法public static void main(String[] args) {CardDemo carddemo = new CardDemo();System.out.println("买一副牌:");//买一副牌List<Card> card = carddemo.BuyCard();System.out.println(card);System.out.println("洗好一副牌:");//洗牌carddemo.Shuffle(card);System.out.println(card);System.out.println("确定好玩家,甲,乙,丙:");//执行发牌操作List<List<Card>> Player = carddemo.PlayCards(card);System.out.println("甲玩家的牌:");System.out.println(Player.get(0));System.out.println("乙玩家的牌:");System.out.println(Player.get(1));System.out.println("丙玩家的牌:");System.out.println(Player.get(2));System.out.println("剩下的牌:");System.out.println(card);}
}

Card:

//卡牌类
public class Card {private int rand;private String suit;public Card(int rand,String suit){this.rand = rand;this.suit = suit;}//重写toString方法public String toString() {return "[" +suit+rand +"] ";}
}

CardDemo:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class CardDemo {private String[] SUIT = {"♦","♣","♥","♠"};//四个花色//买牌public List<Card> BuyCard(){//先定义52大小的动态顺序表,存放类型为牌类List<Card> ret = new ArrayList<>(52);//四个花色,十三张牌for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {ret.add(new Card(j,SUIT[i]));}}return ret;}//洗牌public void Shuffle(List<Card> C){Random random = new Random();//定义随机数//把范围给定到0~i区间,在前面取随机数来与当前i位换位置for (int i = C.size() - 1; i > 0 ; i--) {int flg = random.nextInt(i);//范围控制在0~i以内swap(C,i,flg);//交换牌}}//发牌(需要玩家和一副牌)public List<List<Card>> PlayCards(List<Card> C){List<List<Card>> player = new ArrayList<>();List<Card> play0 = new ArrayList<>(5);//玩家一的一副牌List<Card> play1 = new ArrayList<>(5);//玩家二的一副牌List<Card> play2 = new ArrayList<>(5);//玩家三的一副牌for (int i = 0; i < 5; i++) {//各个玩家抽取一轮牌,原牌会进行删除操作,抽取的是原牌第一张play0.add(C.remove(0));play1.add(C.remove(0));play2.add(C.remove(0));}player.add(play0);player.add(play1);player.add(play2);return player;}//交换牌位置private void swap(List<Card> C,int a,int b){Card wap = C.get(a);C.set(a,C.get(b));C.set(b,wap);}}

相关文章:

  • uni-app基础框架搭建(vue3+ts+vite)
  • 【杂记-浅谈Internet、Intranet、Extranet】
  • 抖音素材网站有哪些?抖音素材下载网站分享
  • mongodb集群
  • LeetCode|938. Range Sum of BST
  • Python中的列表推导式和字典推导式:优雅且高效的数据结构生成方式
  • 每天坚持写java锻炼能力---第一天(6.4)
  • javaweb的新能源充电系统的设计
  • 【JS】JavaScript编程语言-(Object)对象属性标志与对象属性描述符(2024-06-05)
  • 大模型日报2024-06-06
  • RabbitMQ(五)集群配置、Management UI
  • UFS协议—新手快速入门(二)【5-6】
  • Redis使用中的性能优化——搭建Redis的监测服务
  • 显卡分类及特性详解
  • C语言scanf( ) 函数的格式控制包括哪些?
  • ES6指北【2】—— 箭头函数
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java IO学习笔记一
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript学习总结——原型
  • js操作时间(持续更新)
  • laravel 用artisan创建自己的模板
  • mysql常用命令汇总
  • Python实现BT种子转化为磁力链接【实战】
  • React-Native - 收藏集 - 掘金
  • vue:响应原理
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 记一次和乔布斯合作最难忘的经历
  • 悄悄地说一个bug
  • 使用权重正则化较少模型过拟合
  • 网页视频流m3u8/ts视频下载
  • 译米田引理
  • 终端用户监控:真实用户监控还是模拟监控?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (2020)Java后端开发----(面试题和笔试题)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)Linux——Linux常用指令
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (蓝桥杯每日一题)love
  • (理论篇)httpmoudle和httphandler一览
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .chm格式文件如何阅读
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET业务框架的构建
  • @RestControllerAdvice异常统一处理类失效原因
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [android] 天气app布局练习
  • [BZOJ4010]菜肴制作
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子