Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的示例代碼
一. 需求
設(shè)計(jì)一副新的的撲克牌, 4個(gè)花色(♥, ♠, ♦, ♣)對(duì)應(yīng) 1 到 13 , 不算大小王一共52張牌 ; 然后將撲克牌隨機(jī)打亂順序 , 最后實(shí)現(xiàn)三個(gè)人進(jìn)行摸牌 , 三個(gè)人輪流進(jìn)行摸牌(每次摸一張牌) , 最終每個(gè)人手里有五張牌
二. 全局代碼
poker.java
public class poker { private String suit;//花色 private int num;//數(shù)字 public poker(String suit, int num) { this.suit = suit; this.num = num; } public String getSuit() { return suit; } public void setSuit(String suit) { this.suit = suit; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } @Override public String toString() { return suit+" "+num; } }
pokers.java
import java.util.ArrayList; import java.util.List; import java.util.Random; public class pokers { public static final String[] SUITS = {"?","?","?","?"}; //買一副撲克牌 public static List<poker> buypokers() { List<poker> pokerList = new ArrayList<>(); for (int i = 0; i < 4; i++) { for (int j = 1; j <= 13; j++) { pokerList.add(new poker(SUITS[i],j)); } } return pokerList; } //洗牌 public static void shuffle(List<poker> pokerList) { Random random = new Random(); for (int i = pokerList.size()-1; i > 0; i--) { int index = random.nextInt(i); swap(pokerList, i, index); } } //交換 public static void swap (List<poker> pokerList, int i, int index) { poker tmp = pokerList.get(i); pokerList.set(i, pokerList.get(index)); pokerList.set(index, tmp); } public static void main(String[] args) { List<poker> pokerList = buypokers(); System.out.println("新牌:" + pokerList); shuffle(pokerList); System.out.println("洗牌:" + pokerList); //揭牌 3個(gè)人 每個(gè)人輪流揭5張牌 //用來存放三個(gè)人揭起來的牌 List<poker> hand1 = new ArrayList<>(); List<poker> hand2 = new ArrayList<>(); List<poker> hand3 = new ArrayList<>(); List<List<poker>> 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++) { //確定是誰在摸牌 List<poker> tmpHand = hand.get(j); tmpHand.add(pokerList.remove(0)); } } //輸出每個(gè)人的牌 for (int i = 0; i < hand.size(); i++) { System.out.println("第"+(i+1)+"個(gè)人的牌是"+hand.get(i)); } System.out.println("剩余的牌有"+pokerList); } }
執(zhí)行結(jié)果 :
三. 設(shè)計(jì)分析
1. 設(shè)計(jì)一張撲克牌
定義一個(gè)類 , 類中字段包含一張撲克牌的 花色 和 數(shù)字 ,并給出構(gòu)造方法和其他相關(guān)訪問字段的方法
public class poker { private String suit;//花色 private int num;//數(shù)字 public poker(String suit, int num) { this.suit = suit; this.num = num; } public String getSuit() { return suit; } public void setSuit(String suit) { this.suit = suit; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } @Override public String toString() { return suit+" "+num; } }
2. 得到一副新牌
定義一個(gè)存放4種花色的數(shù)組 , 創(chuàng)建一個(gè)順序表來存放獲取到的撲克牌 , 通過兩層循環(huán)得到52張撲克牌 , 外層循環(huán)4次每次得到一種花色 , 內(nèi)層循環(huán)13次得到每種花色的13個(gè)值
public static final String[] SUITS = {"?","?","?","?"}; //買一副撲克牌 public static List<poker> buypokers() { List<poker> pokerList = new ArrayList<>(); for (int i = 0; i < 4; i++) { for (int j = 1; j <= 13; j++) { pokerList.add(new poker(SUITS[i],j)); } } return pokerList; }
3. 洗牌
順序表中有52張牌 , 也就是52個(gè)元素 , 從最后一個(gè)元素開始循環(huán) , 利用 Random 這個(gè)類中的方法生成1到元素下標(biāo)之間的隨機(jī)數(shù) , 將生成隨機(jī)數(shù)位置的元素和循環(huán)中的那個(gè)元素進(jìn)行交換 .
//洗牌 public static void shuffle(List<poker> pokerList) { Random random = new Random(); for (int i = pokerList.size()-1; i > 0; i--) { int index = random.nextInt(i); swap(pokerList, i, index); } } //交換 public static void swap (List<poker> pokerList, int i, int index) { poker tmp = pokerList.get(i); pokerList.set(i, pokerList.get(index)); pokerList.set(index, tmp); }
4. 發(fā)牌
定義三個(gè)順序表分存放三個(gè)人摸起來的牌 , 將這三個(gè)順表再作為元素放入另一個(gè)新的順序表中 , 好方便執(zhí)行循環(huán)摸牌的操作 , 然后還是通過兩層循環(huán)去摸牌 , 三個(gè)人每人摸一張 , 摸5輪 , 所以外層循環(huán)執(zhí)行5次 ; 內(nèi)層循環(huán)3三次 , 每次表示一個(gè)人摸去一張牌 ;
其實(shí)每次摸牌就就是從撲克牌所在順序表中刪除第一個(gè)元素 , 所以每次摸牌訪問的都是順序表中的第一個(gè)元素 , remove方法返回的是刪除的元素
//用來存放三個(gè)人揭起來的牌 List<poker> hand1 = new ArrayList<>(); List<poker> hand2 = new ArrayList<>(); List<poker> hand3 = new ArrayList<>(); List<List<poker>> 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++) { //確定是誰在摸牌 List<poker> tmpHand = hand.get(j); tmpHand.add(pokerList.remove(0)); } }
以上就是Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java撲克牌洗牌發(fā)牌的資料請(qǐng)關(guān)注腳本之家其它相關(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ì)教你寫一個(gè)斗地主洗牌發(fā)牌系統(tǒng)
- Java模擬實(shí)現(xiàn)斗地主的洗牌和發(fā)牌
- Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法
相關(guān)文章
java實(shí)現(xiàn)在性能測(cè)試中進(jìn)行業(yè)務(wù)驗(yàn)證實(shí)例
這篇文章主要為大家介紹了java實(shí)現(xiàn)在性能測(cè)試中進(jìn)行業(yè)務(wù)驗(yàn)證實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Java開發(fā)學(xué)習(xí) Java數(shù)組操作工具
這篇文章主要為大家詳細(xì)介紹了自己編寫的Java數(shù)組操作工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java中Arrays.asList()方法詳解及實(shí)例
這篇文章主要介紹了Java中Arrays.asList()方法將數(shù)組作為列表時(shí)的一些差異的相關(guān)資料,需要的朋友可以參考下2017-06-06Flowable?ReceiveTask使用場(chǎng)景分析
這篇文章主要為大家介紹了Flowable?ReceiveTask使用場(chǎng)景分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10學(xué)習(xí)Java HashMap,看這篇就夠了
這篇文章主要介紹了Java HashMap的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07Hadoop源碼分析四遠(yuǎn)程debug調(diào)試
本篇是Hadoop源碼分析系列文章第四篇,主要介紹一下Hadoop的遠(yuǎn)程debug調(diào)試步驟,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下2021-09-09解決tomcat發(fā)布工程后,WEB-INF/classes下文件不編譯的問題
這篇文章主要介紹了解決tomcat發(fā)布工程后,WEB-INF/classes下文件不編譯的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Spring實(shí)戰(zhàn)之使用XML方式管理聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用XML方式管理聲明式事務(wù)操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring XML方式管理聲明式事務(wù)具體步驟、配置、接口及使用技巧,需要的朋友可以參考下2020-01-01SpringBoot2零基礎(chǔ)到精通之配置文件與web開發(fā)
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)配置文件以及web相關(guān)的開發(fā)2022-03-03