斗地主游戏的案例开发
业务需求分析:
斗地主的做牌, 洗牌, 发牌, 排序(拓展知识), 看牌。
业务: 总共有54张牌。
点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2"
花色: "", "", "", ""
大小王: "" , ""
点数分别要组合4种花色,大小王各一张。
斗地主:发出51张牌,剩下3张作为底牌。
功能实现:
1.做牌。
2.洗牌。
3.定义3个玩家
4.发牌。
5.排序(拓展)
6.看牌
代码部分:
牌类及其属性方法:
public class Card {
private String size;
private String color;
private int index; // 牌的真正大小
public Card(){
}
public Card(String size, String color, int index) {
this.size = size;
this.color = color;
this.index = index;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public String toString() {
return size + color;
}
}
game实现类:
public class GameDemo {
/**
1、定义一个静态的集合存储54张牌对象
*/
public static List<Card> allCards = new ArrayList<>();
/**
2、做牌:定义静态代码块初始化牌数据
*/
static {
// 3、定义点数:个数确定,类型确定,使用数组
String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 4、定义花色:个数确定,类型确定,使用数组
String[] colors = {"", "", "", ""};
// 5、组合点数和花色
int index = 0; // 记录牌的大小
for (String size : sizes) {
index++;
for (String color : colors) {
// 6、封装成一个牌对象。
Card c = new Card(size, color, index);
// 7、存入到集合容器中去
allCards.add(c);
}
}
// 8 大小王存入到集合对象中去 "" , ""
Card c1 = new Card("" , "", ++index);
Card c2 = new Card("" , "",++index);
Collections.addAll(allCards , c1 , c2);
System.out.println("新牌:" + allCards);
}
public static void main(String[] args) {
// 9.洗牌
Collections.shuffle(allCards);
System.out.println("洗牌后" + allCards);
// 10.发牌 (定义三个玩家,每个玩家的牌也是一个集合容器)
List<Card> lingchuchong = new ArrayList<>();
List<Card> jiumozhi = new ArrayList<>();
List<Card> renyingying = new ArrayList<>();
// 11.发牌 (从牌集合中发出51张牌给三个玩家,留3张底牌)
for (int i = 0; i < allCards.size() - 3; i++) {
//先拿到当前牌对象
Card c = allCards.get(i);
if (i % 3 == 0) {
//请阿冲接牌
lingchuchong.add(c);
} else if (i % 3 == 1) {
jiumozhi.add(c);
} else if (i % 3 == 2) {
renyingying.add(c);
}
}
// 12.拿到最后三张牌(把最后三张牌截取成一个子集合)
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
// 13.给玩家的牌排序(从大到小)
sortCards(lingchuchong);
sortCards(jiumozhi);
sortCards(renyingying);
// 14.输出玩家的牌 和底牌
System.out.println("令狐冲的牌:"+lingchuchong);
System.out.println("鸠摩智的牌:"+jiumozhi);
System.out.println("任盈盈的牌:"+renyingying);
System.out.println("三张底牌:"+lastThreeCards);
}
/*
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
*/
// public static void sortCards(List<Card> cards) {
// Collections.sort(cards, new Comparator<Card>() {
// @Override
// public int compare(Card o1, Card o2) {
// return o1.getIndex() - o2.getIndex();
// }
// });
//
// }
public static void sortCards(List<Card> cards) {Collections.sort(cards, (o1, o2) -> o2.getIndex() - o1.getIndex());}
}
总结:
首先定义一个静态的集合存储54张牌对象,然后使用静态代码块将牌初始化,组合牌的花色大小并封装为一个对象,存储到静态集合容器中,使用Collections工具类进行洗牌操作,并定义三个玩家对象,将打乱后的牌按顺序分别发给三个对象,重写比较规则,按照规则,将三个对象的牌按 降序 进行排序并输出。