斗地主案例总结主要有以下知识点:
1、ArrayList和HashMap交叉使用
2、双重增强for循环组合赋值给ArrayList和HashMap
3、每张扑克牌都有一个单独(不重复)的数字来代表,数字越小,扑克牌的值越大
4、合理运用Collections工具类的方法,本文用到了sort(集合降序排序)和shuffle(集合数据随机)
5、把ArrayList里面的值作为HashMap里面的key值,想到这招的真是大神,这也是一开始创建ArrayList的集合的原因
import java.util.*;
public class Test {
public static void main(String[] args) {
//定义hashmap用于存放扑克牌,key值为对应每张牌的编号,value值为54张不同的扑克牌
HashMap<Integer,String> cards = new HashMap<>();
//定义ArrayList集合用于存放每张扑克牌的编号,编号顺序和hashmap编号顺序一致
ArrayList<Integer> list = new ArrayList<>();
//定义扑克牌数字不含大王和小王,按照扑克牌的大小顺序进行排列,方便输出时有序
String[] pokerNum = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
//定义扑克牌的颜色,按照黑、红、梅、方的顺序进行排列
String[] pokerColor = {"♥","♠","♣","♦"};
//定义index变量用于存放每张扑克牌的标记,0和1用于存放大王和小王
int index = 2;
//双重增强for循环把下标值存入map的key值和ArrayList集合汇总,把颜色+数字存入map集合value值中
for(String num : pokerNum){
for(String color : pokerColor){
cards.put(index,color + num);
list.add(index);
index++;
}
}
//双重for循环遍历也可以
// for(int i = 0;i < pokerNum.length;i++){
// for(int j = 0;j < pokerColor.length;j++){
// cards.put(index,pokerColor[j] + pokerNum[i]);
// list.add(index);
// index++;
// }
// }
//存入大王和小王
cards.put(0,"bigJoker");list.add(0);
cards.put(1,"smallJoker");list.add(1);
//洗牌,利用Collections工具类里面的shuffle方法对ArrayList集合进行随机排序
Collections.shuffle(list);
//给3个玩家分别创建一个集合用于存放自己的牌,底牌单独用集合存放
ArrayList<Integer> play1 = new ArrayList<>();
ArrayList<Integer> play2 = new ArrayList<>();
ArrayList<Integer> play3 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
//把顺序打乱后ArrayList集合进行发牌,此时只是发放每张牌对应的编码,而不是把HashMap里面实际的牌值发放给玩家
for(int i = 0;i < list.size();i++){
if(i < 3){//先抽取3张底牌
dipai.add(list.get(i));
}else if(i % 3 == 0){
play1.add(list.get(i));
}else if(i % 3 == 1){
play2.add(list.get(i));
}else if(i % 3 == 2){
play3.add(list.get(i));
}
}
//给每个玩家添加名字
String[] playerName = {"玩家一","玩家二","玩家三"};
//随机选地主,并把底牌添加到地主玩家的集合里面
Random ran = new Random();
int dizhu = ran.nextInt(3);
if(dizhu == 0){
play1.addAll(dipai);
System.out.println("地主是:" + playerName[0]);
}else if(dizhu == 1){
play2.addAll(dipai);
System.out.println("地主是:" + playerName[1]);
}else if(dizhu == 2){
play3.addAll(dipai);
System.out.println("地主是:" + playerName[2]);
}
//对每个玩家底牌编码进行排序,编码值由小到大排序,当时存入ArrayList时,编码值越小,牌的值越大
Collections.sort(play1);
Collections.sort(play2);
Collections.sort(play3);
//调用查看牌方法
System.out.print("底牌是:");
queryPokey(dipai,cards);//底牌
System.out.print(playerName[0] + ":");
queryPokey(play1,cards);//玩家一
System.out.print(playerName[1] + ":");
queryPokey(play2,cards);//玩家二
System.out.print(playerName[2] + ":");
queryPokey(play3,cards);//玩家三
}
//根据每个玩家ArrayList集合里面每张牌的序号值作为HashMap集合里面的key值,通过key值查找value值,就得到了每个玩家的牌
public static void queryPokey(ArrayList<Integer> player,HashMap<Integer,String> cards){
// Set<Integer> set = cards.keySet();
// Iterator<Integer> iterator = set.iterator();
Iterator<Integer> it = player.iterator();
while (it.hasNext()){
int key = it.next();
System.out.print(cards.get(key) + "\t");
}
System.out.println();
}
}