策略模式

1.定义

  策略模式定义了一族算法,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2.适用性

  1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

  2.需要使用一个算法的不同变体。

  3.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

  4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

3.例子

 

package com.handmobi.gameServer.majiang.guanganmj.jinbi;

import com.handmobi.message.CommonMessage;
import com.handmobi.message.majiangMessage.GuangAnMessage;

import java.util.*;

/**
 * Created by a on 2017/4/1.
 */
public class GuanganMachine {


    public static CommonMessage.RobotAction machineTile(List<Integer> ownerlist, int missType,
                           List<CommonMessage.Group> groups, GuanganBattleRoom room,
                           int index, int ownIndex) {
        boolean flag = false;
        boolean pgflag = true;
        boolean qingQiDuiFlag = false;
        if(room.drawL == index) {
            flag = true;
        }
        if(index == -1) {
            pgflag = false;
            flag = true;
        }
        if(room.huMap.containsKey(index) && !checkOperator(room, index) && flag) {
            return setRobotAction(CommonMessage.Action.Discard, null, room.currDrawTile);
        }

        List<Integer> newList = new ArrayList<>();
        newList.addAll(ownerlist);
        Collections.sort(newList);

        List<CommonMessage.Group> newGroups = new ArrayList<>();
        if(groups != null) {
            newGroups.addAll(groups);
        }

        //手中的缺牌
        List<Integer> missList = getMiss(newList, missType);
//        List<Integer> singleFeng = getSingleFeng(newList) ;
        if(!checkOperator(room, index)) {
            //先打缺牌
            if (missList != null && missList.size() > 0 && flag) {
                return setRobotAction(CommonMessage.Action.Discard, null, missList.get(missList.size() - 1));
            }
/*            if(singleFeng != null && singleFeng.size() > 0 && flag){
                return setRobotAction(CommonMessage.Action.Discard, null, singleFeng.get(singleFeng.size() - 1));
            }*/
        }
        if(missList != null) {
            newList.removeAll(missList);
        }
        //字牌
        List<Integer> ziList = getZiList(newList);
        //获取字牌的数量
        Map<Integer, Integer> ziMap = getMap(ziList);
        //单张字牌的集合
        List<Integer> oneZi = getOneMJ(ziMap);
        //二张字牌的集合
        List<Integer> twoZi = getTwoMJ(ziMap);
        //三张字牌的集合
        List<Integer> threeZi = getThreeMJ(ziMap);
        newList.removeAll(ziList); //删掉字牌

        //获取每张牌的数量(除去字牌)
        Map<Integer, Integer> mapMJ = getMap(newList);
        //单张的集合
        List<Integer> oneMJ = getOneMJ(mapMJ);
        //两张的集合
        List<Integer> twoMJ = getTwoMJ(mapMJ);
        //三张的集合
        List<Integer> threeMJ = getThreeMJ(mapMJ);
        //顺子
        List<Integer> shunList = getShunList(newList);

        //除去顺子
        getAllShunList(newList, shunList);
        //半顺集合
        List<Integer> banShunList = getBanShunList(newList, shunList);

        List<Integer> firstOneMJ = new ArrayList<>();
        List<Integer> secondOneMJ = new ArrayList<>();

        List<Integer> firstTwoMJ = new ArrayList<>();
        List<Integer> secondTwoMJ = new ArrayList<>();

        List<Integer> firstThreeMJ = new ArrayList<>();
        List<Integer> secondThreeMJ = new ArrayList<>();


        int firstType = getType(oneMJ, twoMJ, threeMJ);

        if(oneMJ.size() > 0) {
            for(int i : oneMJ) {
                if(i / 10 == firstType) {
                    firstOneMJ.add(i);
                }else {
                    secondOneMJ.add(i);
                }
            }
        }

        if(twoMJ.size() > 0) {
            for(int i : twoMJ) {
                if(i / 10 == firstType) {
                    firstTwoMJ.add(i);
                }else {
                    secondTwoMJ.add(i);
                }
            }
        }

        if(threeMJ.size() > 0) {
            for(int i : threeMJ) {
                if( i / 10 == firstType) {
                    firstThreeMJ.add(i);
                }else {
                    secondThreeMJ.add(i);
                }
            }
        }

        int type1 = getType(firstOneMJ, firstTwoMJ, firstThreeMJ);
        int type2 = getType(secondOneMJ, secondTwoMJ, secondThreeMJ);


        List<Integer> firstSingleMJ = getSingleMJ(firstOneMJ, shunList, banShunList);
        List<Integer> secondSingleMJ = getSingleMJ(secondOneMJ, shunList, banShunList);

        boolean huFlag = true;

        if(room.getTileNum() > 20) {

            if(newList.size() <= 4 && twoMJ.size() + twoZi.size() == 2
                    || !isAllSameType(newList) && isQingYiSe(newList) ) {
                huFlag = false;
            }
            if(checkOtherAction(room, index)) {
                CommonMessage.Group group = getHuGroup(room, index);
                //int type = group.getHuType();
                int tile = group.getTileUnitList().get(0).getTile(0);
                int ke = GuanganmjServiceImpl.getKe(room.gaTingMap.get(index).get(tile), true);
                List<Integer> list = new ArrayList<>();
                list.addAll(newList);
                list.addAll(ziList);
                removeTile(list, tile, 2);
                Map<Integer, Map<Integer,  Map<Integer, Integer>>> map1 = Util.judgeTing(list, newGroups, index, room);
                if(map1 != null && map1.size() > 0) {
                    removeTile(list, sort(map1, room), 1);
                    Map<Integer,  Map<Integer, Integer>> map2 = HuUntil.judgeTing(list, newGroups, index, room);
                    if(map2 != null && map2.size() > 0) {
                        int ke2 = sortMap(map2);
                        if (ke2 > ke) {
                            huFlag = false;
                        }
                    }
                }
            }
        }

        //只能胡
        if(checkOnlyHu(room, index)) {
            CommonMessage.RobotAction hu = checkHu(room, index, huFlag);
            if (hu != null) {
                return hu;
            }
        }


        if(huFlag) {
            CommonMessage.RobotAction hu = checkHu(room, index, huFlag);
            if (hu != null) {
                return hu;
            }
        }


        if(!checkOperator(room, index)) {
            if(isQingYiSe(newList) && !isAllSameType(newList)) {

            }else {
                Map<Integer, Map<Integer,  Map<Integer, Integer>>> map = null;
                if (ownIndex != 0) {
                    map = Util.judgeTing(newList, newGroups, ownIndex, room);
                } else {
                    map = Util.judgeTing(newList, newGroups, index, room);
                }
                if (map != null && map.size() > 0) {
                    return setRobotAction(CommonMessage.Action.Discard, null, sort(map, room));
                }
            }
        }

        ownIndex = 0;

        if(checkHunYiSe(newList, newGroups, type1, ziList)) {
            boolean cqys = checkQingYiSe(newList, newGroups, type1, ziList);
            if(!isAllSameType(newList, type1)) {
                if(room.getTileNum() > 20) {
                    pgflag = false;
                }
                if(index != -1) {
                    if(check(room, index, type1)) {
                        pgflag = true;
                    }
                    if(firstTwoMJ.size() + firstThreeMJ.size() + twoZi.size()>= 5 && newGroups.size() == 0) {
                        pgflag = false;
                        qingQiDuiFlag = true;
                    }
                    CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
                    if (gang != null) {
                        return gang;
                    }
                    CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
                    if (peng != null) {
                        return peng;
                    }
                }

                //先打单张的风牌
                if(oneZi.size() >0 ){
                    return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                }

                if(secondSingleMJ.size() > 0) {
                    return setRobotAction(CommonMessage.Action.Discard, null, secondSingleMJ.get(0));
                }
                if(secondOneMJ.size() > 0) {
                    for(int i : secondOneMJ) {
                        if(!shunList.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                    for(int i : secondOneMJ) {
                        if(banShunList.contains(i) && secondTwoMJ.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                }
                if(secondTwoMJ.size() > 0) {
                    for(int i : secondTwoMJ) {
                        if(shunList.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                    return setRobotAction(CommonMessage.Action.Discard, null, secondTwoMJ.get(0));
                }
            }else {
                if(index != -1) {
                    pgflag = true;
                    if (firstTwoMJ.size() + firstThreeMJ.size() + twoZi.size()>= 5 && newGroups.size() == 0) {
                        pgflag = false;
                        qingQiDuiFlag = true;
                    }
                    CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
                    if (gang != null) {
                        return gang;
                    }
                    CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
                    if (peng != null) {
                        return peng;
                    }
                }
                if(qingQiDuiFlag) {
                    if(oneZi.size() > 0) {
                        for(int i : oneZi) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(firstOneMJ.size() > 0) {
                        for(int i : firstOneMJ) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(threeZi.size() > 0) {
                        for(int i : threeZi) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(firstThreeMJ.size() > 0) {
                        for(int i : firstThreeMJ) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(oneZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                    }
                    if(firstOneMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, firstOneMJ.get(0));
                    }
                    if(threeZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, threeZi.get(0));
                    }
                    if(firstThreeMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, firstThreeMJ.get(0));
                    }
                }else {
                    if(cqys) {
                        if(oneZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                        }
                        if(twoZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, twoZi.get(0));
                        }
                        if(threeZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, threeZi.get(0));
                        }
                    }
                    if(firstSingleMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, firstSingleMJ.get(0));
                    }
                    if(oneZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                    }
                    if(firstOneMJ.size() > 0) {
                        for(int i : firstOneMJ) {
                            if(!shunList.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                        for(int i : firstOneMJ) {
                            if(banShunList.contains(i) && firstTwoMJ.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(twoZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, twoZi.get(0));
                    }
                    if(firstTwoMJ.size() > 0) {
                        for(int i : firstTwoMJ) {
                            if(shunList.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                        return setRobotAction(CommonMessage.Action.Discard, null, firstTwoMJ.get(0));
                    }
                }
            }
        }

        if(checkHunYiSe(newList, newGroups, type2, ziList)) {
            boolean cqys = checkQingYiSe(newList, newGroups, type2, ziList);
            if(!isAllSameType(newList, type2)) {
                if(room.getTileNum() > 20) {
                    pgflag = false;
                }
                if(index != -1) {
                    if(check(room, index, type2)) {
                        pgflag = true;
                    }
                    if(secondTwoMJ.size() + secondThreeMJ.size() + twoZi.size() >= 5 && newGroups.size() == 0) {
                        pgflag = false;
                        qingQiDuiFlag = true;
                    }
                    CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
                    if (gang != null) {
                        return gang;
                    }
                    CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
                    if (peng != null) {
                        return peng;
                    }
                }

                if(oneZi.size() >0 ){
                    return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                }

                if(firstSingleMJ.size() > 0) {
                    return setRobotAction(CommonMessage.Action.Discard, null, firstSingleMJ.get(0));
                }
                if(firstOneMJ.size() > 0) {
                    for(int i : firstOneMJ) {
                        if(!shunList.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                    for(int i : firstOneMJ) {
                        if(banShunList.contains(i) && firstTwoMJ.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                }
                if(firstTwoMJ.size() > 0) {
                    for(int i : firstTwoMJ) {
                        if(shunList.contains(i)) {
                            return setRobotAction(CommonMessage.Action.Discard, null, i);
                        }
                    }
                    return setRobotAction(CommonMessage.Action.Discard, null, firstTwoMJ.get(0));
                }
            }else {
                if(index != -1) {
                    pgflag = true;
                    if (secondTwoMJ.size() + secondThreeMJ.size() + twoZi.size() >= 5 && newGroups.size() == 0) {
                        pgflag = false;
                        qingQiDuiFlag = true;
                    }
                    CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
                    if (gang != null) {
                        return gang;
                    }
                    CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
                    if (peng != null) {
                        return peng;
                    }
                }
                if(qingQiDuiFlag) {
                    if(oneZi.size() > 0) {
                        for(int i : oneZi) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(secondOneMJ.size() > 0) {
                        for(int i : secondOneMJ) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(threeZi.size() > 0) {
                        for(int i : threeZi) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(secondThreeMJ.size() > 0) {
                        for(int i : secondThreeMJ) {
                            if(isJueMJ(i, room)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(oneZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                    }
                    if(secondOneMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, secondOneMJ.get(0));
                    }
                    if(threeZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, threeZi.get(0));
                    }
                    if(secondThreeMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, secondThreeMJ.get(0));
                    }
                }else {
                    if(cqys) {
                        if(oneZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                        }
                        if(twoZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, twoZi.get(0));
                        }
                        if(threeZi.size() > 0) {
                            return setRobotAction(CommonMessage.Action.Discard, null, threeZi.get(0));
                        }
                    }
                    if(secondSingleMJ.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, secondSingleMJ.get(0));
                    }
                    if(oneZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
                    }
                    if(secondOneMJ.size() > 0) {
                        for(int i : secondOneMJ) {
                            if(!shunList.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                        for(int i : secondOneMJ) {
                            if(banShunList.contains(i) && secondTwoMJ.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                    }
                    if(twoZi.size() > 0) {
                        return setRobotAction(CommonMessage.Action.Discard, null, twoZi.get(0));
                    }
                    if(secondTwoMJ.size() > 0) {
                        for(int i : secondTwoMJ) {
                            if(shunList.contains(i)) {
                                return setRobotAction(CommonMessage.Action.Discard, null, i);
                            }
                        }
                        return setRobotAction(CommonMessage.Action.Discard, null, secondTwoMJ.get(0));
                    }
                }
            }
        }

        if(firstTwoMJ.size() + secondTwoMJ.size() + twoZi.size() >= 5 && index != -1) {
            pgflag = false;
            CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
            if(gang != null) {
                return gang;
            }
            CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
            if(peng != null) {
                return peng;
            }
            int discardTile = getDuiDiscardTile(firstOneMJ, secondOneMJ, firstThreeMJ, secondThreeMJ, room, oneZi, twoZi, threeZi);
            return setRobotAction(CommonMessage.Action.Discard, null, discardTile);
        }

        if(index != -1) {
            CommonMessage.RobotAction gang = checkGang(room, index, pgflag);
            if (gang != null) {
                return gang;
            }
            CommonMessage.RobotAction peng = checkPeng(room, index, pgflag, newList, missType, newGroups, missList, ziList);
            if (peng != null) {
                return peng;
            }
        }

        if(oneZi.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, oneZi.get(0));
        }

        if (firstSingleMJ.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, firstSingleMJ.get(0));
        }

        if (secondSingleMJ.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, secondSingleMJ.get(0));
        }

        for (int i : firstOneMJ) {
            if (!shunList.contains(i)) {
                return setRobotAction(CommonMessage.Action.Discard, null, i);
            }
        }

        if(twoZi.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, twoZi.get(0));
        }

        for (int i : secondOneMJ) {
            if (!shunList.contains(i)) {
                return setRobotAction(CommonMessage.Action.Discard, null, i);
            }
        }
        if (firstTwoMJ.size() > 0) {
            for (int i : firstTwoMJ) {
                if (shunList.contains(i)) {
                    return setRobotAction(CommonMessage.Action.Discard, null, i);
                }
                if (isJueMJ(i, room)) {
                    return setRobotAction(CommonMessage.Action.Discard, null, i);
                }
            }
            return setRobotAction(CommonMessage.Action.Discard, null, firstTwoMJ.get(0));
        }
        if (secondTwoMJ.size() > 0) {
            for (int i : secondTwoMJ) {
                if (shunList.contains(i)) {
                    return setRobotAction(CommonMessage.Action.Discard, null, i);
                }
                if (isJueMJ(i, room)) {
                    return setRobotAction(CommonMessage.Action.Discard, null, i);
                }
            }
            return setRobotAction(CommonMessage.Action.Discard, null, secondTwoMJ.get(0));
        }
        if(firstOneMJ.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, firstOneMJ.get(0));
        }
        if(secondOneMJ.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, secondOneMJ.get(0));
        }

        if(threeZi.size() > 0) {
            return setRobotAction(CommonMessage.Action.Discard, null, threeZi.get(0));
        }

        return setRobotAction(CommonMessage.Action.Discard, null, newList.get(newList.size() - 1));
    }

    /**
     * 获取单张的风牌
     * @param newList 手牌
     * @return List<Integer>
     */
    private static List<Integer> getSingleFeng(List<Integer> newList) {
        List<Integer> result = new ArrayList<>() ;
        Map<Integer, Integer> tempMap = GuanganmjServiceImpl.getTempMap(newList);
        Set<Map.Entry<Integer, Integer>> entries = tempMap.entrySet();
        Iterator<Map.Entry<Integer, Integer>> it = entries.iterator();
        while(it.hasNext()){
            Map.Entry<Integer, Integer> entry = it.next();
            if(entry.getKey()>=35 && entry.getKey() <= 38 && entry.getValue() == 1){
                result.add(entry.getKey()) ;
            }
            it.remove();
        }
        return result;
    }

    private static List<Integer> getMiss(List<Integer> newList, int missType) {
        List<Integer> missList = new ArrayList<>();
        for(int i = 0; i < newList.size(); i++) {
            if(newList.get(i) / 10 == missType - 1) {
                missList.add(newList.get(i));
            }
        }
        if(missList.size() != 0) {
            return missList;
        }
        return null;
    }

    /**
     * 删除牌
     * @param list List
     * @param tile 要删除的牌
     * @param num 删除的数量
     */
    private static void removeTile(List<Integer> list, int tile, int num) {
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext() && num > 0) {
            if(iterator.next() == tile) {
                iterator.remove();
                num--;
            }
        }
    }

    private static boolean isSameType(int tile1, int tile2) {
        if(tile1 % 10 == tile2 % 10) {
            return true;
        }
        return false;
    }

    private static boolean isSameType(int tile1, int tile2, int tile3) {
        if(tile1 / 10 == tile2 / 10 && tile2 / 10 == tile3 / 10) {
            return true;
        }
        return false;
    }

    private static boolean isAllSameType(List<Integer> ownerList, int type) {
        for(int i : ownerList) {
            if(i / 10 != type) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取顺子集合
     * @param ownerList
     * @return
     */
    private static List<Integer> getShunList(List<Integer> ownerList) {
        List<Integer> newList = new ArrayList<>();
        newList.addAll(ownerList);
        Set<Integer> set = new HashSet<>(newList);
        newList.clear();
        newList.addAll(set);
        Collections.sort(newList);
        List<Integer> shunList = new ArrayList<>();
        for(int i = 0; i < newList.size() - 2; i++) {
            if(newList.get(i) + 1 == newList.get(i + 1) && newList.get(i + 1) + 1 == newList.get(i + 2)
                    && isSameType(newList.get(i), newList.get(i + 1), newList.get(i + 2))) {
                shunList.add(newList.get(i));
                shunList.add(newList.get(i + 1));
                shunList.add(newList.get(i + 2));
                i += 2;
            }
        }
        return shunList;
    }

    /**
     * 半顺
     * @param ownerList
     * @param shunList
     * @return
     */
    private static List<Integer> getBanShunList(List<Integer> ownerList, List<Integer> shunList) {
        List<Integer> newList = new ArrayList<>();
        newList.addAll(ownerList);
        for(int i : shunList) {
            removeTile(newList, i, 1);
        }

        Set<Integer> set = new HashSet<>(newList);
        newList.clear();
        newList.addAll(set);
        Collections.sort(newList);
        List<Integer> banShunList = new ArrayList<>();
        for(int i = 0; i < newList.size() - 2; i++) {
            //如果构成半顺,并且是同一类型,并且不形成顺子
            if(newList.get(i) + 1 == newList.get(i + 1) && isSameType(newList.get(i), newList.get(i + 1))
                    && (newList.get(i + 1) + 1 != newList.get(i + 2)
                    || !isSameType(newList.get(i + 1), newList.get(i + 2))
                    || i + 2 >= newList.size())) {
                banShunList.add(newList.get(i));
                banShunList.add(newList.get(i + 1));
                i += 1;
            }
        }
        if(newList.size() == 2) {
            if(newList.get(0) + 1 == newList.get(1) && isSameType(newList.get(0), newList.get(1))) {
                banShunList.add(newList.get(0));
                banShunList.add(newList.get(1));
            }
        }
        return banShunList;
    }

    private static Map<Integer, Integer> getMap(List<Integer> ownerList) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i : ownerList) {
            Integer count = map.get(i);
            if(count == null) {
                count = 0;
            }
            count++;
            map.put(i, count);
        }
        return map;
    }

    private static List<Integer> getOneMJ(Map<Integer, Integer> map) {
        List<Integer> list = new ArrayList<>();
        for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if(entry.getValue() == 1) {
                list.add(entry.getKey());
            }
        }
        return list;
    }

    private static List<Integer> getTwoMJ(Map<Integer, Integer> map) {
        List<Integer> list = new ArrayList<>();
        for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if(entry.getValue() == 2) {
                list.add(entry.getKey());
            }
            if(entry.getValue() == 4) {
                list.add(entry.getKey());
                list.add(entry.getKey());
            }
        }
        return list;
    }

    private static List<Integer> getThreeMJ(Map<Integer, Integer> map) {
        List<Integer> list = new ArrayList<>();
        for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if(entry.getValue() == 3) {
                list.add(entry.getKey());
            }
        }
        return list;
    }

    private static CommonMessage.RobotAction checkPeng(GuanganBattleRoom room, int index, boolean flag,
                                                       List<Integer> newList, int missType,
                                                       List<CommonMessage.Group> newGroups,
                                                       List<Integer> missList, List<Integer> ziList) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                if(group.getActionType() == CommonMessage.Action.Peng) {
                    CommonMessage.RobotAction.Builder builder = CommonMessage.RobotAction.newBuilder();
                    if(flag && room.getTileNum() != 0) {
                        builder.setActionType(CommonMessage.Action.Peng);
                        builder.setGroup(group);
                        if(ziList != null) {
                            newList.addAll(ziList);
                        }
                        removeTile(newList, group.getTileUnitList().get(0).getTile(0), 2);
                        newGroups.add(group);
                        if(missList != null) {
                            newList.addAll(missList);
                        }
                        int dTile = -1;
                        Map<Integer, Map<Integer, Map<Integer, Integer>>> map = null;
                        map = Util.judgeTing(newList, newGroups, index, room);
                        if(map != null && map.size() > 0) {
                            dTile = sort(map, room);
                        }else {
                            //ownIndex = index;
                            dTile = machineTile(newList, missType, newGroups, room, -1, index).getDiscardTile();
                        }
                        builder.setDiscardTile(dTile);
                        return builder.build();
                    }else {
                        builder.setActionType(CommonMessage.Action.Guo);
                        CommonMessage.Group.Builder gGroup = CommonMessage.Group.newBuilder();
                        gGroup.setActionType(CommonMessage.Action.Guo);
                        builder.setGroup(gGroup);
                        return builder.build();
                    }
                }
            }
        }
        return null;
    }

    private static CommonMessage.RobotAction checkGang(GuanganBattleRoom room, int index, boolean flag) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                CommonMessage.RobotAction.Builder builder = CommonMessage.RobotAction.newBuilder();
                if(group.getActionType() == CommonMessage.Action.AnGang || group.getActionType() ==
                        CommonMessage.Action.ZiGang || group.getActionType() == CommonMessage.Action.Gang) {
                    if (flag && room.getTileNum() != 0) {
                        builder.setActionType(group.getActionType());
                        builder.setGroup(group);
                        return builder.build();
                    } else {
                        builder.setActionType(CommonMessage.Action.Guo);
                        CommonMessage.Group.Builder gGroup = CommonMessage.Group.newBuilder();
                        gGroup.setActionType(CommonMessage.Action.Guo);
                        builder.setGroup(gGroup);
                        return builder.build();
                    }
                }
            }
        }
        return null;
    }

    private static CommonMessage.RobotAction checkHu(GuanganBattleRoom room, int index, boolean flag) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                CommonMessage.RobotAction.Builder builder = CommonMessage.RobotAction.newBuilder();
                if(group.getActionType() == CommonMessage.Action.Hu) {
                    if (flag) {
                        builder.setActionType(group.getActionType());
                        return builder.build();
                    }else {
                        builder.setActionType(CommonMessage.Action.Guo);
                        CommonMessage.Group.Builder gGroup = CommonMessage.Group.newBuilder();
                        gGroup.setActionType(CommonMessage.Action.Guo);
                        builder.setGroup(gGroup);
                        return builder.build();
                    }
                }
            }
        }
        return null;
    }

