上一个斗地主案例是全是用ArrayList集合做的,ArrayList集合不能实现排序功能,现在刚学会Map集合,利用Map集合的键值对来实现排序功能非常方便。
大体思路是这样的:
- 先建立一个Map集合,key用来存放扑克牌的索引,value用来存54张扑克牌。
- 再建立一个ArrayList集合,专门用来存放索引,这个ArrayList集合非常关键,能否实现排序就是靠ArrayList集合里面存放的索引,索引也是从0-53,一共54个,这个ArrayList的索引最后当做Map集合的key来取出Map集合的value。
- 然后再对ArrayList集合进行打乱,用到了Collection接口中的shuffle方法。
- 打乱之后就是发牌,建立四个ArrayList集合,三个存放玩家的索引,一个存放底牌的索引。
- 最后输出Map集合中的值,建立一个方法lookpoker,分别用三个玩家和底牌的list集合中的索引来取出Map集合中相应的value,然后输出即可。事实上,Map集合中的值一直没有变,插入的时候什么样最后还是什么样,变得是list集合的索引,取出value的关键就是map.get(list里面的索引)。
代码如下:
package cn.gather;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
/**
* 斗地主综合案例升级版(实现了看牌时排序功能)
* 1.准备牌
* 2.洗牌
* 3.发牌
* 4.看牌
*/
public class DouDiZhuT {
public static void main(String[] args ){
/**
* 1.准备牌
*/
//先建立两个数组用来存放花色和数字,然后再对他们进行合并,插入Map数组
String[] colors ={"♥","♣","♦","♠"};
String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
//建立一个Map数组,先存放大王和小王
HashMap<Integer,String> map = new HashMap<>();
//创建List集合对扑克牌进行洗牌,List集合里面放的是Map集合的索引
ArrayList<Integer> list = new ArrayList<>();
map.put(0,"大王");
map.put(1,"小王");
list.add(0);
list.add(1);
Integer k = 2;
for (String i : numbers) {
for (String j : colors) {
map.put(k,j+i);
list.add(k);
k = k +1;
}
}
//System.out.println(map);
//System.out.println(list);
/**
* 2.洗牌
*/
//对List集合进行乱序
Collections.shuffle(list);
//System.out.println(list);
/**
* 3.发牌
*/
ArrayList<Integer> player01 = new ArrayList<>();
ArrayList<Integer> player02 = new ArrayList<>();
ArrayList<Integer> player03 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
//遍历List集合
for (int i = 0; i < list.size(); i++) {
Integer s = list.get(i);
if (i>=51){
dipai.add(s);
}else if (i%3==0){
player01.add(s);
}else if(i%3==1){
player02.add(s);
}else if(i%3==2){
player03.add(s);
}
}
//排序
Collections.sort(player01);
Collections.sort(player02);
Collections.sort(player03);
Collections.sort(dipai);
/**
* 4.看牌
*/
lookpoker("云长",map,player01);
lookpoker("翼德",map,player02);
lookpoker("玄德",map,player03);
lookpoker("底牌",map,dipai);
}
/**
*建立看牌的方法
* @param name : 玩家姓名
* @param map :存放扑克牌的Map集合
* @param list :存放索引的List集合
*/
public static void lookpoker(String name,HashMap<Integer,String> map,ArrayList<Integer> list){
//输出姓名
System.out.print(name + ": ");
//遍历玩家或者底牌集合,获取索引
for (Integer key : list) {
String value = map.get(key);
System.out.print(value + " ");
}
System.out.println();
}
}