Java 控制台版的跑得快

Java 控制台版的跑得快

package com.iot.common.core;


import org.springframework.beans.BeanUtils;

import java.util.*;
import java.util.stream.Collectors;

public class myTest {

    /**
     * 用户集合
     */
    final static String[] userStr = new String[]{"发哥", "小刀仔", "小趴菜"};

    public static void main(String[] args) {

        System.out.println("******跑得快******");
        System.out.println("开始游戏,请输入【\033[31;4mstart\033[0m】");
        System.out.println("退出游戏,请输入【\033[31;4mexit\033[0m】");

        // 游戏开关
        boolean startBol = true;
        // 游戏次数
        int playerCount = 0;


        while (startBol) {
            System.out.println("请输入......");
            // 用户输入流
            Scanner scanner = new Scanner(System.in);

            String str = scanner.next();

            if ("start".equals(str)) {

                // 次数增加
                playerCount++;

                // 开始游戏
                startBol = startGame(playerCount);
            } else if ("exit".equals(str)){
                System.out.println("结束游戏,拜拜~");
                startBol = false;
            } else {
                System.out.println("请输入【start/exit】");
            }
        }

    }

    /**
     * 开始游戏
     * @param playerCount
     * @return
     */
    public static boolean startGame(int playerCount) {

        System.out.println("第【" + playerCount + "回合开始】......" );

        // 开关
        boolean startBol = true;

        // 出牌顺序队列
        Queue<UserPokerClass> pokerQueue = new LinkedList<>();

        List<UserPokerClass> userPokerClasses = new LinkedList<>();

        for (int i = 0; i <= 2; i++) {
            UserPokerClass userPokerClass = new UserPokerClass();

            userPokerClass.setUserName(userStr[i]);

            userPokerClass.setPokers(
                    pokers
                            .stream()
                            .skip(16 * i)
                            .limit(16
                            )
                            .sorted(Comparator.comparing(PokerClass::getPoker))
                            .collect(Collectors.toList()));
            userPokerClasses.add(userPokerClass);
        }

        // 找到黑桃三放到队列,剩下的数组统一添加到集合
        userPokerClasses = userPokerClasses.stream().filter(eq -> {
            boolean bol = true;
            for (int i = 0; i < eq.getPokers().size(); i++) {
                if (
                        3 == eq.getPokers().get(i).getPoker() &&
                                "♠".equals(eq.getPokers().get(i).getDesignColor())
                ) {
                    pokerQueue.offer(eq);
                    bol = false;
                    break;
                }
            }
            return bol;
        }).collect(Collectors.toList());

        // 剩下两个数组直接放进去(完善过机器人出牌逻辑才放通)
//        pokerQueue.offer(userPokerClasses.get(0));
//        pokerQueue.offer(userPokerClasses.get(1));

        // 打印用户的扑克牌
        putPoker(pokerQueue.peek().getPokers());

        System.out.println("请出牌......");

        boolean bol = true;

        while (bol) {
            Scanner scanner = new Scanner(System.in);

            String str = scanner.next();

            // 把10单独拿出来先装到集合里面
            // 检查用户出的牌,是不是在集合范围内
            List<Integer> scannerList = getUserScannerData(str);

            CheckMsg checkMsg = checkData(scannerList, pokerQueue.peek().getPokers());

            if (checkMsg.getBol()) {
                // 出牌
                putPoker(checkMsg.getPutClasses());
                System.out.println(checkMsg.getMsg() + "......");
                // 消耗队列
                UserPokerClass userPokerClass = pokerQueue.poll();
                userPokerClass.setPokers(checkMsg.getPokerClasses());

                // 新增队列
                pokerQueue.offer(userPokerClass);
                System.out.println("      ");
                System.out.println("      ");
                System.out.println("------------------------------------------");
                System.out.println("      ");
                System.out.println("      ");
                putPoker(checkMsg.getPokerClasses());
                bol = true;
            } else {
                System.out.println(checkMsg.getMsg());
                bol = true;
            }
        }

        return startBol;
    }

