我相信很多人玩过斗地主,所以对斗地主并不陌生,我这个案例是讲解斗地主的发牌机制,下一期讲解我将会做出一个斗地主的单机版(与人机对战),以后我可能会做出斗地主的联机版。
其实发牌机制很简单,只要会用HashMap和TreeMap这两个类就可以完成这个案例,HashMap相当于牌盒装了所有的牌,而TreeMap是玩家因为它有一个排序功能。
HashMap中的键是牌对应的排序大小,比如方块3是1,大王是54,方块3是值它对应的键是1。
如图所示是把牌装进牌盒的操作,并且把对应的数值装进了一个list集合中,然后将其顺序打乱,就可以进行发牌操作了,发牌操作无非就是将打乱数值的list集合中的值分发给三个玩家和一个只有三张牌的底牌,根据打乱的数值从牌盒中获取对应的牌,玩家获取到的牌就是打乱循序的牌。
如上图所示就是设置玩家和发牌的代码。
我最后定义了一个方法用于看到所有玩家的牌和确认地主是谁并且把底牌添加到地主的牌中。
如图上所示的执行结果这就是这个案例的全部了。
下面是全部代码
public class DouDiZhu {
public static void main(String[] args) {
HashMap<Integer, String> carton=new HashMap<>();
List<Integer> list =new ArrayList<>();
//四花色 方尖 ,梅花 ,红桃,黑桃
String[] color={"♦","♣","♥","♠"};
String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int num=0;
for (String n:numbers){
for (String fc:color){
num++;
carton.put(num,n+fc);//数字加上花色
list.add(num);
}
}
for (int i=0;i<2;i++){
num++;
list.add(num);
if (i == 0) {
carton.put(num, "小王");
} else {
carton.put(num, "小王");
}
}
//洗牌 将 牌打乱顺序
Collections.shuffle(list);
//设置三个玩家 和 一个底牌
TreeMap<Integer,String> xxc=new TreeMap<>();
TreeMap<Integer,String> gjh=new TreeMap<>();
TreeMap<Integer,String> zml=new TreeMap<>();
TreeMap<Integer,String> dipai=new TreeMap<>();
for (int i=1;i<=list.size();i++){
int poker=list.get(i-1);// 获取 牌的键的值 注意这里 根据1索引读取1值是从
if(i>list.size()-3){
//底牌
dipai.put(poker,carton.get(poker));
}else if (i%3==0){
gjh.put(poker,carton.get(poker));
}else if (i%3==1){
xxc.put(poker,carton.get(poker));
}else {
zml.put(poker,carton.get(poker));
}
}
//展示 底牌
System.out.println("底牌是:"+dipai.values());
// 展示玩家的牌并且指出谁是地主
lookPoker("xxc",xxc,dipai);
lookPoker("gjh",gjh,dipai);
lookPoker("zml",zml,dipai);
}
public static void lookPoker(String name, TreeMap<Integer,String> arr, TreeMap<Integer,String> dipai){
//这里看牌和 谁是 地主 一起输出
Collection<String> GJH=arr.values();
if (arr.containsValue("4♦")){ //如果有就添加底牌给她
Set<Map.Entry<Integer,String>> entry=dipai.entrySet(); //同时获取键和值
for (Map.Entry<Integer,String> all:entry){
arr.put(all.getKey(),all.getValue());
}
System.out.println(name+"是地主"+"的牌"+":"+GJH);
}else {
System.out.println(name+"的牌"+":"+GJH); //不是就直接输出
}
}
}