模擬鬥地主洗牌發牌
3.1 案例介紹
按照鬥地主的規則,完成洗牌發牌的動作。
具體規則:
- 組裝54張撲克牌將
- 54張牌順序打亂
- 三個玩家參與遊戲,三人交替摸牌,每人17張牌,最後三張留作底牌。
- 查看三人各自手中的牌(按照牌的大小排序)、底牌
規則:手中撲克牌從大到小的擺放順序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
3.2 案例需求分析
- 準備牌:
完成數字與紙牌的映射關係:
使用雙列Map(HashMap)集合,完成一個數字與字符串紙牌的對應關係(相當於一個字典)。
- 洗牌:
通過數字完成洗牌發牌
- 發牌:
將每個人以及底牌設計爲ArrayList,將最後3張牌直接存放於底牌,剩餘牌通過對3取模依次發牌。
存放的過程中要求數字大小與鬥地主規則的大小對應。
將代表不同紙牌的數字分配給不同的玩家與底牌。
- 看牌:
通過Map集合找到對應字符展示。
通過查詢紙牌與數字的對應關係,由數字轉成紙牌字符串再進行展示。
3.3 實現代碼步驟
public class Poker {
public static void main(String[] args) {
/*
* 1組裝54張撲克牌
*/
// 1.1 創建Map集合存儲
HashMap<Integer, String> pokerMap = new HashMap<Integer, String>();
// 1.2 創建 花色集合 與 數字集合
ArrayList<String> colors = new ArrayList<String>();
ArrayList<String> numbers = new ArrayList<String>();
// 1.3 存儲 花色 與數字
Collections.addAll(colors, "♦", "♣", "♥", "♠");
Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
// 設置 存儲編號變量
int count = 1;
pokerMap.put(count++, "大王");
pokerMap.put(count++, "小王");
// 1.4 創建牌 存儲到map集合中
for (String number : numbers) {
for (String color : colors) {
String card = color + number;
pokerMap.put(count++, card);
}
}
/*
* 2 將54張牌順序打亂
*/
// 取出編號 集合
Set<Integer> numberSet = pokerMap.keySet();
// 因爲要將編號打亂順序 所以 應該先進行轉換到 list集合中
ArrayList<Integer> numberList = new ArrayList<Integer>();
numberList.addAll(numberSet);
// 打亂順序
Collections.shuffle(numberList);
// 3 完成三個玩家交替摸牌,每人17張牌,最後三張留作底牌
// 3.1 發牌的編號
// 創建三個玩家編號集合 和一個 底牌編號集合
ArrayList<Integer> noP1 = new ArrayList<Integer>();
ArrayList<Integer> noP2 = new ArrayList<Integer>();
ArrayList<Integer> noP3 = new ArrayList<Integer>();
ArrayList<Integer> dipaiNo = new ArrayList<Integer>();
// 3.2發牌的編號
for (int i = 0; i < numberList.size(); i++) {
// 獲取該編號
Integer no = numberList.get(i);
// 發牌
// 留出底牌
if (i >= 51) {
dipaiNo.add(no);
} else {
if (i % 3 == 0) {
noP1.add(no);
} else if (i % 3 == 1) {
noP2.add(no);
} else {
noP3.add(no);
}
}
}
// 4 查看三人各自手中的牌(按照牌的大小排序)、底牌
// 4.1 對手中編號進行排序
Collections.sort(noP1);
Collections.sort(noP2);
Collections.sort(noP3);
Collections.sort(dipaiNo);
// 4.2 進行牌面的轉換
// 創建三個玩家牌面集合 以及底牌牌面集合
ArrayList<String> player1 = new ArrayList<String>();
ArrayList<String> player2 = new ArrayList<String>();
ArrayList<String> player3 = new ArrayList<String>();
ArrayList<String> dipai = new ArrayList<String>();
// 4.3轉換
for (Integer i : noP1) {
// 4.4 根據編號找到 牌面 pokerMap
String card = pokerMap.get(i);
// 添加到對應的 牌面集合中
player1.add(card);
}
for (Integer i : noP2) {
String card = pokerMap.get(i);
player2.add(card);
}
for (Integer i : noP3) {
String card = pokerMap.get(i);
player3.add(card);
}
for (Integer i : dipaiNo) {
String card = pokerMap.get(i);
dipai.add(card);
}
//4.5 查看
System.out.println("令狐沖:"+player1);
System.out.println("石破天:"+player2);
System.out.println("鳩摩智:"+player3);
System.out.println("底牌:"+dipai);
}
}