目錄
一.撲克牌的數(shù)據(jù)結(jié)構(gòu)?
二.買牌(撲克牌的初始化)
三.洗牌
四.發(fā)牌
五.完整代碼
Card.java
CardList.java
六.測試
輸出結(jié)果?
一.撲克牌的數(shù)據(jù)結(jié)構(gòu)?
首先,撲克牌是一幅一幅的,除去大小王以外一共有52張,我們可以考慮用數(shù)組來存儲,數(shù)組的每一個元素都是一張牌,這是牌庫的牌;除了要考慮牌庫的牌以外,還需要考慮玩家手上的牌,玩家的手牌是牌庫的一部分,我們使用順序表來存儲撲克牌,對于一張牌來說,我們有倆個參數(shù):花色和點(diǎn)數(shù)
public class Card {
private int rank;//點(diǎn)數(shù)
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+" ";
}
}
我們將花色存放在總的撲克牌組中,使用字符串?dāng)?shù)組進(jìn)行存放
public class CardList {
public static final String[] suits = {"?","?","?","?"};
}
二.買牌(撲克牌的初始化)
我們要在買牌的過程中具體的抽象化出一組牌,我們使用數(shù)組來存儲,數(shù)組的每一個元素都是一張牌,我們使用泛型方便我們定義牌組。
撲克牌除了大小王一共是52張,所以我們定義一個撲克牌數(shù)組大小為52,并且通過倆個for循環(huán)來實(shí)現(xiàn)牌的具體信息,外邊的for循環(huán)用來實(shí)現(xiàn)牌的花色,里面的for循環(huán)用來實(shí)現(xiàn)牌的點(diǎn)數(shù),在循環(huán)最中間,使用零時的變量生成一張零時的撲克牌,在我們得到一張完整的牌之后,就使用ArrayList的插入方法add將我們新生成的牌放入牌組中,最后將生成的52張牌組成的牌組返回,我們就完成了撲克牌的初始化
//買一副牌,也就是對牌進(jìn)行初始化
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;
}
三.洗牌
所謂的洗牌就是隨機(jī)的打亂牌與牌之間的順序,回想我們現(xiàn)實(shí)生活中,我們洗牌的動作,其實(shí)就是不停的將部分牌插入到另一部分中,然后交換牌與牌之間的順序。
因此我們這里封裝一個方法swap用來對牌與牌實(shí)現(xiàn)交換,然后我們在洗牌方法shuffle中使用隨機(jī)數(shù)來確保我們交換的位置是隨機(jī)的,并且使用for循環(huán)可以保證我們對每一個位置都至少進(jìn)行一次洗牌
//洗牌
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);
}
}
四.發(fā)牌
發(fā)牌實(shí)際上就是將一部分牌等量的分給玩家,我們這里定義出三個玩家的手牌組,用三個數(shù)組分別來實(shí)現(xiàn),然后我們將這三個數(shù)組放入一個大數(shù)組來記錄要發(fā)給玩家的所有牌,我們用倆個for循環(huán)嵌套來保證我們對3名玩家各發(fā)5張牌,發(fā)牌的過程我們可以這樣理解:hands.get(j)用來拿到3個人的手牌組,add(tempCard)用來將牌放入這三個數(shù)組中
//發(fā)牌
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 = {"?","?","?","?"};
//買一副牌,也就是對牌進(jìn)行初始化
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);
}
}
//發(fā)牌
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);
}
輸出結(jié)果?
可以發(fā)現(xiàn)是完全可以正常運(yùn)行的文章來源:http://www.zghlxwxcb.cn/news/detail-756228.html
??本次的分享就到此為止了,希望我的分享能給您帶來幫助,也歡迎大家三連支持,你們的點(diǎn)贊就是博主更新最大的動力!
如有不同意見,歡迎評論區(qū)積極討論交流,讓我們一起學(xué)習(xí)進(jìn)步!
有相關(guān)問題也可以私信博主,評論區(qū)和私信都會認(rèn)真查看的,我們下次再見
?文章來源地址http://www.zghlxwxcb.cn/news/detail-756228.html
到了這里,關(guān)于如何用Java實(shí)現(xiàn)撲克牌(附源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!