前置知识:可变参数
可变参数
就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型...参数名称;
可变参数的特点和好处
特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它,
好处:常常用来灵活的接收数据。
可变参数的注意事项:
- 可变参数在方法内部就是一个数组。
- 一个形参列表中可变参数只能有一个。
- 可变参数必须放在形参列表的最后面。
代码演示
集合的工具类:Collecitons
综合案例(斗地主)
打牌功能需要通信暂时不会
代码:
/**
*目标:斗地主游戏的案例开发
* 业务需求分析:
* 业务:总共有54张牌
* 点数:"3","4","5","6",'7","8","9","10","J","Q","K","A","2"
* 花色:"♠","♥","♣","♦"
* 大小王:"🤡","🃏"
* 点数分别要组合4种花色,大小王各一张。
* 斗地主:发出51张牌,剩下3张作为底牌
*/
public class GameDemo {
public static void main(String[] args) {
//1.牌类
//2.房间
Room m = new Room();
//3.启动游戏
m.start();
}
}
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 number + color;// + "-->" + size;
}
}
import java.util.*;
public class Room {
//必须有一副牌
private List<Card> allCards = new ArrayList<>();
public Room() {
//1.做出54张牌,存入到集合allCards
//a.点数:个数确定了,类型确定。
String[] nunbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//b.花色:个数确定了,类型确定。
String[] colors = {"♠", "♥", "♣", "♦"};
int size = 0;//表示每张牌的大小
//c.遍历点数,再遍历花色,组织牌
for (String nunber : nunbers) {
size++;//1 2 ...
//number = "3"
for (String color : colors) {
//得到一张牌
Card c = new Card(nunber, 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);
//3.发牌 首先肯定要定义三个玩家 再去创建对象的话会显得十分复杂
//用一个集合来代表一个玩家,来装玩家的牌List —— ArrayList
List<Card> linHuChong = new ArrayList<>();
List<Card> jiuMoZhi = new ArrayList<>();
List<Card> renYingYing = new ArrayList<>();
//正式发牌给三个玩家,依次发出51张牌,剩下三张作为底牌
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 {
renYingYing.add(c);
}
}
//3.对3个玩家的牌进行排序
sortCards(linHuChong);
sortCards(jiuMoZhi);
sortCards(renYingYing);
//4.看牌
System.out.println("啊冲:" + linHuChong);
System.out.println("啊鸠:" + jiuMoZhi);
System.out.println("盈盈:" + renYingYing);
List<Card> lastThressCards = allCards.subList(allCards.size() - 3, allCards.size());//包前不包后 截取一个元素成为一个集合
//把最后三张底牌截到一个集合中去可以方便后边抢地主直接把底牌倒入地主玩家手牌
System.out.println("底牌:" + lastThressCards);
jiuMoZhi.addAll(lastThressCards);
sortCards(jiuMoZhi);
System.out.println("啊鸠抢到地主后:" + jiuMoZhi);
}
/**
* 集中进行排序
*
* @param cards
*/
/*private void sortCards(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {//new 一个比较器对象进行排序
@Override
public int compare(Card o1, Card o2) {
//return o1.getSize() - o2.getSize();//升序
return Integer.compare(o2.getSize(), o1.getSize());
}
});
}*/
//Lambda表达式简化
private void sortCards(List<Card> cards) {
Collections.sort(cards, (o1, o2) -> Integer.compare(o2.getSize(), o1.getSize()));
}
}