一、代码实现
1. 创建一个类 Card
创建一个类 Card,表示一张扑克牌的信息,另外生成构造方法和 toString 方法
class Card { public String suit; //某张牌的花色 public String number; //某张牌的数字 public Card(String suit, String number) { this.suit = suit; this.number = number; } @Override public String toString() { return "[ " + suit + ", " + number + " ]"; } }
2. 创建一个类 Test
创建一个类 Test,用来对整副扑克进行操作。
public class Test { //四种花色 public static final String[] suits = {"♠","♥","♣","♦"}; //13个数字 public static final String[] ranks = {"1","2","3","4","5","6", "7","8","9","10","J","Q","K"}; /** * 一副新扑克 */ public static ArrayList<Card> newCard(){ ArrayList<Card> cards = new ArrayList<>(); for (int i = 0; i < 13; i++) { for (int j = 0; j < 4; j++) { cards.add(new Card(suits[j], ranks[i])); } } return cards; } /** * 通过接收的 i 和 j 下标来交换牌 */ public static void swap(ArrayList<Card> cards, int i, int j){ /* Card temp = cards[i] //error cards[i] = cards[j] cards[j] = temp */ //面向对象,那么就不再呈现出数组的形式 Card temp = cards.get(i); cards.set(i, cards.get(j)); cards.set(j, temp); } /** * 洗牌 */ public static void shuffle(ArrayList<Card> cards){ for (int i = 1; i <= cards.size() - 1 ; i++) { Random random = new Random(); int rand = random.nextInt(i); // rand 取值范围:[1,i) swap(cards, i, rand); } System.out.println("---------------------------------------------"); System.out.println("洗牌: "); System.out.println(cards); } /** * 拿牌 */ public static void takeCards(ArrayList<Card> cards){ System.out.println("---------------------------------------------"); System.out.print("每个玩家从牌堆顶开始拿牌,"); System.out.println("规则: 每个人总共拿5张牌,每次只能拿一张牌"); System.out.println("---------------------------------------------"); ArrayList< ArrayList<Card> > players = new ArrayList<>(); ArrayList<Card> player1 = new ArrayList<>(); ArrayList<Card> player2 = new ArrayList<>(); ArrayList<Card> player3 = new ArrayList<>(); players.add(player1); players.add(player2); players.add(player3); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card output = cards.remove(0); //往 players 的[0,1,2]下标每次添加牌堆顶的牌 //从而使三个玩家不断地拿到新的牌,每个玩家一次拿一张牌,总共拿五次 players.get(j).add(output); } } System.out.println("玩家一: "+player1); System.out.println("玩家二: "+player2); System.out.println("玩家三: "+player3); System.out.println("牌堆剩余的牌: "+cards); } public static void main(String[] args) { ArrayList<Card> cards = newCard(); System.out.println("52张新扑克: "); System.out.println(cards); //新牌 shuffle(cards); //洗牌 takeCards(cards); //拿牌 } }
二、代码分析
1. newCard( ) 方法
//1. 新扑克 newCard()
在 newCard( ) 方法中,我们创建52张新牌,这里的顺序比较整齐。
2. shuffle( ) 方法
//2. 洗牌 shuffle(ArrayList<Card> cards)
在 shuffle( ) 方法中,我们对这52张新牌进行洗牌,通过 swap( ) 方法 和随机数逻辑进行交换牌。
3. takeCards( ) 方法
//3. 拿牌 takeCards(ArrayList<Card> cards)
在 takeCards( ) 方法中,我们实现3个玩家进行拿牌的逻辑: 每个玩家总共拿5张牌,每次只能从牌堆顶拿一张牌。
我们创建的顺序表的底层逻辑为二维数组,先创建一个 players 数组,然后往这个数组中,又放了三个玩家数组,分别为:player1,player2,player3。
而每个玩家拿牌,一定是从原先的顺序表 cards 的0下标开始拿牌,也就是说,每个玩家轮流拿牌,当第一个玩家拿牌后,原先的 cards 的长度就要减一,第二个玩家也是一样。这样一来,实际上每个玩家每次拿到的都是 cards 顺序表的第一个元素。那么我们就可以通过 【 cards.remove( ) 方法 】实现逻辑,( remove( ) 方法在底层由 ArrayList 实现 )
图解分析:
输出结果:
对我的输出结果进行说明:
我们每个人的输出结果很大概率是不同的,因为这些都是实现了随机数的原因,而我上面画出的框就表示 【每个玩家轮流拿牌的逻辑】没问题。感兴趣的小伙伴也可以通过改变 takeCards( ) 方法中的两层 for 循环,这样可以改变不同的玩家和不同的牌数。