方法中可變參數
一種特殊形參,定義在方法,構造器的形參列表里,格式:數據類型...參數名稱;
可變參數的特點和好處
特點:可以不傳數據給它;可以傳一個或者同時傳多個數據給它;也可以傳一個數組給它。
好處:常常用來靈活的接收數據。
注意:
1.可變參數對內實際上就是一個數組。
2.可變參數在形參列表中只能有一個。
3.可變參數必須放在形參列表的最后面
Collections工具類
collection是一個用來操作集合的工具類
Collections提供的常用靜態方法
public static void main(String[] args) {//Collection工具類List<Integer> list = new ArrayList<>();//1.Collectiohns批量添加數據Collections.addAll(list, 1,2,3,4,5,6,7,8,9,10);System.out.println(list);//2.打亂順序Collections.shuffle(list);System.out.println(list);//3.升序排序Collections.sort(list);System.out.println(list);//4.降序排序Collections.sort(list,(o1, o2)->o2.compareTo(o1));System.out.println(list);}
運行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 1, 5, 2, 10, 8, 3, 9, 6, 4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
斗地主案例
如何創建一副撲克牌并初始化
如何洗牌、發牌
如何對玩家手中的牌進行排序
Java 中集合的操作與 Lambda 表達式的使用
本項目涉及兩個核心類:
Card 類:表示一張撲克牌
Room 類:代表游戲房間,負責游戲邏輯
doudizhuGame 類:程序入口
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card {private String size;private String color;private int num;@Overridepublic String toString() {return size+color;}
}
? ?使用了 Lombok 注解簡化開發,生成 getter/setter 和 toString() 方法。
size 表示點數,color 表示花色,num 是牌的“大小值”,在排序時使用。
toString() 方法用于打印顯示牌面信息。
private List<Card> cards = new ArrayList<>();{String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "2", "A"};String[] colors = {"?", "?", "?", "?"};int num = 0;for (String size : sizes) {num++;for (String color : colors) {cards.add(new Card(size, color, num));}}cards.add(new Card("JOKER", "小🃏", ++num));cards.add(new Card("JOKER", "大🃏", ++num));System.out.println(cards);
}
sizes 數組按從小到大的順序排列,便于后續排序。
循環遍歷點數和花色組合,構造普通撲克牌。
手動添加大小王,并賦予更高的權值 num。
num 值越大,牌力越強,在排序中排在前面
public void start() {Collections.shuffle(cards); // 洗牌Map<String, List<Card>> players = new HashMap<>();List<Card> lhc = new ArrayList<>();List<Card> lhb = new ArrayList<>();List<Card> lhz = new ArrayList<>();players.put("令狐沖", lhc);players.put("令狐白", lhb);players.put("令狐張", lhz);// 發出51張牌,保留最后3張為底牌for (int i = 0; i < cards.size() - 3; i++) {Card card = cards.get(i);if (i % 3 == 0) {lhc.add(card);} else if (i % 3 == 1) {lhb.add(card);} else {lhz.add(card);}}// 獲取底牌List<Card> lastCard = cards.subList(cards.size() - 3, cards.size());System.out.println("底牌是:" + lastCard);
隨機選出地主
隨機從三位玩家中選擇一位
將三張底牌加入該玩家的手牌中
控制臺輸出地主的名字
// ======【新增】隨機選地主======String[] playerNames = {"令狐沖", "令狐白", "令狐張"};Random random = new Random();String landlordName = playerNames[random.nextInt(playerNames.length)];System.out.println("🎉 隨機選出的地主是:" + landlordName);// 給地主發底牌players.get(landlordName).addAll(lastCard);
Collections.shuffle() 實現洗牌。
使用 Map<String, List<Card>> 存儲三個玩家及其手牌。
使用 for 循環配合取模運算 (i % 3) 給每位玩家輪流發牌。
最后三張牌作為底牌單獨保存。
// 排序方法
private void sortCards(List<Card> hand) {Collections.sort(hand, (o1, o2) -> o2.getNum() - o1.getNum());
}// 在 start() 中調用
sortCards(lhc);
sortCards(lhb);
sortCards(lhz);
?使用 Collections.sort() 配合 Lambda 表達式進行自定義排序。
根據 num 字段降序排序,使得牌力從高到低展示。
for (Map.Entry<String, List<Card>> entry : players.entrySet()) {String name = entry.getKey();List<Card> playerCards = entry.getValue();System.out.println(name + "的牌是:" + playerCards);
}
展示所有玩家的手牌
程序入口:doudizhuGame.java
public class doudizhuGame {public static void main(String[] args) {Room room = new Room();room.start();}
}