一.扑克牌的数据结构
首先,扑克牌是一幅一幅的,除去大小王以外一共有52张,我们可以考虑用数组来存储,数组的每一个元素都是一张牌,这是牌库的牌;除了要考虑牌库的牌以外,还需要考虑玩家手上的牌,玩家的手牌是牌库的一部分,我们使用顺序表来存储扑克牌,对于一张牌来说,我们有俩个参数:花色和点数
public class Card { private int rank;//点数 private String suit;//花色 public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public String getSuit() { return suit; } public void setSuit(String suit) { this.suit = suit; } @Override public String toString() { return suit+rank+" "; } }
我们将花色存放在总的扑克牌组中,使用字符串数组进行存放
public class CardList { public static final String[] suits = {"♠","♥","♣","♦"}; }
二.买牌(扑克牌的初始化)
我们要在买牌的过程中具体的抽象化出一组牌,我们使用数组来存储,数组的每一个元素都是一张牌,我们使用泛型方便我们定义牌组。
扑克牌除了大小王一共是52张,所以我们定义一个扑克牌数组大小为52,并且通过俩个for循环来实现牌的具体信息,外边的for循环用来实现牌的花色,里面的for循环用来实现牌的点数,在循环最中间,使用零时的变量生成一张零时的扑克牌,在我们得到一张完整的牌之后,就使用ArrayList的插入方法add将我们新生成的牌放入牌组中,最后将生成的52张牌组成的牌组返回,我们就完成了扑克牌的初始化
//买一副牌,也就是对牌进行初始化 public static final List<Card> buyCard(){ List<Card> cards = new ArrayList<Card>(52); for (int i = 0; i < 4; i++) { for (int j = 0; j <= 13; j++) { String tempSuit = suits[i]; int tempRank = j; Card newCard = new Card(); newCard.setSuit(suits[i]); newCard.setRank(j); cards.add(newCard); } } return cards; }
三.洗牌
所谓的洗牌就是随机的打乱牌与牌之间的顺序,回想我们现实生活中,我们洗牌的动作,其实就是不停的将部分牌插入到另一部分中,然后交换牌与牌之间的顺序。
因此我们这里封装一个方法swap用来对牌与牌实现交换,然后我们在洗牌方法shuffle中使用随机数来确保我们交换的位置是随机的,并且使用for循环可以保证我们对每一个位置都至少进行一次洗牌
//洗牌 public void swap(List<Card> cards,int i,int j){ Card tempCard = cards.get(i); cards.set(j,tempCard); cards.set(i,cards.get(j)); } //洗牌 public void shuffle(List<Card> cards){ Random random = new Random(); for (int i = cards.size()-1; i > 0; i--) { int index = random.nextInt(i); swap(cards,index,i); } }
四.发牌
发牌实际上就是将一部分牌等量的分给玩家,我们这里定义出三个玩家的手牌组,用三个数组分别来实现,然后我们将这三个数组放入一个大数组来记录要发给玩家的所有牌,我们用俩个for循环嵌套来保证我们对3名玩家各发5张牌,发牌的过程我们可以这样理解:hands.get(j)用来拿到3个人的手牌组,add(tempCard)用来将牌放入这三个数组中
//发牌 public List<List<Card>> dealCard(List<Card> cardList){ List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>(); List<Card> hand3 = new ArrayList<>(); List<List<Card>> hands = new ArrayList<>(); hands.add(hand1); hands.add(hand2); hands.add(hand3); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card tempCard = cardList.remove(0); hands.get(j).add(tempCard); } } return hands; }
五.完整代码
Card.java
public class Card { private int rank; private String suit; public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public String getSuit() { return suit; } public void setSuit(String suit) { this.suit = suit; } @Override public String toString() { return suit+rank+" "; } }
CardList.java
import java.util.ArrayList; import java.util.List; import java.util.Random; public class CardList { public static final String[] suits = {"♠","♥","♣","♦"}; //买一副牌,也就是对牌进行初始化 public static final List<Card> buyCard(){ List<Card> cards = new ArrayList<Card>(52); for (int i = 0; i < 4; i++) { for (int j = 0; j <= 13; j++) { String tempSuit = suits[i]; int tempRank = j; Card newCard = new Card(); newCard.setSuit(suits[i]); newCard.setRank(j); cards.add(newCard); } } return cards; } //洗牌 public void swap(List<Card> cards,int i,int j){ Card tempCard = cards.get(i); cards.set(j,tempCard); cards.set(i,cards.get(j)); } //洗牌 public void shuffle(List<Card> cards){ Random random = new Random(); for (int i = cards.size()-1; i > 0; i--) { int index = random.nextInt(i); swap(cards,index,i); } } //发牌 public List<List<Card>> dealCard(List<Card> cardList){ List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>(); List<Card> hand3 = new ArrayList<>(); List<List<Card>> hands = new ArrayList<>(); hands.add(hand1); hands.add(hand2); hands.add(hand3); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card tempCard = cardList.remove(0); hands.get(j).add(tempCard); } } return hands; } }
六.测试
我们可以写个测试案例:
public static void main(String[] args) { CardList cardGame = new CardList(); List<Card> ret = cardGame.buyCard(); System.out.println("买牌:"); System.out.println(ret); System.out.println("洗牌:"); cardGame.shuffle(ret); System.out.println(ret); System.out.println("揭牌:"); List<List<Card>> hand = cardGame.dealCard(ret); for (int i = 0; i < hand.size(); i++) { System.out.println("第 "+(i+1)+" 个人的牌:"+hand.get(i)); } System.out.println("剩下的牌:"); System.out.println(ret); }
输出结果
可以发现是完全可以正常运行的
本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见