Java中ArrayList具体实现之简单的洗牌算法
作者:♡喜欢做梦
引言
实现一个简单的洗牌算法,这幅牌一共52张,不包含大小王,将这副牌进行打乱(这幅牌一共52张,不包含大小王),一个五个人,每个人每轮摸一张牌,一共摸五轮。
需要实现的操作:
1.52张牌;
2.洗牌;
3.发牌:一共三人,5轮,每轮摸一张牌
简单的洗牌算法
我们需要一幅牌,但是我们没有牌类这个类,所以我们要先自己定义一个牌类
Card类(牌类)
属性:大小、花色
public class Card { //大小 public int size; //花色 public String suit; //初始化 public Card(int size, String suit) { this.size = size; this.suit = suit; } @Override public String toString() { return "{" + size+ suit + '}'; } }
既然有了牌类,那么我们就需要定义出一副牌了
CardList(一副牌)
这副牌有哪些属性?
大小:1-13;
花色:♥,♦,♣,♠
将每一张牌的大小和花色定义好,添加到整副牌中
public class CardList { //四种花色 public String[] suits={"♣","♥","♦","♠"}; public List<Card> buyCard(){ List<Card> cardList=new ArrayList<>(); for (int i = 1; i <= 13; i++) { //cardList:放所有牌 for (int j = 0; j < 4; j++) { //定义每一张牌的大小以及花色 Card card=new Card(i,suits[j]); //将每张牌放到这幅牌中 cardList.add(card); } } return cardList; } }
测试
public static void main(String[] args) { CardList cardList=new CardList(); System.out.println(cardList.buyCard()); }
结果:
washCard(洗牌)
有了牌,我们就要像将其进行洗牌,但是我们要怎么进行洗牌呢?
这是一副牌,我们要将其位置进行打乱
那么我们是不是可以从后开始往前,将后面的牌与任意一张牌进行交换,这样顺序就被打乱了
所以我们要生成一个随机的数,用来当中随机与之要交换的下标
随机数的生成:
Random random=new Random(); int index=random.nextInt();
因为他要不断进行交换,随机生成数也有一个范围,并且每一次交换完,生成范围减少。所以我们用for循环语句,其i的起始位置从最后一位牌开始,向前交换
public void washCard(List<Card> cardList){ Random random=new Random(); for (int i = cardList.size()-1; i >0 ; i--) { //生成范围在0到51之间,随着交换次数,范围不断减少 int index=random.nextInt(i); //交换牌 swap(i,index,cardList); } }
接下来我们需要写一个swap方法用来交换牌
swap()
可能你想这么写,但是他是错误的,因为他不是数组,且他的里面有数组
private void swap(int i,int j,List<Card> cardList){ Card tmp=cardList[i]; cardList[i]=cardList[j]; cardList[j]=tmp; }
正确写法:
private void swap(int i,int j,List<Card> cardList){ Card tmp=cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,tmp); }
测试:
public static void main(String[] args) { CardDemo cardDemo=new CardDemo(); List<Card> cardList=cardDemo.buyCard(); System.out.println(cardList); CardFunctions cardFunctions1=new CardFunctions(); cardFunctions1.washCard(cardList); System.out.println(cardList); }
结果:
dealCard(发牌)
一共三人,5轮,每轮摸一张牌
所以我们先定义三个人,然后利用for循环语句,进行每轮的抽牌
//发牌 public void dealCard(List<Card> cardList){ List<Card> hand1=new ArrayList<>(); List<Card> hand2=new ArrayList<>(); List<Card> hand3=new ArrayList<>(); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { } } }
每个人从牌的最上方揭走一张牌,我们要使用到remove
cardList.remove(0);
但是我们要怎么将这些牌放到对应的手里面,因为hand1,2,3里面是一维,所以我们可以定义一个二维来储存他们
public void dealCard(List<Card> cardList){ List<Card> hand1=new ArrayList<>(); List<Card> hand2=new ArrayList<>(); List<Card> hand3=new ArrayList<>(); List<List<Card>> hand=new ArrayList<>(); hand.add(hand1); hand.add(hand2); hand.add(hand3); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card card=cardList.remove(0); //将摸到的手牌分别放到handj手中 hand.get(j).add(card); } } }
测试:
public static void main(String[] args) { //一副牌52张 CardDemo cardDemo=new CardDemo(); List<Card> cardList=cardDemo.buyCard(); System.out.println(cardList); //洗牌 CardFunctions cardFunctions1=new CardFunctions(); cardFunctions1.washCard(cardList); System.out.println(cardList); //分牌 List<List<Card>> ret=cardFunctions1.dealCard(cardList); for (int i = 0; i < ret.size(); i++) { System.out.println("第"+(i+1)+"人:"+ret.get(i)); } }
结果:
总结
到此这篇关于Java中ArrayList具体实现之简单的洗牌算法的文章就介绍到这了,更多相关Java ArrayList洗牌算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!