要求:
1、自定义洗牌方式,不能使用Collections.shuffle(pokers);方法
2、发完牌后对扑克牌进行排序
一、初始化扑克牌
分析:
把扑克牌一一存进list集合
分析:定义并静态初始化两个数组,一个存储花色colors[],一个存储数值numbers[]
两个for循环遍历把扑克牌存进list,然后加上”大王“ ”小王“。
public static void initPorkers(ArrayList<String> list){
String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
String[] colors = {"♦", "♥", "♣", "♠"};
for (String color: colors){
for (String number: numbers) {
String poker = color+number;
list.add(poker);
}
}
list.add("大🃏");
list.add("小🃏");
System.out.print("发牌前:");
for (String p:list) {
System.out.print(p);
}
}
二、洗牌(打乱排序)
// Collections.shuffle(list); // System.out.println("打乱牌后:"+list);
也可以直接使用上述方法打乱顺序。
分析
根据 set 的不可重复性定义一个Set集合,把随机生成的数存进Set集合
然后把Set转为list集合,遍历List结合,根据Set集合的下标获取到原来List的牌值,然后存进新List集合。
public static ArrayList daluanPokers(ArrayList<String> list){
ArrayList<String> list1 = new ArrayList<>();//洗完牌的集合
Set<Integer> pokers =new LinkedHashSet<>();
Random r = new Random();
while(pokers.size()<list.size()){
int randonNum = r.nextInt(54);
pokers.add(randonNum);
}
ArrayList<Integer> arrayList = new ArrayList<>(pokers);
for (int i=0;i<arrayList.size();i++){
list1.add(list.get(arrayList.get(i)));
}
return list1;
// Collections.shuffle(list);
// System.out.println("打乱牌后:"+list);
}
三、发牌
分析
共有54张牌,3张底牌
ublic static void faPokers(ArrayList<String> list,ArrayList<String> play01,ArrayList<String> play02,
ArrayList<String> play03,ArrayList<String> dipai){
for (int i=0;i<list.size();i++){
String poker = list.get(i);
if (i>50){
dipai.add(poker);
}else if (i%3==0){
play01.add(poker);
}else if (i%3==1){
play02.add(poker);
}else {
play03.add(poker);
}
}
System.out.print("玩家1排序前的牌:");
for (String poker : play01) {
System.out.print(poker + " ");
}
System.out.println();
System.out.print("玩家2排序前的牌:");
for (String poker : play02) {
System.out.print(poker + " ");
}
System.out.println();
System.out.print("玩家3排序前的牌:");
for (String poker : play03) {
System.out.print(poker + " ");
}
System.out.println();
System.out.print("底牌排序前的牌:");
for (String poker : dipai) {
System.out.print(poker + " ");
}
System.out.println();
}
四、排序
这个排序方法是参考网上的,以下是我的分析
将每个牌按照牌的大小进行赋值,“大王” “小王”为最大,所以分别赋值为162,161;
‘2’,‘A’,‘K’,‘Q’,‘J ’,依次为150,140,130,120,110
由于我前面初始化扑克牌时的拼接是 花色加数字 ,所以我只需截取花色后面的字符 即 数字
3--10的牌,然后乘以10,就为 10,20,30......等数字了,最后再加上花色1,2,3,4,便可以把扑克牌字符转为数字了,之后便是简单的排序
private static ArrayList<String> paixu(ArrayList<String> list){
ArrayList<Integer> movecard=new ArrayList<>();
int f=0;
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("大🃏"))
f=162;
else if(list.get(i).equals("小🃏"))
f=161;
else {
if (list.get(i).substring(1).equals("A"))
f = 140;
else if (list.get(i).substring(1).equals("2"))
f = 150;
else if (list.get(i).substring(1).equals("J"))
f = 110;
else if (list.get(i).substring(1).equals("Q"))
f = 120;
else if (list.get(i).substring(1).equals("K"))
f = 130;
else f= Integer.parseInt(list.get(i).substring(1)) * 10;
if(list.get(i).substring(0,1).equals("♠")){
f+=4;
}else if(list.get(i).substring(0,1).equals("♥")){
f+=3;
}else if(list.get(i).substring(0,1).equals("♣")){
f+=2;
}else if(list.get(i).substring(0,1).equals("♦")){
f+=1;
}
}
movecard.add(f);
}
//System.out.print(movecard+" ");
//正式排序
for (int i = list.size(); i > 1; i--) {
for (int j = 0; j < i-1; j++) {
if(movecard.get(j) < movecard.get(j+1)){
swap(movecard,j,j+1);
swap(list,j,j+1);
}
}
}
// System.out.print("movecare:"+movecard);
return list;
}
swap方法如下:
private static <E> void swap(List<E> list, int index1, int index2) {
E e=list.get(index1);
//使用两个set方法将j 和 j+1的值交换
list.set(index1, list.get(index2));
list.set(index2, e);//将index2位置上的元素用e替代,并返回原来的zhi
}
注意:
最后还要将数字转为扑克牌,
swap(list,j,j+1);便是此方法的关键
五、结果