Hello! 伙伴们 , 这期是我们用顺序列表实现模拟发牌的操作 , 里面包含了我自己学习时的代码 ,即理解注释 , 如果有什么不妥或理解不到位的地方欢迎指正 ,希望对你们有所帮助 。
package ArrayList;
//基于 ArrayList 实现洗牌和发牌
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
//表示玩家的手牌
class handCard{
private ArrayList<Card> cards;
}
//使用 ArrayList 表示一张牌
class Card{
private String suit;
private String rank;
public Card(String suit, String rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit(){
return this.suit;
}
public String getRank(){
return this.rank;
}
public void setSuit(String suit){
this.suit = suit;
}
public void setRank(String rank){
this.rank = rank;
}
@Override
public String toString() {
return "Card{" +
"suit='" + suit + '\'' +
", rank='" + rank + '\'' +
'}';
}
}
public class Demo01 {
public static void main(String[] args) {
//这里创建了衣服新牌 , 然后通过调用函数 , 将创建的一副牌赋值给了 deck
ArrayList<Card> deck = createDeck();
System.out.println("原始的牌:");
System.out.println(deck);
//洗牌 打乱牌的顺序 标准库中提供了shuffle方法
System.out.println("打乱后的牌:");
// Collections.shuffle(deck);
shuffle(deck);
System.out.println(deck);
//发牌 , 假设有三个人 , 每个人发五张(三行五列的二维数组)
//hands 也是一个 ArrayList 里面的每个元素也是一个 ArrayList , 并且当前 hands 长度为 0
ArrayList<ArrayList<Card>> hands = new ArrayList<>();
// ArrayList<handCard> handCards = new ArrayList<>();
//往 hands 里面添加三个元素 , 表示三个玩家的手牌
for (int i = 0; i < 3; i++) {
ArrayList<Card> hand = new ArrayList<>();
hands.add(hand);
}
//给三人轮流发牌 , 重复五次
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
//得到每一个玩家对象
ArrayList<Card> currentHand = hands.get(j);
//取出第一张牌
Card card = deck.remove(0);
currentHand.add(card);
}
}
//打印每个人的手牌
for (int i = 0; i < 3; i++) {
System.out.println("第" + i +"个人都手牌:"+hands.get(i));
}
}
//自己实现以下洗牌操作
public static void shuffle(ArrayList<Card> deck){
//打乱扑克牌
//把整个 ArrayList 从后往前遍历
//针对每次取到一张牌 , 就生成一个随机的下标 , 拿着当前位置的牌和生成的随机下标位置的牌 , 进行交换
//实例化一个随机数的对象
Random random = new Random();
for (int i = deck.size()-1; i > 0; i--) {
//生成 deck.size() 范围内的随机数
int j = random.nextInt(deck.size());
//交换两张牌的位置
//生成一副临时牌 , 用于存储 i 位置的牌面(其实是相当于复制了一份 i 位置的牌面)
Card temp = new Card(deck.get(i).getSuit(),deck.get(i).getRank());
//把下标为 i 的位置设置为 deck.get(i)
deck.set(i,deck.get(j));
//将 j 位置的牌设置为刚刚临时创建用于存储 i 的temp
deck.set(j,temp);
}
}
public static ArrayList<Card> createDeck(){
//创建一副扑克牌
ArrayList<Card> deck = new ArrayList<Card>();
String[] suits = {"♠", "♥", "♦", "♣"};
for(String suit :suits){
//在每个花色中生成对应点数的牌
for (int i = 2; i <= 10; i++) {
Card card = new Card(suit,""+i);
//将生成的 一种花色的十张牌 添加到 ArrayList<Card> 的数组 deck 中
deck.add(card);
}
//继续考虑 J Q K A
Card cardJ = new Card(suit, "J");
Card cardQ = new Card(suit, "Q");
Card cardK = new Card(suit, "K");
Card cardA = new Card(suit, "A");
deck.add(cardJ);
deck.add(cardQ);
deck.add(cardK);
deck.add(cardA);
}
return deck;
}
}