java中利用数组和单列集合模拟"斗地主"买牌 洗牌 发牌 理牌 展示 的过程

源代码:


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/ 实际截取的运行时间与现实十分类似(买牌/牌客就位/理牌时间较长),冥冥之中~

猜你喜欢

转载自blog.csdn.net/weixin_42711325/article/details/81813842
今日推荐