package hunan; import com.game.Util; import com.taurus.core.entity.ITArray; import com.taurus.core.entity.ITObject; import com.taurus.core.entity.TArray; import com.taurus.core.entity.TObject; import com.taurus.core.plugin.database.DataBase; import com.taurus.core.plugin.redis.Redis; import com.taurus.core.util.Logger; import com.taurus.core.util.StringUtil; import redis.clients.jedis.Jedis; import taurus.client.Message; import taurus.client.TaurusClient; import taurus.util.*; import java.sql.SQLException; import java.util.*; public class HuNanChangSha { public static int changShaCard = 0; public static boolean isTinChi = false; public static boolean isTinPeng = false; // private static final Logger log = Logger.getLogger(DoTest.class); private List changShaCardInhandgang = new ArrayList<>(); //长沙麻将出过的牌 private List changShachuguopai = new ArrayList<>(); private List changShaCardInhand = new ArrayList<>(); private Map chuGuoPainum = new HashMap<>(); //杠的牌 private List gangdepai = new ArrayList<>(); //碰牌 private List pongGroup = new ArrayList<>(); //吃牌 private List chowGroup = new ArrayList<>(); // 玩家座位号 public static int seat = 0; // 会话标识 public static String session = ""; // 访问令牌 public static String token = ""; private static ChangShaSuanFaTest changShaSuanFaTest = new ChangShaSuanFaTest(); // 公共的getter和setter方法 public List getgangdepai() { return gangdepai; } public List getchangShaCardInhandgang() { return changShaCardInhandgang; } // 公共的getter和setter方法 public List getpongGroup() { return pongGroup; } public List getchowGroup() { return chowGroup; } public List getChangShaCardInhand() { return changShaCardInhand; } public List getChuGuoCardInhand() { return changShachuguopai; } public Map getChuGuoPainum() { return chuGuoPainum; } /** * 出牌广播协议 812 * * @param command 协议号 * @param message 消息对象 * @return */ public static String drawCard(String command, Message message) { if (command.equalsIgnoreCase("812")) { ITObject param = message.param; if (param == null) { return null; } changShaCard = param.getInt("card"); } return null; } /** * 摸牌协议 819 * * @param command 协议号 * @param message 消息对象 * @return */ public String getCard(String command, Message message, TaurusClient client, Map mapclient) { if (command.equalsIgnoreCase("819")) { ITObject param = message.param; if (param == null) { return null; } Jedis jedis222 = Redis.use("group1_db2").getJedis(); if (param.getInt("player") != null) { Integer player = param.getInt("player"); int drawnCard = param.getInt("card"); changShaSuanFaTest.drawnCards = drawnCard;//存储摸到的牌 changShaCardInhand.add(drawnCard); if (jedis222.hget("{robortInfo}:" + player, "circleId") != null && jedis222.hget("{robortInfo}:" + player, "pid") != null) { String circleId = jedis222.hget("{robortInfo}:" + player, "circleId"); String pid = jedis222.hget("{robortInfo}:" + player, "pid"); String getStart = "g{" + circleId + "}:play:" + pid; if (!pid.equals("0")) { // jedis222.hset(getStart, String.valueOf(player), "2"); } } } jedis222.close(); } return null; } /** * 判断是否应该碰牌 * * @param proposedCard 提议碰的牌 * @return 是否应该碰牌 */ public boolean shouldPong(int proposedCard) { // 直接调用hongZhongSuanFaTest中的shouldPong方法,它已经包含了所有需要的规则 return changShaSuanFaTest.shouldPong(proposedCard, changShaCardInhand); } public boolean shouldChow(int proposedCard) { return changShaSuanFaTest.shouldChow(proposedCard, changShaCardInhand); } /** * 初始化手牌协议 811 * * @param command 协议号 * @param message 消息对象 * @return */ public String cardInHead(String command, Message message, TaurusClient client) { if (command.equalsIgnoreCase("811")) { ITObject param = message.param; if (param == null) { return null; } // {bank_seat=1, laiziCard=0, laiziCard2=0, laiziCard2Before=0, jing=0, laiziCardBefore=0, card_list=[101, 103, 104, 201, 204, 207, 208, 209, 307, 309, 501, 502, 503]} ITArray cardList = param.getTArray("card_list"); List handCards = new ArrayList<>(); for (int i = 0; i < cardList.size(); i++) { handCards.add(cardList.getInt(i)); } for (int i = 0; i < cardList.size(); i++) { changShaCardInhand.add(cardList.getInt(i)); } System.out.println("changShaCardInhand" + changShaCardInhand); } return null; } public static int[][] countTiles(List cardInHand) { int[][] counts = new int[5][10]; // 类型×值 for (Integer card : cardInHand) { if (card == 0) { continue; } counts[card / 100 - 1][card % 100]++; } return counts; } public static boolean isJiangPai(int card) { if (card % 100 == 2 || card % 100 == 5 || card % 100 == 8) { return true; } return false; } public static int checkduijiang(List cardInHand) { Map countMap = new HashMap<>(); for (Integer item : cardInHand) { countMap.put(item, countMap.getOrDefault(item, 0) + 1); } int jiangnum = 0; for (int key : countMap.keySet()) { if (isJiangPai(key) && countMap.get(key) >= 2) { jiangnum++; } } return jiangnum; } /** * 处理 吃,碰,杠,补,胡 * * @param param * @param client * @return 吃 * [TCP->814] data:{"tip_list":[{"type":1,"id":1,"opcard":[108,109],"weight":1,"card":107}]} * 吃 碰 * {"tip_list":[{"type":1,"id":1,"opcard":[206,205],"weight":1,"card":207},{"type":2,"id":2,"opcard":[207],"weight":2,"card":207}]} * 碰补 * {"tip_list":[{"type":2,"id":1,"opcard":[101],"weight":2,"card":101},{"type":3,"id":2,"opcard":[101],"weight":3,"card":101}]} * 补 * [TCP->814] data:{"tip_list":[{"type":5,"id":1,"opcard":[101],"weight":3,"card":101}]} * 吃,碰,补,杠, * {"tip_list":[{"type":1,"id":1,"opcard":[206,204],"weight":1,"card":205},{"type":1,"id":2,"opcard":[206,207],"weight":1,"card":205},{"type":2,"id":3,"opcard":[205],"weight":2,"card":205},{"type":3,"id":4,"opcard":[205],"weight":3,"card":205},{"type":3,"id":5,"opcard":[205],"weight":4,"card":205}]} * 碰 * {"tip_list":[{"type":2,"id":1,"opcard":[207],"weight":2,"card":207}]} * 补,杠 * {"tip_list":[{"type":5,"id":1,"opcard":[207],"weight":3,"card":207},{"type":5,"id":2,"opcard":[207],"weight":4,"card":207}]} *

* //拟定: * 1、对应的提示事件遍历 实行假设做了处理之后的结果 对应结果的对象 * boolean isTing 是否听牌 * boolean canTing 能否听牌 * int tingNum 听多少张 * int isDaHu 是否大胡 * int guzhang 有多少孤章 * int lastHands 差多少手 * int id tiplist id * List opcard * int weight tiplist weight * int card tiplist card * int type tiplist type * 2、通过遍历后的结果进行打分 * 打分系统: * 已经听牌: ---> 40 * 操作后能听 ---> 20 * 操作之后散听 ---> -50 * 听多张,每一张:---> 3 * 孤章,每一张:----> -3 * 差手数:每一手 ----> -5 * 操作之前是否大胡 ----> 10 * 去掉大胡 -----> -10 *

* 先碰107,后补: * {"tip_list":[{"type":5,"id":1,"opcard":[107],"weight":3,"card":107},{"type":5,"id":2,"opcard":[107],"weight":4,"card":107}]} *

* 手上有3个摸一个204:开补 * {"tip_list":[{"type":4,"id":1,"opcard":[204],"weight":3,"card":204},{"type":4,"id":2,"opcard":[204],"weight":4,"card":204}]} *

* 手上有3个,对家打一个206:开补 * {"tip_list":[{"type":3,"id":1,"opcard":[206],"weight":3,"card":206}]} */ public String actionCard(ITObject param, TaurusClient client) { ITArray tipList = param.getTArray("tip_list"); // log.info("tipList" +tipList); ITObject params = TObject.newInstance(); int card = 0; //循环 List yupanhandcard = new ArrayList<>(); yupanhandcard.addAll(changShaCardInhand); //进行操作之前能否下听 List shifoutingpai = changShaSuanFaTest.handscardshifoutingpai(changShaCardInhand, chowGroup, pongGroup, gangdepai); boolean beforelisten = false;//记录操作之前的下听状态 System.out.println("shifoutingpai" + shifoutingpai); if (shifoutingpai.size() > 0) { beforelisten = true; } System.out.println("beforelisten" + beforelisten); //如果杠了之后还能继续听牌则杠 //优先处理胡牌 for (int i = 0; i < tipList.size(); i++) { TObject firstTip1 = (TObject) tipList.get(i).getObject(); int type = firstTip1.getInt("type"); int id = firstTip1.getInt("id"); if (type == 6) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "胡牌"; } } //如果下听了,可以杠 for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); int type = firstTip.getInt("type"); int id = firstTip.getInt("id"); int weight = firstTip.getInt("weight"); card = firstTip.getInt("card"); if ((type == 5 || type == 3 || type == 4) && weight == 4) { //判断开杠后是否能下听 List gangusecars = new ArrayList<>(); gangusecars.addAll(changShaCardInhand); if (type == 3) { Util.removeCard(gangusecars, card, 3); List shifoutingpai3 = changShaSuanFaTest.handscardshifoutingpai(gangusecars, chowGroup, pongGroup, gangdepai); System.out.println(shifoutingpai3); if (shifoutingpai3.size() > 0) { //开杠 //判断是否杠了之后没有牌可以听 List allList = new ArrayList<>(); allList.addAll(changShaCardInhand); allList.addAll(changShachuguopai); int jutingnum = changShaSuanFaTest.getTingPainum(shifoutingpai3, allList); if (jutingnum == 0) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } Util.removeCard(changShaCardInhand, card, 3); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "开杠"; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } } if (type == 4) { // Util.removeCard(changShaCardInhand,card,4); Util.removeCard(gangusecars, card, 4); List shifoutingpai4 = changShaSuanFaTest.handscardshifoutingpai(gangusecars, chowGroup, pongGroup, gangdepai); if (shifoutingpai4.size() > 0) { //开杠 //判断是否杠了之后没有牌可以听 List allList = new ArrayList<>(); allList.addAll(changShaCardInhand); allList.addAll(changShachuguopai); int jutingnum = changShaSuanFaTest.getTingPainum(shifoutingpai4, allList); if (jutingnum == 0) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } Util.removeCard(changShaCardInhand, card, 4); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "开杠"; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } } if (type == 5) { //Util.removeCard(changShaCardInhand,card,1); Util.removeCard(gangusecars, card, 1); List shifoutingpai5 = changShaSuanFaTest.handscardshifoutingpai(gangusecars, chowGroup, pongGroup, gangdepai); if (shifoutingpai5.size() > 0) { //开杠 //判断是否杠了之后没有牌可以听 List allList = new ArrayList<>(); allList.addAll(changShaCardInhand); allList.addAll(changShachuguopai); int jutingnum = changShaSuanFaTest.getTingPainum(shifoutingpai5, allList); if (jutingnum == 0) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } Util.removeCard(changShaCardInhand, card, 1); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "开杠"; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return "不开杠"; } } } } //判断是否是大胡 int beforeIsDahu = 0; beforeIsDahu = changShaSuanFaTest.checkDahu(yupanhandcard, chowGroup, pongGroup, gangdepai); System.out.println("bef:" + beforeIsDahu); //5、门清 if (yupanhandcard.size() == 13 && beforelisten) { beforeIsDahu = 5;//门清 } //操作之前出现的牌 List allSeeCard = new ArrayList<>(); Map pingfenResult = new HashMap<>(); Map idObject = new HashMap<>(); //int bupaiid = 0;//补牌id for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); int type = firstTip.getInt("type"); int id = firstTip.getInt("id"); int weight = firstTip.getInt("weight"); card = firstTip.getInt("card"); ITArray opcard = TArray.newInstance(); opcard = firstTip.getTArray("opcard"); if (type == 6) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "胡牌"; } //if((type==4||type==5||type==6)&&weight==3){ // bupaiid = id; // } //对应的数据 ITObject tmp = new TObject(); //处理听的结果 switch (type) { case 1: //吃 tmp = changShaSuanFaTest.pingguChi(beforelisten, card, opcard, yupanhandcard, beforeIsDahu, allSeeCard, chowGroup, pongGroup, gangdepai, changShachuguopai); break; case 2: //碰 tmp = changShaSuanFaTest.pingguPeng(beforelisten, card, opcard, yupanhandcard, beforeIsDahu, allSeeCard, chowGroup, pongGroup, gangdepai, changShachuguopai); break; default: break; } //记录下来事件 if (tmp.size() > 0) { pingfenResult.put(id, tmp); } ITObject sj = new TObject(); sj.putInt("weight", weight); sj.putInt("type", type); sj.putTArray("opcard", opcard); idObject.put(id, sj); } //计算分数 System.out.println(pingfenResult); if (pingfenResult.size() > 0) { int changeid = changShaSuanFaTest.suanfen(pingfenResult); System.out.println("changeid:" + changeid); //选择最优的分数 if (changeid == 0) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } else { //获取 for (Map.Entry entry : idObject.entrySet()) { if (entry.getKey() == changeid) { ITObject tmp = entry.getValue(); System.out.println("tmp ++++++++++= " + tmp); if (tmp.getInt("type") == 2) { //碰 ITArray outcards = tmp.getTArray("opcard"); for (int i = 0; i < outcards.size(); i++) { Util.removeCard(changShaCardInhand, outcards.getInt(0), 2); } pongGroup.add(outcards.getInt(0)); pongGroup.add(outcards.getInt(0)); pongGroup.add(outcards.getInt(0)); } else if (tmp.getInt("type") == 1) { //吃 ITArray outcards = tmp.getTArray("opcard"); for (int i = 0; i < outcards.size(); i++) { Util.removeCard(changShaCardInhand, outcards.getInt(i), 1); } System.out.println("判断吃 +++++++++" + card); System.out.println("判断吃 ==========" + outcards); chowGroup.add(card); chowGroup.add(outcards.getInt(0)); chowGroup.add(outcards.getInt(1)); } } } params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", changeid); client.send("612", params, response -> { }); return null; } } //计算牌数 //如果 不吃,不碰,而且差三手牌情况,则补 //if (bupaiid>0) { for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); int type = firstTip.getInt("type"); int id = firstTip.getInt("id"); int weight = firstTip.getInt("weight"); card = firstTip.getInt("card"); Map map = new HashMap<>(); List tmpChangSch = new ArrayList<>(); tmpChangSch.addAll(yupanhandcard); ChangshaWinSplitCard.checkNormalHu(tmpChangSch, map); System.out.println("要不要补map:" + map); Map map2 = new HashMap<>(); List tmpChangSch2 = new ArrayList<>(); tmpChangSch2.addAll(yupanhandcard); if (type == 3) { Util.removeCard(tmpChangSch2, card, 3); } else if (type == 4) { Util.removeCard(tmpChangSch2, card, 3); } else if (type == 5) { Util.removeCard(tmpChangSch2, card, 4); } ChangshaWinSplitCard.checkNormalHu(tmpChangSch2, map2); System.out.println("要不要补map2:" + map2); System.out.println(yupanhandcard); //假设补牌 //如果下听不能不能补牌 if (beforelisten) { System.out.println("b补"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } //去一张下听? Map> afterDahuOpbg = changShaSuanFaTest.quyizhangDahuTingPai(yupanhandcard, chowGroup, pongGroup, gangdepai); Map> afterOpbg = changShaSuanFaTest.quyizhangTingPai(yupanhandcard); if (type == 4) { if (afterDahuOpbg.size() > 0 || afterOpbg.size() > 0) { System.out.println("bs补"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } } if (map.size() > 0 && weight == 3) { if (map2.size() > 0) { //判断补牌后 if (Integer.parseInt(map2.get("remainingMelds").toString()) > Integer.parseInt(map.get("remainingMelds").toString()) && Integer.parseInt(map.get("remainingMelds").toString()) <= 2) { System.out.println("b补"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } else { //判断七对 int dh = changShaSuanFaTest.checkDahu(yupanhandcard, chowGroup, pongGroup, gangdepai); if (dh > 0) { System.out.println("不补"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } System.out.println("补"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); if (type == 3) { Util.removeCard(changShaCardInhand, card, 3); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 4) { Util.removeCard(changShaCardInhand, card, 4); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 5) { Util.removeCard(changShaCardInhand, card, 1); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } client.send("612", params, response -> { }); return null; } /*if (Integer.parseInt(map.get("remainingMelds").toString()) > 2) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); if (type == 3) { Util.removeCard(changShaCardInhand, card, 3); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 4) { Util.removeCard(changShaCardInhand, card, 4); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 5) { Util.removeCard(changShaCardInhand, card, 1); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } client.send("612", params, response -> { }); return null; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } */ } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); if (type == 3) { Util.removeCard(changShaCardInhand, card, 3); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 4) { Util.removeCard(changShaCardInhand, card, 4); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } if (type == 5) { Util.removeCard(changShaCardInhand, card, 1); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); gangdepai.add(card); } client.send("612", params, response -> { }); return null; } } } params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); return null; } public String actionCardBak2(ITObject param, TaurusClient client) { ITArray tipList = param.getTArray("tip_list"); // log.info("tipList" +tipList); //tipList[{opcard=[207, 208], weight=1, id=1, type=1, card=206}] boolean chiflag = false;//吃 boolean pengflag = false; //碰 boolean bupai = false; //补 boolean minggang = false; //杠 boolean angang = false; //暗杠 boolean penggang = false; //开杠 int card = 0;//当前 消息的牌 ITObject params = TObject.newInstance(); for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); int type = firstTip.getInt("type"); int id = firstTip.getInt("id"); int weight = firstTip.getInt("weight"); card = firstTip.getInt("card"); if (type == 6) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "胡牌"; } if (type == 1) { chiflag = true; } if (type == 2) { pengflag = true; } if (type == 3 && weight == 3) { //补 bupai = true; } if (type == 3 && weight == 4) { //杠 minggang = true; } if (type == 5) { penggang = true; } } /* //如果吃,没有碰 if (chiflag&&!pengflag){ chiNoPeng(tipList,card,client); } //如果有吃有碰 if (chiflag&&pengflag&&!minggang&&!penggang){ chiOrPeng(tipList,card,client); } //没有吃,有碰 if (!chiflag&&penggang&&!minggang&&!angang){ pengNoChi(tipList,card,client); } if (bupai&&!penggang&&!angang){ //补 } //杠 if (minggang||bupai||penggang){ gangNoChiPeng(tipList,card,client); }*/ return null; } /** * 处理吃 问题 * @param tipList * @param client */ /* public int chiNoPeng(ITArray tipList,int card,TaurusClient client){ ITObject params = TObject.newInstance(); params.putString("session", session + "," + token); //判断是否能吃 //1、吃之后能否下听 List shifoutingpai = TinHuChi.shifoutingpai(changShaCardInhand); if (shifoutingpai.size() == 0) { //没下听 //如果吃了可以立马下听,则吃 int chitingpaiid = changShaSuanFaTest.checkChiTingAction(card,changShaCardInhand); if (chitingpaiid>0){ //处理吃后的数据 params.putInt("qi", 0); params.putInt("id", chitingpaiid-1); //记录吃掉的牌 List> lists = new ArrayList<>(); lists.addAll(TinHuChi.checkChi(changShaCardInhand, card)); List integers = lists.get(chitingpaiid-1); List result1 = getOtherCards1(integers, card); chowGroup.add(card); chowGroup.add(result1.get(0)); chowGroup.add(result1.get(1)); changShaCardInhand.add(card); Util.removeCard(changShaCardInhand,result1.get(0),1); Util.removeCard(changShaCardInhand,result1.get(1),1); Util.removeCard(changShaCardInhand,card,1); client.send("612", params, response -> {}); return chitingpaiid; } //2、吃之后是否没了大胡 //判断是否满足7对 int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); if (pisCardsCount>=4){ params.putInt("qi", 0); params.putInt("id", 0); }else{ //判断是否可以执行 清一色操作 boolean isChow = changShaSuanFaTest.checkAllSameSuitAll(card,changShaCardInhand,pongGroup,chowGroup,gangdepai); if (isChow){ //判断是否可以吃 //判断吃之后是否会破坏下听 //3、吃之后是否破坏牌型 int canchiId = changShaSuanFaTest.checkCanChiAction(card,changShaCardInhand); if (canchiId>0){ params.putInt("qi", 0); params.putInt("id", canchiId-1); //记录吃掉的牌 List> lists = new ArrayList<>(); lists.addAll(TinHuChi.checkChi(changShaCardInhand, card)); List integers2 = lists.get(canchiId-1); List result2 = getOtherCards1(integers2, card); chowGroup.add(card); chowGroup.add(result2.get(0)); chowGroup.add(result2.get(1)); changShaCardInhand.add(card); Util.removeCard(changShaCardInhand,result2.get(0),1); Util.removeCard(changShaCardInhand,result2.get(1),1); Util.removeCard(changShaCardInhand,card,1); client.send("612", params, response -> {}); return chitingpaiid; }else{ params.putInt("qi", 0); params.putInt("id", 0); } }else{ //不可以吃 params.putInt("qi", 0); params.putInt("id", 0); } } }else{ //不吃 //吃之后没有下听 params.putInt("qi", 0); params.putInt("id", 0); } client.send("612", params, response -> {}); return 0; } */ /** * 同时有吃有碰 * @param tipList * @param client */ /* public void chiOrPeng(ITArray tipList,int card,TaurusClient client){ ITObject params = TObject.newInstance(); //判断碰和吃 //判断牌型是否下听 params.putString("session", session + "," + token); List shifoutingpai = TinHuChi.shifoutingpai(changShaCardInhand); if (shifoutingpai.size() == 0) { //1、先判断是否碰之后破坏听牌 //2、如果能碰,则进入判断吃逻辑,对比吃、碰那个会更优 //3、判断吃或者碰之后都会破坏听牌,不能吃和碰 }else{ //有下听 先不做操作,后续判断换牌 params.putInt("qi", 0); params.putInt("id", 0); } client.send("612", params, response -> {}); } /** * 没吃,有碰 * @param tipList * @param client */ /* public void pengNoChi(ITArray tipList,int card,TaurusClient client){ ITObject params = TObject.newInstance(); client.send("612", params, response -> {}); }*/ /** * 杠没有吃,没有碰 * @param tipList * @param client */ /* public void gangNoChiPeng(ITArray tipList,int card,TaurusClient client){ ITObject params = TObject.newInstance(); client.send("612", params, response -> {}); } */ /** * 处理杠碰胡操作 * * @param * @return */ /* public String actionCardbak(ITObject param, TaurusClient client) { TinHuPeng tinHuPeng = new TinHuPeng(); //获取碰杠胡参数 type 和id 后续算法接入,是否能让碰和杠 ITArray tipList = param.getTArray("tip_list"); int id = 0; int type = 0; int opcard = 0; int opcard1 = 0; int card = 0; //胡牌 ITObject params = TObject.newInstance(); for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); id = firstTip.getInt("id"); type = firstTip.getInt("type"); ITArray opcard2 = firstTip.getTArray("opcard"); if (type == 6) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id); client.send("612", params, response -> { }); return "胡牌"; } } //吃杠 int type2 = 0; int opcard3 = 0; int id3 = 0; List gangCardInhand = new ArrayList<>(); gangCardInhand.addAll(changShaCardInhand); gangCardInhand.addAll(chowGroup); gangCardInhand.addAll(pongGroup); TingPaiChecker.TingResult tingResult = TingPaiChecker.checkTingPai(gangCardInhand); if (tingResult.isTingPai()) { //听牌状态 for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); type2 = firstTip.getInt("type"); opcard3 = firstTip.getTArray("opcard").getInt(0); id3 = firstTip.getInt("id"); boolean b = TinHuGang.canGang(gangCardInhand, opcard3, true); //杠牌后是否还能听牌 if (type2 == 3) { // int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); // boolean gang = isAllSameSuitgang(changShaCardInhand, opcard3); if (b) { System.out.println("听牌 +++进入吃杠===============================------------------------------------------------"); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id3); Util.removeCard(changShaCardInhand, opcard3, 3); client.send("612", params, response -> { }); return "吃杠"; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); } } } } else { for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); type2 = firstTip.getInt("type"); opcard3 = firstTip.getTArray("opcard").getInt(0); id3 = firstTip.getInt("id"); if (type2 == 3) { // int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); // boolean gang = isAllSameSuitgang(changShaCardInhand, opcard3); // if (pisCardsCount < 5 && gang) { //不是七小对和清一色的情况下 才允许杠 // System.out.println("没有 +++ 听牌 +++进入吃杠===============================------------------------------------------------"); // // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", id3); // Util.removeCard(changShaCardInhand, opcard3, 3); // // client.send("612", params, response -> { // // }); // return "吃杠"; // } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); } } } TingPaiChecker.TingResult tingResult1 = TingPaiChecker.checkTingPai(gangCardInhand); if (tingResult1.isTingPai()) { for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); type2 = firstTip.getInt("type"); opcard3 = firstTip.getTArray("opcard").getInt(0); id3 = firstTip.getInt("id"); boolean c = TinHuGang.canGang(gangCardInhand, opcard3, false); //杠牌后是否还能听牌 if (type2 == 4) { System.out.println("最新自杠 还没进入下面,但是类型为4自杠了==========================="); if (c) { System.out.println("听牌 +++进入自杠===============================------------------------------------------------"); System.out.println("opcard3 ++++++++++++++++++ ++++++++++888 " + opcard3); System.out.println("id3 ++++++++++++++++++ ++++++++++7777 " + id3); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id3); Util.removeCard(changShaCardInhand, opcard3, 4); client.send("612", params, response -> { }); return "自杠"; } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); } } } } else { for (int i = 0; i < tipList.size(); i++) { TObject firstTip = (TObject) tipList.get(i).getObject(); type2 = firstTip.getInt("type"); if (type2 == 4) { System.out.println("放弃自杠111======================================="); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); client.send("612", params, response -> { }); } } } // for (int i = 0; i < tipList.size(); i++) { // TObject firstTip = (TObject) tipList.get(i).getObject(); // type2 = firstTip.getInt("type"); // opcard3 = firstTip.getTArray("opcard").getInt(0); // id3 = firstTip.getInt("id"); // // if (type2 == 3) { // int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); // boolean gang = isAllSameSuitgang(changShaCardInhand, opcard3); // if (pisCardsCount < 5 && gang) { //不是七小对和清一色的情况下 才允许杠 // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", id3); // Util.removeCard(changShaCardInhand, opcard3, 3); // // client.send("612", params, response -> { // // }); // return "吃杠"; // } else { // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 0); // client.send("612", params, response -> { // // }); // // } // } // } int id1 = 0; int type1 = 0; //吃牌判断 boolean b = false; //碰牌判断 boolean a = false; if (tipList.size() > 0) { TObject firstTip = (TObject) tipList.get(0).getObject(); id1 = firstTip.getInt("id"); type1 = firstTip.getInt("type"); ITArray opcard2 = firstTip.getTArray("opcard"); card = firstTip.getInt("card"); b = TinHuChi.canChi(changShaCardInhand, card); List> lists = TinHuChi.checkChi(changShaCardInhand, card); opcard = firstTip.getTArray("opcard").getInt(0); if (type1 == 1) { opcard1 = firstTip.getTArray("opcard").getInt(1); } } System.out.println("进入吃type:" + type1); if (type1 == 2) { boolean isChow = changShaSuanFaTest.isAllSameSuit1(changShaCardInhand); if (isChow) { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } else { List shifoutingpai = TinHuChi.shifoutingpai(changShaCardInhand); //目前手牌没有听牌 if (shifoutingpai.size() == 0) { //判断是否满足7对 int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); if (pisCardsCount >= 5) { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } else { List temphand = new ArrayList<>(); temphand.addAll(changShaCardInhand); temphand.add(opcard); Util.removeCard(temphand, opcard, 3); List checktingpai1 = TinHuChi.checktingpai(temphand); System.out.println("checktingpai1 碰牌" + checktingpai1); //碰完牌后打牌后可以听牌 if (checktingpai1.size() > 0) { System.out.println("===============进入听胡碰牌================== ++++ "); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id1); pongGroup.add(opcard); pongGroup.add(opcard); pongGroup.add(opcard); Util.removeCard(changShaCardInhand, opcard, 2); } else { //碰之前的map Map map = new HashMap<>(); //碰之后的map Map map2 = new HashMap<>(); //先判断碰之前还需要几手牌,以及孤章 // int jiangnum = checkduijiang(changShaCardInhand); List tmpChangSch = new ArrayList<>(); tmpChangSch.addAll(changShaCardInhand); tmpChangSch.add(opcard); ChangshaWinSplitCard.checkNormalHu(tmpChangSch, map); //碰之后 List pengtemphand = new ArrayList<>(); pengtemphand.addAll(tmpChangSch); Util.removeCard(pengtemphand, opcard, 3); ChangshaWinSplitCard.checkNormalHu(pengtemphand, map2); //判断两个map是否找到更优 System.out.println("碰之前 map1:" + Integer.parseInt(map.get("remainingMelds").toString())); System.out.println("碰之后 map2:" + Integer.parseInt(map2.get("remainingMelds").toString())); //碰之后的手数小于碰之前的手数,可以碰 if (Integer.parseInt(map2.get("remainingMelds").toString()) < Integer.parseInt(map.get("remainingMelds").toString())) { System.out.println("===============碰之后的手数小于碰之前的手数,可以碰 决定碰牌================== ++++ "); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id1); pongGroup.add(opcard); pongGroup.add(opcard); pongGroup.add(opcard); Util.removeCard(changShaCardInhand, opcard, 2); } else if (Integer.parseInt(map2.get("remainingMelds").toString()) == Integer.parseInt(map.get("remainingMelds").toString())) { //碰完后和碰之前手数相等,需要判断孤章数量 //碰之后的数量 int size2 = ((List) map2.get("cardResiue")).size(); System.out.println("碰之后的孤章数量 size" + size2); int size1 = ((List) map.get("cardResiue")).size(); System.out.println("碰之前的孤章数量 size" + size1); if (size2 < size1) { System.out.println("===============碰之后的孤章数量 小于 碰之前的孤章数量可以碰 ================== ++++ "); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id1); pongGroup.add(opcard); pongGroup.add(opcard); pongGroup.add(opcard); Util.removeCard(changShaCardInhand, opcard, 2); } //碰之后的手数大于碰之前的手数,或者碰之后的孤章数量大于碰之前的孤章数量不能碰 } else if (Integer.parseInt(map2.get("remainingMelds").toString()) > Integer.parseInt(map.get("remainingMelds").toString()) || ((List) map2.get("cardResiue")).size() > ((List) map.get("cardResiue")).size()) { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } } } } //听牌的时候先不碰 if (shifoutingpai.size() > 0) { System.out.println("听牌的时候先不碰++++++++++++++++++++++++++++++++"); params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } } // a = tinHuPeng.canPeng(changShaCardInhand, opcard); // ChangShaSuanFaTest changShaSuanFaTest = new ChangShaSuanFaTest(); // int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand);//分析七小对 // boolean peng = changShaSuanFaTest.isAllSameSuit1(changShaCardInhand); // if (a && !ChangShaSuanFaTest.isTin) { // System.out.println("===============进入听胡碰牌==============================="); // // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", id1); // pongGroup.add(opcard); // pongGroup.add(opcard); // pongGroup.add(opcard); // Util.removeCard(changShaCardInhand, opcard, 2); // // } else { // // 根据规则判断是否应该碰牌 // if (shouldPong(opcard) && pisCardsCount < 5 && !peng && !isTinPeng) { // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", id1); // pongGroup.add(opcard); // pongGroup.add(opcard); // pongGroup.add(opcard); // Util.removeCard(changShaCardInhand, opcard, 2); // } else { // params.putString("session", session + "," + token); // params.putInt("qi", 1); // 放弃碰牌 // params.putInt("id", 0); // // } // } } else if (type1 == 3) { int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand);//分析七小对 boolean gang = changShaSuanFaTest.isAllSameSuit1(changShaCardInhand); if (pisCardsCount < 5 && !gang) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", id1); Util.removeCard(changShaCardInhand, opcard, 3); } else { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); } } else if (type1 == 1) { // int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand);//分析七小对 boolean isChow = changShaSuanFaTest.isAllSameSuit1(changShaCardInhand); if (isChow) { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } else { //判断当前手牌是否已经听牌 已经听牌了就不要再吃牌了 List shifoutingpai = TinHuChi.shifoutingpai(changShaCardInhand); //目前手牌没有听牌 if (shifoutingpai.size() == 0) { //判断是否满足7对 int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand); if (pisCardsCount >= 5) { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } else { List> lists = new ArrayList<>(); lists.addAll(TinHuChi.checkChi(changShaCardInhand, card)); int index = 0; int flag = 0; for (List list : lists) { List temphand = new ArrayList<>(); temphand.addAll(changShaCardInhand); temphand.add(card); Util.removeCard(temphand, list.get(0), 1); Util.removeCard(temphand, list.get(1), 1); Util.removeCard(temphand, list.get(2), 1); List checktingpai1 = TinHuChi.checktingpai(temphand); if (checktingpai1.size() > 0) { flag = index + 1; } index++; System.out.println("checktingpai1 吃牌 " + checktingpai1); } // TODO: 2026/1/1 // 1.需要补充 没听牌也可以吃 但是吃之后要比吃之前的手牌强 也就是可听数量变多 // 2.听牌后也能吃牌,要比吃之前的牌强 // 3.碰也一样要加 if (flag > 0) { System.out.println("===============进入听胡吃牌================== ++++ " + flag); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", flag); int index1 = flag - 1; List integers = lists.get(index1); List result1 = getOtherCards1(integers, card); chowGroup.add(card); chowGroup.add(result1.get(0)); chowGroup.add(result1.get(1)); changShaCardInhand.add(card); Util.removeCard(changShaCardInhand, integers.get(0), 1); Util.removeCard(changShaCardInhand, integers.get(1), 1); Util.removeCard(changShaCardInhand, integers.get(2), 1); } else { Map map = new HashMap<>(); Map map2 = new HashMap<>(); //吃之前的逻辑 List> lists1 = TinHuChi.checkChi(changShaCardInhand, card); int jiangnum = checkduijiang(changShaCardInhand); List tmpChangSch = new ArrayList<>(); tmpChangSch.addAll(changShaCardInhand); tmpChangSch.add(card); ChangshaWinSplitCard.checkNormalHu(tmpChangSch, map); System.out.println("checkNormalHu" + map.get("cardResiue")); System.out.println("checktingpai1" + lists1); int index1 = 0; int flag1 = 0; for (List list : lists1) { List temphand = new ArrayList<>(); temphand.addAll(tmpChangSch); Util.removeCard(temphand, list.get(0), 1); Util.removeCard(temphand, list.get(1), 1); Util.removeCard(temphand, list.get(2), 1); ChangshaWinSplitCard.checkNormalHu(temphand, map2); //判断两个map是否找到更优 System.out.println("map1:" + Integer.parseInt(map.get("remainingMelds").toString())); System.out.println("map2:" + Integer.parseInt(map2.get("remainingMelds").toString())); if (Integer.parseInt(map2.get("remainingMelds").toString()) < Integer.parseInt(map.get("remainingMelds").toString())) { flag1 = index1 + 1; } else if (Integer.parseInt(map2.get("remainingMelds").toString()) == Integer.parseInt(map.get("remainingMelds").toString())) { int size2 = ((List) map2.get("cardResiue")).size(); System.out.println("size2" + size2); int size1 = ((List) map.get("cardResiue")).size(); System.out.println("size1" + size1); if (size2 < size1) { flag1 = index1 + 1; } //如果手里没有将,则可以吃 if (jiangnum > 0) { int chihoujiangnum = checkduijiang(temphand); if (chihoujiangnum > 0) { //吃之后还有将 flag1 = index1 + 1; } } else { System.out.println("没队将"); //孤章1张 差一手 不是将 而且card不是将 if (Integer.parseInt(map.get("remainingMelds").toString()) == 1 && size1 == 1 && !isJiangPai(((List) map.get("cardResiue")).get(0)) && !isJiangPai(card)) { //吃 break; } flag1 = index1 + 1; // break; } } index1++; } if (flag1 > 0) { System.out.println("flag1:" + flag1); params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", flag1); int index2 = flag1 - 1; if (index2 >= lists.size()) { index2 = 0; } System.out.println("index2:" + index2); System.out.println("lists:" + lists); List integers = new ArrayList<>(); integers.addAll(lists.get(index2)); List result2 = getOtherCards1(integers, card); chowGroup.add(card); chowGroup.add(result2.get(0)); chowGroup.add(result2.get(1)); changShaCardInhand.add(card); Util.removeCard(changShaCardInhand, integers.get(0), 1); Util.removeCard(changShaCardInhand, integers.get(1), 1); Util.removeCard(changShaCardInhand, integers.get(2), 1); } else { params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } } } } //听牌的时候先不吃 if (shifoutingpai.size() > 0) { System.out.println("听牌的时候先不吃++++++++++++++++++++++++++++++++"); params.putString("session", session + "," + token); params.putInt("qi", 1); params.putInt("id", 0); } // if (b && TinHuChi.isMoreThanLast() && !ChangShaSuanFaTest.isTin) { // // System.out.println("===============进入听胡吃牌=================="); // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 1); // // chowGroup.add(card); // chowGroup.add(opcard); // chowGroup.add(opcard1); //// changShachuguopai.add(card); // Util.removeCard(changShaCardInhand, opcard, 1); // Util.removeCard(changShaCardInhand, opcard1, 1); //// }else { //// params.putString("session", session + "," + token); //// params.putInt("qi", 1); //// params.putInt("id", 0); //// } // } else { // System.out.println("isTin ++++++++++++++++++++++++++++++++++++" + isTinChi); // if (shouldChow(card) && pisCardsCount < 5 && !isChow && !isTinChi) { // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 1); // chowGroup.add(card); // chowGroup.add(opcard); // chowGroup.add(opcard1); // // Util.removeCard(changShaCardInhand, opcard, 1); // Util.removeCard(changShaCardInhand, opcard1, 1); // } else { // params.putString("session", session + "," + token); // params.putInt("qi", 1); // params.putInt("id", 0); // } // } //自杠 // } else if (type1 == 4) { //// TingPaiChecker.TingResult tingResult1 = TingPaiChecker.checkTingPai(gangCardInhand); // // if (tingResult1.isTingPai()) { // boolean c = TinHuGang.canGang(gangCardInhand, opcard, false); //杠牌后是否还能听牌 // if (c) { // System.out.println("听牌 +++进入自杠===============================------------------------------------------------"); // // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 1); // Util.removeCard(changShaCardInhand, opcard, 4); // // } else { // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 0); // } // } else { //// int pisCardsCount = changShaSuanFaTest.countPairs(changShaCardInhand);//分析七小对 //// boolean gang = changShaSuanFaTest.isAllSameSuit1(changShaCardInhand); //// if (pisCardsCount < 5 && !gang) { // System.out.println("没有 +++ 听牌 +++进入自杠===============================------------------------------------------------"); //// //// params.putString("session", session + "," + token); //// params.putInt("qi", 0); //// params.putInt("id", 1); //// Util.removeCard(changShaCardInhand, opcard, 4); //// } else { // params.putString("session", session + "," + token); // params.putInt("qi", 0); // params.putInt("id", 0); //// } // // } // // // // 碰后补杠 // } } } else if (type1 == 5) { params.putString("session", session + "," + token); params.putInt("qi", 0); params.putInt("id", 0); // Util.removeCard(changShaCardInhand, opcard, 1); // } } client.send("612", params, response -> { }); return null; } */ public static List getOtherCards1(List integers, int card) { List result = new ArrayList<>(); for (Integer num : integers) { if (num != card) { result.add(num); } } return result; } public static boolean isAllSameSuitgang(List handCards, int opcard3) { // 统计各花色的牌数量 Map suitCountMap = new HashMap<>(); for (Integer card : handCards) { int suit = card / 100; // 获取花色,100=万,200=筒,300=条 suitCountMap.put(suit, suitCountMap.getOrDefault(suit, 0) + 1); } // 检查是否有花色的牌数量超过8张 for (Map.Entry entry : suitCountMap.entrySet()) { int suit = entry.getKey(); int count = entry.getValue(); if (count >= 9) { // 检查杠牌的花色是否与当前花色一致 int gangSuit = opcard3 / 100; if (suit == gangSuit) { return true; } else { return false; } } } return true; } public static String changePlayer(String command, Message message) { if (command.equalsIgnoreCase("820")) { ITObject param = message.param; if (param == null) { return null; } } return null; } /** * 出牌方法 */ // public String outCard(TaurusClient client, List list) { public String outCard(TaurusClient client, Map> playerOutcardsMap, Map> playerchisMap, Map> playerpengsMap, Map> playermingsMap, Map> playerzisMap) { // playerOutcardsMap + playerchisMap 传到 outCardSuanFa //对出牌进行整合 List resultList = new ArrayList<>(); for (List cards : playerOutcardsMap.values()) { resultList.addAll(cards); } for (List chis : playerchisMap.values()) { resultList.addAll(chis); } for (List pengs : playerpengsMap.values()) { resultList.addAll(pengs); } for (List minggangs : playermingsMap.values()) { resultList.addAll(minggangs); } for (List zigang : playerzisMap.values()) { resultList.addAll(zigang); } // 长沙麻将出牌 String changShaOutCard = changShaSuanFaTest.outCardSuanFa(changShaCardInhand, pongGroup, chowGroup, gangdepai, resultList); // String changShaOutCard = changShaSuanFaTest.outCardSuanFa(list, changShaCard,pongGroup); ITObject params = TObject.newInstance(); int cardToOut; if (StringUtil.isNotEmpty(changShaOutCard)) { cardToOut = Integer.parseInt(changShaOutCard); } else { cardToOut = changShaCardInhand.get(0); } params.putInt("card", cardToOut); int outCountBefore = changShachuguopai.size(); // 当前历史出牌数量 // 第n次出牌时,发送前n-1张出牌 if (outCountBefore >= 1) { // 发送前n-1张(所有历史出牌) List cardsToSend = changShachuguopai.subList(0, outCountBefore); params.putTArray("outcard_list", CardUtil.maJiangToTArray(cardsToSend)); } params.putTArray("card_list", CardUtil.maJiangToTArray(changShaCardInhand)); // 将当前出的牌添加到历史出牌列表 changShachuguopai.add(cardToOut); // 从手牌中移除 changShaCardInhand.remove(Integer.valueOf(cardToOut)); params.putString("session", session + "," + token); client.send("611", params, response -> { }); return null; } /** * 删除出过的牌组 * * @param param * @return */ public String shanchuchuguopai(ITObject param) { if (param == null) { return null; } Integer card = param.getInt("card"); // 操作牌值 Integer type = param.getInt("type"); // 操作类型 Integer from_seat = param.getInt("from_seat"); // 牌来源座位 Integer playerid = param.getInt("playerid"); String sql2 = String.format("SELECT id FROM `account` WHERE jiqiren=9998"); try { ITArray robotId2 = DataBase.use().executeQueryByTArray(sql2); List robotIdsList = new ArrayList<>(); for (int j = 0; j < robotId2.size(); j++) { robotIdsList.add(robotId2.getTObject(j).getInt("id")); } if (!robotIdsList.contains(playerid)) { if (type == 2 || type == 3 || type == 5 || type == 1) { // 碰,杠 getChuGuoCardInhand().remove(Integer.valueOf(card)); } } } catch (SQLException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { HuNanChangSha huNanChangSha = new HuNanChangSha(); ITObject params = TObject.newInstance(); TaurusClient tc = new TaurusClient("47.109.55.7", "10", TaurusClient.ConnectionProtocol.Tcp); List hands1 = new ArrayList<>(); hands1.add(209); hands1.add(209); hands1.add(209); hands1.add(208); hands1.add(208); hands1.add(207); hands1.add(207); hands1.add(206); hands1.add(205); hands1.add(104); hands1.add(104); // hands1.add(105); //hands1.add(103); //hands1.add(102); int card = 203; huNanChangSha.changShaCardInhand.addAll(hands1); TArray tiplist = new TArray(); ITArray opcard = TArray.newInstance(); opcard.addInt(102); // opcard.addInt(205); // opcard.addInt(203); TObject tob = new TObject(); tob.putInt("weight", 3); tob.putInt("id", 1); tob.putInt("type", 4); tob.putInt("card", card); tob.putTArray("opcard", opcard); //tiplist.addTObject(tob); ITArray opcard2 = TArray.newInstance(); // opcard2.addInt(106); opcard2.addInt(107); TObject tob2 = new TObject(); tob2.putInt("weight", 5); tob2.putInt("id", 2); tob2.putInt("type", 5); tob2.putInt("card", card); tob2.putTArray("opcard", opcard2); // tiplist.addTObject(tob2); ITArray opcard3 = TArray.newInstance(); opcard3.addInt(204); opcard3.addInt(205); TObject tob3 = new TObject(); tob3.putInt("weight", 1); tob3.putInt("id", 1); tob3.putInt("type", 1); tob3.putInt("card", card); tob3.putTArray("opcard", opcard3); tiplist.addTObject(tob3); params.putTArray("tip_list", tiplist); System.out.println(params); //已经吃掉数据 // huNanChangSha.chowGroup.add(205); //huNanChangSha.chowGroup.add(204); // huNanChangSha.chowGroup.add(206); //huNanChangSha.chowGroup.add(201); // huNanChangSha.chowGroup.add(202); // huNanChangSha.chowGroup.add(203); // huNanChangSha.chowGroup.add(206); //huNanChangSha.chowGroup.add(204); //huNanChangSha.chowGroup.add(205); String res = huNanChangSha.actionCard(params, tc); System.out.println(res); } }