JAVA資料結構-----使用順序表實現一副撲克牌洗牌發牌功能
阿新 • • 發佈:2021-02-04
實現一副撲克牌的洗牌 + 發牌功能。
(程式碼中詳細註釋!)
//一張撲克牌
/*
體會“抽象”,一張撲克牌上面有哪些資訊?提取核心資訊(抽象)----花色,點數!
*/
public class Card {
//花色
public String suit;
//點數
public String rank;
public Card(String suit, String rank) {
this.suit = suit;
this.rank = rank;
}
//為了方便列印牌的內容,就可以重寫toString方法。
@Override
public String toString() {
return "(" + this.suit + this.rank + ")";
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class pokerGame {
//使用陣列把四種花色提前準備好
public static final String[] suits ={"❤" ,"♦","♣","♠"};
//一副牌中有許多張單牌組成,所以用一個List線性表來“裝載”。
private static List<Card> creatPoker(){
List<Card> poker = new ArrayList<>();
//用這層迴圈處理四種花色。
for (int i=0;i<4;i++){
//這層迴圈處理每種花色的13張牌,J,Q,K,A,大小王單獨處理。
for (int j=2;j<=10;j++){
poker.add(new Card(suits[i],""+j));
//String.valueOf(j)可以用 ""+j 替換。將int型別轉換成字串型別。
}
poker.add(new Card(suits[i],"J"));
poker.add(new Card(suits[i],"Q"));
poker.add(new Card(suits[i],"K"));
poker.add(new Card(suits[i],"A"));
}
poker.add(new Card("","big Joker"));
poker.add(new Card("","small Joker"));
return poker;
}
//list自身是可變物件,直接修改poker的內容就會對List本身造成影響,就不需要額外返回list<Card>了。
// 洗牌思路:從後往前遍歷List,取到當前位置元素和前面隨機位置元素進行交換。
private static void shuffle(List<Card> poker) {
Random random = new Random();
for (int i = poker.size() - 1; i > 0; i--) {
// 產生 [0, i) 的隨機數, 要和哪個位置的元素交換
int pos = random.nextInt(i);
swap(poker, i, pos);
}
}
private static void swap(List<Card> poker, int i, int j) {
Card tmp = poker.get(i);
poker.set(i, poker.get(j));
poker.set(j, tmp);
}
public static void main(String[] args) {
//1.需要先創建出一副牌。
List<Card> poker = creatPoker();
//2.洗牌。
shuffle(poker);
//3. 發牌, 假設有三個玩家, 每個玩家, 給發 5 張牌
/*
//每個玩家手裡有 5 張牌, 這 5 張牌就使用另外一個 ArrayList 表示.
//此時可以把這三個玩家也放到一個 List 中.
List<Card> player1 = new ArrayList<>();
List<Card> player2 = new ArrayList<>();
List<Card> player3 = new ArrayList<>();
*/
// players 型別仍然是 List, 泛型引數, 是一個 List<Card> , 每個元素就是一個 List<Card>
List<List<Card>> players = new ArrayList<>();
// 每次 add 的元素都是一個 ArrayList<Card> 型別
players.add(new ArrayList<>());
players.add(new ArrayList<>());
players.add(new ArrayList<>());
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Card top = poker.remove(0);
List<Card> player = players.get(j);
player.add(top);
}
}
// 4. 展示手牌
for (int i = 0; i < players.size(); i++) {
List<Card> player = players.get(i);
System.out.println("玩家" + i + " 的手牌是: " + player);
}
}
}