目录
一.扑克牌的数据结构
二.买牌(扑克牌的初始化)
三.洗牌
四.发牌
五.完整代码
Card.java
CardList.java
六.测试
输出结果
一.扑克牌的数据结构
首先,扑克牌是一幅一幅的,除去大小王以外一共有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;}@Overridepublic 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;}@Overridepublic 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);}
输出结果
可以发现是完全可以正常运行的
本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见