Java中ArrayList具體實(shí)現(xiàn)之簡單的洗牌算法
引言
實(shí)現(xiàn)一個簡單的洗牌算法,這幅牌一共52張,不包含大小王,將這副牌進(jìn)行打亂(這幅牌一共52張,不包含大小王),一個五個人,每個人每輪摸一張牌,一共摸五輪。
需要實(shí)現(xiàn)的操作:
1.52張牌;
2.洗牌;
3.發(fā)牌:一共三人,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(一副牌)
這副牌有哪些屬性?
大?。?-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());
}結(jié)果:

washCard(洗牌)
有了牌,我們就要像將其進(jìn)行洗牌,但是我們要怎么進(jìn)行洗牌呢?
這是一副牌,我們要將其位置進(jìn)行打亂

那么我們是不是可以從后開始往前,將后面的牌與任意一張牌進(jìn)行交換,這樣順序就被打亂了

所以我們要生成一個隨機(jī)的數(shù),用來當(dāng)中隨機(jī)與之要交換的下標(biāo)
隨機(jī)數(shù)的生成:
Random random=new Random();
int index=random.nextInt();因?yàn)樗粩噙M(jìn)行交換,隨機(jī)生成數(shù)也有一個范圍,并且每一次交換完,生成范圍減少。所以我們用for循環(huán)語句,其i的起始位置從最后一位牌開始,向前交換
public void washCard(List<Card> cardList){
Random random=new Random();
for (int i = cardList.size()-1; i >0 ; i--) {
//生成范圍在0到51之間,隨著交換次數(shù),范圍不斷減少
int index=random.nextInt(i);
//交換牌
swap(i,index,cardList);
}
}接下來我們需要寫一個swap方法用來交換牌
swap()
可能你想這么寫,但是他是錯誤的,因?yàn)樗皇菙?shù)組,且他的里面有數(shù)組
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);
}結(jié)果:

dealCard(發(fā)牌)
一共三人,5輪,每輪摸一張牌
所以我們先定義三個人,然后利用for循環(huán)語句,進(jìn)行每輪的抽牌
//發(fā)牌
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);
但是我們要怎么將這些牌放到對應(yīng)的手里面,因?yàn)閔and1,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));
}
}結(jié)果:

總結(jié)
到此這篇關(guān)于Java中ArrayList具體實(shí)現(xiàn)之簡單的洗牌算法的文章就介紹到這了,更多相關(guān)Java ArrayList洗牌算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JAVA ArrayList詳細(xì)介紹(示例)
- Java中ArrayList類的使用方法
- java的arraylist排序示例(arraylist用法)
- Java實(shí)現(xiàn)洗牌發(fā)牌的方法
- Java ArrayList 數(shù)組之間相互轉(zhuǎn)換
- Java實(shí)現(xiàn)撲克牌洗牌和發(fā)牌
- Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌
- Java超詳細(xì)教你寫一個斗地主洗牌發(fā)牌系統(tǒng)
- Java模擬實(shí)現(xiàn)斗地主的洗牌和發(fā)牌
- Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的示例代碼
相關(guān)文章
淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)
這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java畢業(yè)設(shè)計實(shí)戰(zhàn)之在線網(wǎng)盤系統(tǒng)的實(shí)現(xiàn)
這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的在線網(wǎng)盤系統(tǒng),是一個畢業(yè)設(shè)計的實(shí)戰(zhàn)練習(xí),具有網(wǎng)盤該有的所有功能,感興趣的朋友快來看看吧2022-01-01
Java中的數(shù)組流ByteArrayOutputStream用法
Java中的ByteArrayOutputStream是java.io包中的一個類,用于在內(nèi)存中創(chuàng)建字節(jié)數(shù)組緩沖區(qū),支持動態(tài)擴(kuò)展,它繼承自O(shè)utputStream,允許以字節(jié)形式寫入數(shù)據(jù),無需與外部設(shè)備交互,常用方法包括write()、toByteArray()、toString()等2024-09-09
MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法
本文主要介紹了MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

