如何用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;
}
@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);
}
输出结果?
可以发现是完全可以正常运行的
??本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!