    private static boolean check(GuanganBattleRoom room, int index, int type) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                if(group.getTileUnitList().get(0).getTile(0) / 10 == type ||
                        group.getTileUnitList().get(0).getTile(0) / 10 == 3) {
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean checkZi(GuanganBattleRoom room, int index) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                if(group.getTileUnitList().get(0).getTile(0) / 10 == 3) {
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean checkOtherAction(GuanganBattleRoom room, int index) {
        List<Integer> list = new ArrayList<>();
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                if(group.getActionType() == CommonMessage.Action.Hu) {
                    list.add(1);
                }
                if(group.getActionType() == CommonMessage.Action.Peng) {
                    list.add(2);
                }
            }
        }
        if(list.contains(1) && list.contains(2)) {
            return true;
        }
        return false;
    }

    private static boolean checkOnlyHu(GuanganBattleRoom room, int index) {
        int count = 0;
        CommonMessage.Group group = null;
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if(index == pa.getPlayerIndex()) {
                count++;
                group = pa.getGroup();
            }
        }
        if(count == 1 && group.getActionType() == CommonMessage.Action.Hu) {
            return true;
        }
        return false;
    }

    private static CommonMessage.Group getHuGroup(GuanganBattleRoom room, int index) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                CommonMessage.Group group = pa.getGroup();
                if(group.getActionType() == CommonMessage.Action.Hu) {
                    return group;
                }
            }
        }
        return null;
    }

    private static int getDuiDiscardTile(List<Integer> firstOneMJ, List<Integer> secondOneMJ,
                                         List<Integer> firstThreeMJ, List<Integer> secondThreeMJ,
                                         GuanganBattleRoom room, List<Integer> oneZi, List<Integer> twoZi,
                                         List<Integer> threeZi) {
        if(oneZi != null && oneZi.size() > 0) {
            for(int i : oneZi) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(firstOneMJ != null && firstOneMJ.size() > 0 ) {
            for(int i : firstOneMJ) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(secondOneMJ != null && secondOneMJ.size() > 0) {
            for(int i : secondOneMJ) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(threeZi != null && threeZi.size() > 0) {
            for(int i : threeZi) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(firstThreeMJ != null && firstThreeMJ.size() > 0) {
            for(int i : firstThreeMJ) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(secondThreeMJ != null && secondThreeMJ.size() > 0) {
            for(int i : secondThreeMJ) {
                if(isJueMJ(i, room)) {
                    return i;
                }
            }
        }
        if(oneZi != null && oneZi.size() > 0) {
            return oneZi.get(0);
        }
        if(firstOneMJ != null && firstOneMJ.size() > 0) {
            return firstOneMJ.get(0);
        }
        if(secondOneMJ != null && secondOneMJ.size() > 0) {
            return secondOneMJ.get(0);
        }
        if(threeZi != null && threeZi.size() > 0) {
            return threeZi.get(0);
        }
        if(firstThreeMJ != null && firstThreeMJ.size() > 0) {
            return firstThreeMJ.get(0);
        }
        if(secondThreeMJ != null && secondThreeMJ.size() > 0) {
            return secondThreeMJ.get(0);
        }
        return -1;
    }

    /**
     * 是否绝张
     * @param tile 判断的牌
     * @param room 房间
     * @return true or false
     */
    private static boolean isJueMJ(int tile, GuanganBattleRoom room) {
        if(room.getSpecialTileNum(tile) == 0) {
            return true;
        }
        return false;
    }

    private static boolean checkQingYiSe(List<Integer> ownerList, List<CommonMessage.Group> groups, int type, List<Integer> ziList) {
        List<Integer> list = new ArrayList<>();
        list.addAll(ownerList);
        if(groups != null) {
            for (CommonMessage.Group group : groups) {
                for (CommonMessage.TileUnit tileUnit : group.getTileUnitList()) {
                    list.addAll(tileUnit.getTileList());
                }
            }
        }
        int count = 0;
        for(int i : list) {
            if(i / 10 == type) {
                count++;
            }
        }
        if(count >= 9) {
            return true;
        }
        return false;
    }

    private static boolean checkHunYiSe(List<Integer> ownerList, List<CommonMessage.Group> groups, int type, List<Integer> ziList) {
        List<Integer> newTiles = new ArrayList<>();
        newTiles.addAll(ownerList);
        if(groups != null) {
            for (CommonMessage.Group group : groups) {
                for (CommonMessage.TileUnit tileUnit : group.getTileUnitList()) {
                    newTiles.addAll(tileUnit.getTileList());
                }
            }
        }
        int count = 0;
        for(int i : newTiles) {
            if(i / 10 == type) {
                count++;
            }
        }

        //获取字牌的数量
        Map<Integer, Integer> ziMap = getMap(ziList);
        //二张字牌的集合
        List<Integer> twoZi = getTwoMJ(ziMap);
        //三张字牌的集合
        List<Integer> threeZi = getThreeMJ(ziMap);
        count =count + twoZi.size()*2 +threeZi.size()*3 ;
        if(count > 8) {
            return true;
        }
        return false;
    }

    private static int getType(List<Integer> oneList, List<Integer> twoList, List<Integer> threeList) {
        int type = -1;
        if(oneList.size() > 0) {
            return oneList.get(0) / 10;
        }
        if(twoList.size() > 0) {
            return twoList.get(0) / 10;
        }
        if(threeList.size() > 0) {
            return threeList.get(0) / 10;
        }
        return type;
    }


    private static List<Integer> getSingleMJ(List<Integer> oneMJ, List<Integer> shunList, List<Integer> banShunList) {
        List<Integer> list = new ArrayList<>();
        for(int i : oneMJ) {
            if(!shunList.contains(i) && !banShunList.contains(i)) {
                list.add(i);
            }
        }
        return list;
    }

    /**
     * 获取所有的顺子并把顺子从牌中删除
     * @param list shoupai
     * @param shunList shunzi s
     */
    private static void getAllShunList(List<Integer> list, List<Integer> shunList) {
        List<Integer> newList = new ArrayList<>();
        newList.addAll(list);
        for(int i : shunList) {
            removeTile(newList, i, 1);
        }
        List<Integer> list1 = getShunList(newList);
        if(list1.size() > 0) {
            shunList.addAll(list1);
        }
        if(list1.size() != 0) {
            getAllShunList(list, shunList);
        }
    }

    private static CommonMessage.RobotAction setRobotAction(CommonMessage.Action action, CommonMessage.Group group, int tile) {
        CommonMessage.RobotAction.Builder builder = CommonMessage.RobotAction.newBuilder();
        builder.setActionType(action);
        if(group != null) {
            builder.setGroup(group);
        }
        builder.setDiscardTile(tile);
        return builder.build();
    }

    private static int sort(Map<Integer, Map<Integer, Map<Integer, Integer>>> map, GuanganBattleRoom room) {
        final GuanganBattleRoom tempRoom = room;
        List<Map.Entry<Integer, Map<Integer, Map<Integer, Integer>>>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Map<Integer, Map<Integer, Integer>>>>() {
            @Override
            public int compare(Map.Entry<Integer, Map<Integer, Map<Integer, Integer>>> o1, Map.Entry<Integer, Map<Integer, Map<Integer, Integer>>> o2) {
                int grade1 = 0;
                int grade2 = 0;
                for(Map.Entry<Integer, Map<Integer, Integer>> entry : o1.getValue().entrySet()) {
                    int ke = GuanganmjServiceImpl.getKe(entry.getValue(), true);
                    int num = tempRoom.getSpecialTileNum(entry.getKey());
                    grade1 += ke * num;
                }
                for(Map.Entry<Integer, Map<Integer, Integer>> entry : o2.getValue().entrySet()) {
                    int ke = GuanganmjServiceImpl.getKe(entry.getValue(), true);
                    int num = tempRoom.getSpecialTileNum(entry.getKey());
                    grade2 += ke * num;
                }
                return grade2 - grade1;
            }
        });
        return list.get(0).getKey();
    }

    private static boolean checkOperator(GuanganBattleRoom room, int index) {
        for(GuangAnMessage.GuangAnPlayerAction.Builder pa : room.actionQueue) {
            if (index == pa.getPlayerIndex()) {
                return true;
            }
        }
        return false;
    }

    private static boolean isAllSameType(List<Integer> ownerList) {
        if(ownerList != null && ownerList.size() > 0) {
            int type = ownerList.get(0) / 10;
            for(int i : ownerList) {
                if(i / 10 != type) {
                    return false;
                }
            }
        }
        return true;
    }

    private static boolean isQingYiSe(List<Integer> ownerList) {
        if(ownerList.size() == 0) {
            return true;
        }
        int type = ownerList.get(0) / 10;
        int count1 = 0;
        int count2 = 0;
        for(int i : ownerList) {
            if(i / 10 == type) {
                count1++;
            }else {
                count2++;
            }
        }
        if(count1 >= 9 || count2 >= 9) {
            return true;
        }
        return false;
    }

    public static int sortMap(Map<Integer, Map<Integer, Integer>> oldMap) {
        ArrayList<Map.Entry<Integer, Map<Integer, Integer>>> list = new ArrayList<>(oldMap.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Map<Integer, Integer>>>() {
            @Override
            public int compare(Map.Entry<Integer, Map<Integer, Integer>> o1, Map.Entry<Integer, Map<Integer, Integer>> o2) {
                return GuanganmjServiceImpl.getKe(o1.getValue(), true) - GuanganmjServiceImpl.getKe(o2.getValue(), true);
            }
        });
        return GuanganmjServiceImpl.getKe(list.get(list.size() - 1).getValue(), true);
    }

    private static List<Integer> getZiList(List<Integer> ownerList) {
        List<Integer> list = new ArrayList<>();
        for(int i : ownerList) {
            if(i / 10 == 3) {
                list.add(i);
            }
        }
        return list;
    }
}

  

 

posted @ 2017-06-21 22:51  dquery  阅读(211)  评论(0编辑  收藏  举报