源代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
public class PokerDemo1 {
public static void main(String[] args) {
//生成一副扑克牌
System.out.println("买一副牌:");
long time1 = System.currentTimeMillis();//时间点1
ArrayList<String> poker=getPoker();//调用方法getPoker得到一幅扑克牌
long time2 = System.currentTimeMillis();//时间点2
System.out.println(" 花了:"+(time2-time1)+"毫秒");//买牌时间
//创建牌客及底牌集合
ArrayList<String> p1=new ArrayList<>();//拎壶冲
ArrayList<String> p2=new ArrayList<>();//伐木机
ArrayList<String> p3=new ArrayList<>();//小鱼人
ArrayList<String> dp=new ArrayList<>();//底牌集合
System.out.println("牌客就位,分别为: 拎壶冲 伐木机 小鱼人");
long time3 = System.currentTimeMillis();//时间点3
System.out.println(" 花了:"+(time3-time2)+"毫秒");//就位时间
//洗牌
System.out.println("洗牌:");
Collections.shuffle(poker);//调用工具类的洗牌方法,完美!
long time4 = System.currentTimeMillis();//时间点4
System.out.println(" 花了:"+(time4-time3)+"毫秒");//洗牌时间
//发牌
System.out.println("起牌:");
//拿出最后3张作为底牌
dp.add(poker.get(53));
dp.add(poker.get(52));
dp.add(poker.get(51));
poker.remove(53);
poker.remove(52);
poker.remove(51);
LinkedList<ArrayList<String>> linkedList=new LinkedList<>();//建立一个LinkedList<String>作为泛型的LinkedList链式列表
//三位玩家放入该链表
linkedList.add(p1);
linkedList.add(p2);
linkedList.add(p3);
for (String s : poker) {//遍历剩余的51张牌
linkedList.getFirst().add(s);//每次把牌给链表的第一个元素链表
linkedList.addLast(linkedList.removeFirst());//循环滚洞1次该链式列表
}
long time5 = System.currentTimeMillis();//时间点5
System.out.println(" 花了:"+(time5-time4)+"毫秒");//摸牌时间
//理牌
System.out.println("各位大神理牌:");
sort(p1);//拎壶冲理牌
sort(p2);//伐木机理牌
sort(p3);//小鱼人理牌
sort(dp);//闲着也是闲着,底牌也理下
long time6 = System.currentTimeMillis();//时间点6
System.out.println(" 花了:"+(time6-time5)+"毫秒");//理牌时间
//展示牌
System.out.println("展示牌面:");
System.out.println("拎壶冲:"+p1);
System.out.println("伐木机"+p2);
System.out.println("小鱼人"+p3);
System.out.println("底牌"+dp);
long time7 = System.currentTimeMillis();//时间点7
System.out.println(" 花了:"+(time7-time6)+"毫秒");//看牌时间
System.out.println("\n整个过程总共耗时:"+(time7-time1)+"毫秒!");//共耗时
}
//返回一副扑克牌的方法
private static ArrayList<String> getPoker(){
ArrayList<String> poker=new ArrayList<>();
//花色数组
String[] colors={"♠","♥","♣","♦"};
//牌号数组
String[] nums=new String[]{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//花色和数组组合
for (String color : colors) {
for (String num : nums) {
poker.add(color+num);
}
}
//增加大小王
poker.add("小鬼");
poker.add("大鬼");
return poker;
}
//对传入的牌的集合进行排序方法
private static void sort(ArrayList<String> arrayList){
ArrayList<String> arrayList1=new ArrayList<>();//创建一个过渡用链表
for (int i = 0; i < 54; i++) {//预置54个位置,全部置为"*"
arrayList1.add("*");
}
//遍历传入的集合
for (String anArrayList : arrayList) {
char[] chars = anArrayList.toCharArray();//元素拆分为char数组
/*
一下判断的原理解析:
将过渡数组的54个元素"*"看成未"点亮"的54张牌,按斗地主大小规则排序
若为:J Q K A 2 小王 大王时:
单独判断,若有,则放入过渡数组的对应位置,即将本属于该牌面的位置"点亮"
若为3~9时:
将牌面值的数值取出,解析为int类型,再将其运算后得出下标值,利用下标值点亮过渡数组的对应位置
*/
if (anArrayList.equals("大鬼")) {
arrayList1.set(53, anArrayList);
} else if (anArrayList.equals("小鬼")) {
arrayList1.set(52, anArrayList);
} else if (chars.length == 3) {
arrayList1.set(colornum(chars) + 28, anArrayList);
} else if (chars[1] == 'J') {
arrayList1.set(colornum(chars) + 32, anArrayList);
} else if (chars[1] == 'Q') {
arrayList1.set(colornum(chars) + 36, anArrayList);
} else if (chars[1] == 'K') {
arrayList1.set(colornum(chars) + 40, anArrayList);
} else if (chars[1] == 'A') {
arrayList1.set(colornum(chars) + 44, anArrayList);
} else if (chars[1] == '2') {
arrayList1.set(colornum(chars) + 48, anArrayList);
} else {
int j = Integer.parseInt(chars[1] + "");
arrayList1.set(colornum(chars) + ((j - 3) * 4), anArrayList);
}
}
arrayList.clear();//将传入的数组清空
for (String s : arrayList1) {//将过渡数组中点亮的牌面值传递给当前数组
if(!(s.equals("*"))){
arrayList.add(s);
}
}
}
//根据花色返回1个int值,作为当前数组元素基本下标值的增量
private static int colornum(char[] chars){
int term;
switch(chars[0]){
case '♥':
term=0;
break;
case '♠':
term=1;
break;
case '♣':
term=2;
break;
default:
term=3;
break;
}
return term;
}
}
运行结果:
"C:\Program Files\Java\jdk-10.0.2\bin\java.exe" -javaagent:C:\Users\Administrator\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\182.3684.101\lib\idea_rt.jar=62798:C:\Users\Administrator\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\182.3684.101\bin -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\Desktop\itheimawenwei\out\production\itheimawenwei teacherday2.PokerDemo1
买一副牌:
花了:172毫秒
牌客就位,分别为: 拎壶冲 伐木机 小鱼人
花了:31毫秒
洗牌:
花了:16毫秒
起牌:
花了:0毫秒
各位大神理牌:
花了:31毫秒
展示牌面:
拎壶冲:[♥3, ♣3, ♦4, ♥6, ♠6, ♣6, ♣7, ♥9, ♥10, ♠10, ♥J, ♣J, ♣K, ♦K, ♣A, ♥2, ♠2]
伐木机[♠3, ♣5, ♦5, ♦8, ♣9, ♣10, ♦10, ♠J, ♦J, ♥Q, ♠Q, ♠K, ♥A, ♠A, ♦A, ♣2, 小鬼]
小鱼人[♦3, ♥4, ♠4, ♥5, ♦6, ♥7, ♦7, ♥8, ♠8, ♣8, ♠9, ♦9, ♣Q, ♦Q, ♥K, ♦2, 大鬼]
底牌[♣4, ♠5, ♠7]
花了:78毫秒
整个过程总共耗时:328毫秒!
Process finished with exit code 0
程序思想:
1/ 利用LinkedList丰富的首尾操作方法,做了一个每foreach(增强for循环)1次,就可以滚动一次的存放LinkedList链表的链表;
2/ 因牌面值10和1的牌,转换为char数组后,第二位相同,此时根据数组char长度判断出10(因为整副牌只有花色10转换为数组后长度为3);
3/ 采用"点亮",即替换数组"默认值",再挑选出已"点亮"元素的fang方式进行排序;
后记:
1/ 实现方法千千万,只是以上三种编程思想供大家参考;
2/ 实际截取的运行时间与现实十分类似(买牌/牌客就位/理牌时间较长),冥冥之中~