    /**
     * 机器人出牌
     * @param userPutData
     * @param pokerQueue
     * @return
     */
    public static CheckMsg AIPutPoker(List<Integer> userPutData, Queue<UserPokerClass> pokerQueue) {

        // 消耗当前出牌队列
        UserPokerClass nowPokerClass = pokerQueue.poll();

        return null;
    }

    /**
     * 出单张牌
     * @param nowPokerClass
     * @return
     */
    public static List<PokerClass> putOne(UserPokerClass nowPokerClass, List<Integer> userPutData) {

        // 上一个用户出的牌
        Integer userPoker = userPutData.get(0);

        /**
         * 几段跑得快出牌逻辑
         * 1、在不拆牌的情况下出牌;
         * 2、是不是有出一张较大的牌就能出跟多张牌或者能够有顺序的出完牌;
         * 3、没有大过用户的牌拆牌输出;
         * 4、如何拆顺子、对子;
         * 5、有炸弹的情况下是否要出炸弹;
         * 6、拆了单排就没办法大3带二或者四带二需要拆对子。
         */
        return null;
    }

    /**
     * 检查数据
     * @param putData
     * @param checkData
     * @return
     */
    public static CheckMsg checkData(List<Integer> putData, List<PokerClass> checkData) {
        CheckMsg checkMsg = new CheckMsg();

        List<PokerClass> putPokerClasses = new ArrayList<>();

        for (Integer putDatum : putData) {
            boolean bol = false;
            for (int i = 0; i < checkData.size(); i++) {
                if (putDatum == checkData.get(i).getPoker()) {
                    PokerClass pokerClass = new PokerClass();
                    BeanUtils.copyProperties(pokerClass, checkData.get(i));
                    putPokerClasses.add(pokerClass);
                    checkData.remove(i);
                    bol = true;
                    break;
                }
            }
            if (!bol) {
                checkMsg.setMsg("不存在扑克牌:【"+pokerFormat(putDatum)+"】");
                checkMsg.setBol(false);
                return checkMsg;
            }
        }

        checkMsg.setBol(true);

        // 验证用户出牌是否合规 单张、对子、连对、顺子、三带二、炸弹、四带二
        // 单张校验
        if (putPokerClasses.size() == 1) {
            checkMsg.setMsg("单张");
        } else if (isPairs(putPokerClasses)) {
            checkMsg.setMsg("对子");
        } else if (isBomb(putPokerClasses)) {
            checkMsg.setMsg("炸弹");
        } else if (isStraight(putPokerClasses)) {
            checkMsg.setMsg("顺子");
        } else if (is3And2(putPokerClasses)){
            checkMsg.setMsg("三带二");
        } else if (is3And2s(putPokerClasses)){
            checkMsg.setMsg("飞机");
        } else if (is4And2(putPokerClasses)) {
            checkMsg.setMsg("四带二");
        } else if (isConsecutivePairs(putPokerClasses)) {
            checkMsg.setMsg("连对");
        } else {
            checkMsg.setBol(false);
            checkMsg.setMsg("出牌不合规【单张、对子、连对、三代二、炸弹、四带二】");
        }

        checkMsg.setPokerClasses(checkData);
        checkMsg.setPutClasses(putPokerClasses);

        return checkMsg;
    }

