需求:
在启动游戏房间的时候,应提前准备好54张牌,完成洗牌、发牌、牌排序、逻辑。
分析:
- 当系统启动的同时准备好数据的时候,就可以用静态代码块了。
- 洗牌就是打乱牌的顺序。
- 定义三个玩家、依次发出51张牌。
- 给玩家的牌进行排序。
package com.itheima.game;
import java.util.*;
/**
* 点数:"2","A","K","Q","J","10","9","8","7","6","5","4","3"
* 花色:"♠","♣","♥","♦"
* 大王小王:"♀","♂"
* 点数分别组合四种花色,大小王各一张
* 斗地主:发出51张牌,剩下三张作为底牌
* 功能:
* 1、做牌
* 2、洗牌
* 3、定义三个玩家
* 4、发牌
* 5、排序
* 6、看牌
*/
public class GameDemo {
/**
1、定义一个静态的集合存储54张牌
*/
public static List<Card> allCards=new ArrayList<>();
/**
2、做牌:定义静态代码块初始化牌数据
*/
static {
//3、定义点数:个数确定,类型确定,使用数组
String[] sizes={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
//4、定义花色:个数确定,类型确定,使用数组
String[] colors={"♠","♣","♥","♦"};
//5、组合点数和花色
int index=13;//记录牌的大小
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=14);
Card c2=new Card("","♂",index=15);
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> ming=new ArrayList<>();
List<Card> li=new ArrayList<>();
List<Card> guai=new ArrayList<>();
//11、开始发牌(从牌集合中发出51张牌给三个玩家,剩下三张作为底牌)
for (int i = 0; i <allCards.size()-3; i++) {
//先拿到当前牌对象
Card c=allCards.get(i);
if(i%3==0){
//ming拿牌
ming.add(c);
}else if(i%3==1){
//li拿牌
li.add(c);
}else if(i%3==2){
//guai拿牌
guai.add(c);
}
}
//12、拿到最后三张底牌(把最后三张底牌截取成一个子集合)
List<Card> lastThreeCard=allCards.subList(allCards.size()-3,allCards.size());
//13、给玩家的牌的顺序(从小到大排序)
sortCard(ming);
sortCard(li);
sortCard(guai);
//14、输出玩家的牌
System.out.println("ming的牌为:"+ming);
System.out.println("li的牌为;"+li);
System.out.println("guai的牌为:"+guai);
}
public static void sortCard(List<Card> cards){
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
//知道牌的大小才可以指定规则
return o2.getIndex()-o1.getIndex();
}
});
}
}
实体类Card
package com.itheima.game;
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;
}
}