
我们先分析一下业务需求:
-
总共有54张牌,每一张牌有花色和点数两个属性、为了排序还可以再加一个序号
-
点数可以是:`"3","4","5","6","7","8","9","10","J","Q","K","A","2"`
-
花色可以是:`"♣","♠","♥","♦"`
-
斗地主时:三个玩家没人手里17张牌,剩余3张牌作为底牌
第一步:为了表示每一张牌有哪些属性,首先应该新建一个扑克牌的类
第二步:启动游戏时,就应该提前准备好54张牌
第三步:接着再完全洗牌、发牌、对牌排序、看牌的业务逻辑
```
先来完成第一步,定义一个扑克类Card
public class Card {
private String number;
private String color;
// 每张牌是存在大小的。
private int size; // 0 1 2 ....
public Card() {
}
public Card(String number, String color, int size) {
this.number = number;
this.color = color;
this.size = size;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return color + number ;
}
}
再完成第二步,定义一个房间类,初始化房间时准备好54张牌
public class Room {
// 必须有一副牌。
private List<Card> allCards = new ArrayList<>();
public Room(){
// 做出54张牌,存入到集合allCards
// a、点数:个数确定了,类型确定。
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// b、花色:个数确定了,类型确定。
String[] colors = {"♠", "♥", "♣", "♦"};
int size = 0; // 表示每张牌的大小
// c、遍历点数,再遍历花色,组织牌
for (String number : numbers) {
// number = "3"
size++; // 1 2 ....
for (String color : colors) {
// 得到一张牌
Card c = new Card(number, color, size);
allCards.add(c); // 存入了牌
}
}
// 单独存入小大王的。
Card c1 = new Card("", "🃏" , ++size);
Card c2 = new Card("", "👲" , ++size);
Collections.addAll(allCards, c1, c2);
System.out.println("新牌:" + allCards);
}
}
最后完成第三步,定义一个启动游戏的方法,完成洗牌、发牌、捋牌、看牌的业务逻辑
/**
* 启动游戏
*/
public void start() {
// 1、洗牌: allCards
Collections.shuffle(allCards);
System.out.println("洗牌后:" + allCards);
// 2、发牌,首先肯定要定义 三个玩家。 List(ArrayList) Set(TreeSet)
List<Card> linHuChong = new ArrayList<>();
List<Card> jiuMoZhi = new ArrayList<>();
List<Card> renYingYing = new ArrayList<>();
// 正式发牌给这三个玩家,依次发出51张牌,剩余3张做为底牌。
// allCards = [♥3, ♣10, ♣4, ♥K, ♦Q, ♣2, 🃏, ♣8, ....
// 0 1 2 3 4 5 6 ... % 3
for (int i = 0; i < allCards.size() - 3; i++) {
Card c = allCards.get(i);
// 判断牌发给谁
if(i % 3 == 0){
// 请啊冲接牌
linHuChong.add(c);
}else if(i % 3 == 1){
// 请啊鸠来接牌
jiuMoZhi.add(c);
}else if(i % 3 == 2){
// 请盈盈接牌
renYingYing.add(c);
}
}
// 3、对3个玩家的牌进行排序
sortCards(linHuChong);
sortCards(jiuMoZhi);
sortCards(renYingYing);
// 4、看牌
System.out.println("啊冲:" + linHuChong);
System.out.println("啊鸠:" + jiuMoZhi);
System.out.println("盈盈:" + renYingYing);
/**
* 5、获取底牌 51 52 53
* public List<E> subList(int fromIndex, int toIndex){...}
* 作用:返回包含从索引 fromIndex(包括)到索引 toIndex(不包括)元素的List集合。
*/
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
System.out.println("底牌:" + lastThreeCards);
// 比如啊鸠是地主 需要获取到底牌
jiuMoZhi.addAll(lastThreeCards);
// 获取到底牌后再次进行排序
sortCards(jiuMoZhi);
System.out.println("啊鸠抢到地主后:" + jiuMoZhi);
}
/**
* 集中排序
* @param cards
*/
private void sortCards(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o1.getSize() - o2.getSize(); // 升序排序
// return o2.getSize() - o1.getSize(); // 降序排序
}
});
}
测试类:
/**
* 我们先分析一下业务需求:
*
* - 总共有54张牌,每一张牌有花色和点数两个属性、为了排序还可以再加一个序号
* - 点数可以是:`"3","4","5","6","7","8","9","10","J","Q","K","A","2"`
* - 花色可以是:`"♣","♠","♥","♦"`
* - 斗地主时:三个玩家每人手里17张牌,剩余3张牌作为底牌
*/
public class GameDemo {
public static void main(String[] args) {
// 1、牌类
// 2、房间
Room m = new Room();
// 3、启动游戏
m.start();
}
}