    /**
     * 是否是对子
     * @param pokerClasses
     * @return
     */
    public static boolean isPairs(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() == 2) {
            return pokerClasses.get(0).getPoker() == pokerClasses.get(1).getPoker();
        }
        return false;
    }

    /**
     * 是否是连对
     * @param pokerClasses
     * @return
     */
    public static boolean isConsecutivePairs(List<PokerClass> pokerClasses) {
        if (pokerClasses.size()%2 == 0) {

            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).distinct().sorted().collect(Collectors.toList());

            /**
             * 判断,当前数+1是不是等于下一位数
             */
            for (int i = 0; i < integerList.size() -1; i++) {
                if (integerList.get(i) + 1 != integerList.get(i + 1)) {
                    return false;
                }
            }
        } else {
            return false;
        }
        return true;
    }

    /**
     * 是否是顺子
     * @param pokerClasses
     * @return
     */
    public static boolean isStraight(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() >= 5) {

            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).sorted().collect(Collectors.toList());

            /**
             * 判断,当前数+1是不是等于下一位数
             */
            for (int i = 0; i < integerList.size() -1; i++) {
                if (integerList.get(i) + 1 != integerList.get(i + 1)) {
                    return false;
                }
            }
        } else {
            return false;
        }
        return true;
    }

    /**
     * 是否是三带二
     * @param pokerClasses
     * @return
     */
    public static boolean is3And2(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() == 5) {
            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).distinct().sorted().collect(Collectors.toList());

            for (Integer integer : integerList) {
                if (pokerClasses.stream().filter(eq -> eq.getPoker() == integer).collect(Collectors.toList()).size() == 3) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 是否是飞机
     * @param pokerClasses
     * @return
     */
    public static boolean is3And2s(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() >= 10) {
            // 应该具备三张的位数
            int count = pokerClasses.size() / 5;

            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).distinct().sorted().collect(Collectors.toList());

            // 三张的数量
            int count3 = 0;

            for (Integer integer : integerList) {
                if (pokerClasses.stream().filter(eq -> eq.getPoker() == integer).collect(Collectors.toList()).size() == 3) {
                    count3++;
                }
            }

            if (count == count3) {
                return true;
            }
        }

        return false;

    }


    /**
     * 是否是四带二
     * @param pokerClasses
     * @return
     */
    public static boolean is4And2(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() == 5) {
            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).distinct().sorted().collect(Collectors.toList());

            for (Integer integer : integerList) {
                if (pokerClasses.stream().filter(eq -> eq.getPoker() == integer).collect(Collectors.toList()).size() == 4) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 是否是炸弹
     * @param pokerClasses
     * @return
     */
    public static boolean isBomb(List<PokerClass> pokerClasses) {
        if (pokerClasses.size() == 4) {
            List<Integer> integerList = pokerClasses.stream().map(PokerClass::getPoker).distinct().sorted().collect(Collectors.toList());

            if (integerList.stream().distinct().collect(Collectors.toList()).size() == 1) {
                return true;
            }
        }

        return false;
    }

    /**
     * 解析用户输入值
     * @param str
     * @return
     */
    public static List<Integer> getUserScannerData(String str) {
        boolean bol = true;

        List<Integer> dataList = new ArrayList<>();

        while (bol) {
            if (str.indexOf("10") >= 0) {
                dataList.add(10);
                str = str.replaceFirst("10" , "");
            } else {
                bol = false;
            }
        }
        for (char c : str.toCharArray()) {
            dataList.add(pokerFormat2(String.valueOf(c)));
        }

        return dataList;

    }

    /**
     * 输出扑克牌
     * @param pokers
     */
    public static void putPoker(List<PokerClass> pokers) {
        StringBuffer sop1 = new StringBuffer();
        StringBuffer sop2 = new StringBuffer();
        StringBuffer sop3 = new StringBuffer();
        StringBuffer sop4 = new StringBuffer();

        // 给用户发牌
        for (PokerClass poker : pokers) {

            if (poker.getPoker() == 10) {
                sop1.append("\033[31;4m"+pokerFormat(poker.getPoker())+"  "+poker.getDesignColor()+"\033[0m  ");
            } else {
                sop1.append("\033[31;4m"+pokerFormat(poker.getPoker())+"   "+poker.getDesignColor()+"\033[0m  ");
            }
            sop2.append("       ");
            sop3.append("       ");

            if (poker.getPoker() == 10) {
                sop4.append("\033[31;4m"+poker.getDesignColor()+"  "+pokerFormat(poker.getPoker())+"\033[0m  ");
            } else {
                sop4.append("\033[31;4m"+poker.getDesignColor()+"   "+pokerFormat(poker.getPoker())+"\033[0m  ");
            }
        }

        System.out.println(sop1);
        System.out.println(sop2);
        System.out.println(sop3);
        System.out.println(sop4);
    }

    /**
     * 扑克牌
     */
    static class UserPokerClass {

        String userName;

        List<PokerClass> pokers;

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public List<PokerClass> getPokers() {
            return pokers;
        }

        public void setPokers(List<PokerClass> pokers) {
            this.pokers = pokers;
        }
    }

    /**
     * 打乱顺序
     */
    static class MyComparator implements Comparator<PokerClass> {

        @Override
        public int compare(PokerClass o1, PokerClass o2) {
            return Math.random() < 0.5? 1 : -1;
        }
    }

    /**
     * 扑克牌集合
     */
    static List<PokerClass> pokers = makePoker();

    /**
     * 创建扑克牌
     *
     * @return
     */
    public static List<PokerClass> makePoker() {

        List<PokerClass> pokerClasses = new ArrayList<>();

        int[] pokers = new int[]{3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15,};
        String[] designColor = new String[]{"♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦","♠","♣","♥","♦"};

        for (int i = 0; i < pokers.length; i++) {
            PokerClass pokerClass = new PokerClass();
            pokerClass.setPoker(pokers[i]);
            pokerClass.setDesignColor(designColor[i]);

            pokerClasses.add(pokerClass);
        }

        // 打乱顺序
        Comparator cmp = new MyComparator();
        pokerClasses.sort(cmp);

        return pokerClasses;
    }

    /**
     * 扑克格式化
     * @param poker
     * @return
     */
    public static String pokerFormat(int poker) {
        String data;

        switch (poker) {
            case 10:
                data = "10";
                break;
            case 11:
                data = "J";
                break;
            case 12:
                data = "Q";
                break;
            case 13:
                data = "K";
                break;
            case 14:
                data = "A";
                break;
            case 15:
                data = "2";
                break;
            default:
                data = String.valueOf(poker);
                break;
        }
        return data;
    }

    /**
     * 扑克格式化(反向)
     * @param poker
     * @return
     */
    public static int pokerFormat2(String poker) {
        int data;

        switch (poker) {
            case "10":
                data = 10;
                break;
            case "J":
            case "j":
                data = 11;
                break;
            case "Q":
            case "q":
                data = 12;
                break;
            case "K":
            case "k":
                data = 13;
                break;
            case "A":
            case "a":
                data = 14;
                break;
            case "2":
                data = 15;
                break;
            default:
                data = Integer.valueOf(poker);
                break;
        }
        return data;
    }

    static class CheckMsg {

        /**
         * 验证状态
         */
        private boolean bol;

        /**
         * 验证结果
         */
        private String msg;

        /**
         * 用户剩余扑克牌数据
         */
        private List<PokerClass> pokerClasses;

        /**
         * 用户出牌数据
         */
        private List<PokerClass> putClasses;

        public boolean getBol() {
            return bol;
        }

        public void setBol(boolean bol) {
            this.bol = bol;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }

        public List<PokerClass> getPokerClasses() {
            return pokerClasses;
        }

        public void setPokerClasses(List<PokerClass> pokerClasses) {
            this.pokerClasses = pokerClasses;
        }

        public List<PokerClass> getPutClasses() {
            return putClasses;
        }

        public void setPutClasses(List<PokerClass> putClasses) {
            this.putClasses = putClasses;
        }
    }

    /**
     * 扑克
     */
    static class PokerClass {
        int poker;

        String designColor;

        public int getPoker() {
            return poker;
        }

        public void setPoker(int poker) {
            this.poker = poker;
        }

        public String getDesignColor() {
            return designColor;
        }

        public void setDesignColor(String designColor) {
            this.designColor = designColor;
        }
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值