feyerobot/libs/robot_common/src/main/java/hunan/HuNanChangSha.java

1926 lines
75 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package hunan;
import com.game.Global;
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.util.Logger;
import com.taurus.core.util.StringUtil;
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<Integer> changShaCardInhand = new ArrayList<>();
private List<Integer> changShaCardInhandgang = new ArrayList<>();
//长沙麻将出过的牌
private List<Integer> changShachuguopai = new ArrayList<>();
private Map<Integer,Integer> chuGuoPainum = new HashMap<>();
//杠的牌
private List<Integer> gangdepai = new ArrayList<>();
//碰牌
private List<Integer> pongGroup = new ArrayList<>();
//吃牌
private List<Integer> chowGroup = new ArrayList<>();
// 玩家座位号
public static int seat = 0;
public static int playerId = 0;
public static int cardToOut1 = 0;
// 会话标识
public static String session = "";
// 访问令牌
public static String token = "";
//红中麻将算法
// private static HongZhongSuanFa hongZhongSuanFa = new HongZhongSuanFa();
private static ChangShaSuanFaTest changShaSuanFaTest = new ChangShaSuanFaTest();
// 公共的getter和setter方法
public List<Integer> getChangShaCardInhand() {
return changShaCardInhand;
}
public List<Integer> getgangdepai() {
return gangdepai;
}
public List<Integer> getchangShaCardInhandgang() {
return changShaCardInhandgang;
}
// 公共的getter和setter方法
public List<Integer> getpongGroup() {
return pongGroup;
}
public List<Integer> getchowGroup() {
return chowGroup;
}
public List<Integer> getChuGuoCardInhand() {
return changShachuguopai;
}
public Map<Integer,Integer> 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) {
if (command.equalsIgnoreCase("819")) {
ITObject param = message.param;
if (param == null) {
return null;
}
if (param.getInt("player") != null) {
int drawnCard = param.getInt("card");
changShaSuanFaTest.drawnCards = drawnCard;//存储摸到的牌
changShaCardInhand.add(drawnCard);
changShaSuanFaTest.analyzeHand(changShaCardInhand);
}
}
return null;
}
/**
* 判断是否应该碰牌
*
* @param proposedCard 提议碰的牌
* @return 是否应该碰牌
*/
public boolean shouldPong(int proposedCard) {
// 直接调用hongZhongSuanFaTest中的shouldPong方法它已经包含了所有需要的规则
return changShaSuanFaTest.shouldPong(proposedCard, changShaCardInhand);
// return hongZhongSuanFaTest.shouldPong(proposedCard, Arrays.asList(305,304,303,207,207,204,204,208,208,201,201,412,412));
}
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");
for (int i = 0; i < cardList.size(); i++) {
changShaCardInhand.add(cardList.getInt(i));
}
// if (changShaCardInhand.size() > 13) {
// outCard(client);
// }
}
return null;
}
public static int[][] countTiles(List<Integer> 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<Integer> cardInHand) {
Map<Integer, Integer> 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<Integer> 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<Integer> yupanhandcard = new ArrayList<>();
yupanhandcard.addAll(changShaCardInhand);
//进行操作之前能否下听
List<Integer> 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<Integer> gangusecars = new ArrayList<>();
gangusecars.addAll(changShaCardInhand);
if (type == 3) {
Util.removeCard(gangusecars,card,3);
List<Integer> shifoutingpai3 = changShaSuanFaTest.handscardshifoutingpai(gangusecars,chowGroup,pongGroup,gangdepai);
System.out.println(shifoutingpai3);
if (shifoutingpai3.size() > 0) {
//开杠
//判断是否杠了之后没有牌可以听
List<Integer> 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<Integer> shifoutingpai4 = changShaSuanFaTest.handscardshifoutingpai(gangusecars,chowGroup,pongGroup,gangdepai);
if (shifoutingpai4.size() > 0) {
//开杠
//判断是否杠了之后没有牌可以听
List<Integer> 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<Integer> shifoutingpai5 = changShaSuanFaTest.handscardshifoutingpai(gangusecars,chowGroup,pongGroup,gangdepai);
if (shifoutingpai5.size() > 0) {
//开杠
//判断是否杠了之后没有牌可以听
List<Integer> 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<Integer> allSeeCard = new ArrayList<>();
Map<Integer,ITObject> pingfenResult = new HashMap<>();
Map<Integer,ITObject> 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<Integer,ITObject> 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<String, Object> map = new HashMap<>();
List<Integer> tmpChangSch = new ArrayList<>();
tmpChangSch.addAll(yupanhandcard);
ChangshaWinSplitCard.checkNormalHu(tmpChangSch, map);
System.out.println("要不要补map:" + map);
Map<String, Object> map2 = new HashMap<>();
List<Integer> 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<Integer,List<Integer>> afterDahuOpbg = changShaSuanFaTest.quyizhangDahuTingPai(yupanhandcard,chowGroup,pongGroup,gangdepai);
Map<Integer,List<Integer>> 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<Integer> 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<List<Integer>> lists = new ArrayList<>();
lists.addAll(TinHuChi.checkChi(changShaCardInhand, card));
List<Integer> integers = lists.get(chitingpaiid-1);
List<Integer> 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<List<Integer>> lists = new ArrayList<>();
lists.addAll(TinHuChi.checkChi(changShaCardInhand, card));
List<Integer> integers2 = lists.get(canchiId-1);
List<Integer> 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<Integer> 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 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<Integer> 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<List<Integer>> 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<Integer> 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<Integer> temphand = new ArrayList<>();
temphand.addAll(changShaCardInhand);
temphand.add(opcard);
Util.removeCard(temphand, opcard, 3);
List<Integer> 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<String, Object> map = new HashMap<>();
//碰之后的map
Map<String, Object> map2 = new HashMap<>();
//先判断碰之前还需要几手牌,以及孤章
// int jiangnum = checkduijiang(changShaCardInhand);
List<Integer> tmpChangSch = new ArrayList<>();
tmpChangSch.addAll(changShaCardInhand);
tmpChangSch.add(opcard);
ChangshaWinSplitCard.checkNormalHu(tmpChangSch, map);
//碰之后
List<Integer> 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<Integer>) map2.get("cardResiue")).size();
System.out.println("碰之后的孤章数量 size" + size2);
int size1 = ((List<Integer>) 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<Integer>) map2.get("cardResiue")).size() > ((List<Integer>) 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<Integer> 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<List<Integer>> lists = new ArrayList<>();
lists.addAll(TinHuChi.checkChi(changShaCardInhand, card));
int index = 0;
int flag = 0;
for (List<Integer> list : lists) {
List<Integer> 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<Integer> 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<Integer> integers = lists.get(index1);
List<Integer> 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<String, Object> map = new HashMap<>();
Map<String, Object> map2 = new HashMap<>();
//吃之前的逻辑
List<List<Integer>> lists1 = TinHuChi.checkChi(changShaCardInhand, card);
int jiangnum = checkduijiang(changShaCardInhand);
List<Integer> 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<Integer> list : lists1) {
List<Integer> 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<Integer>) map2.get("cardResiue")).size();
System.out.println("size2" + size2);
int size1 = ((List<Integer>) 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<Integer>) 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<Integer> integers = new ArrayList<>();
integers.addAll(lists.get(index2));
List<Integer> 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<Integer> getOtherCards1(List<Integer> integers, int card) {
List<Integer> result = new ArrayList<>();
for (Integer num : integers) {
if (num != card) {
result.add(num);
}
}
return result;
}
public static boolean isAllSameSuitgang(List<Integer> handCards, int opcard3) {
// 统计各花色的牌数量
Map<Integer, Integer> 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<Integer, Integer> 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<Integer> list) {
public String outCard(TaurusClient client, Map<Integer, List<Integer>> playerOutcardsMap, Map<Integer, List<Integer>> playerchisMap, Map<Integer,
List<Integer>> playerpengsMap, Map<Integer, List<Integer>> playermingsMap, Map<Integer, List<Integer>> playerzisMap) {
// playerOutcardsMap + playerchisMap 传到 outCardSuanFa
//对出牌进行整合
List<Integer> resultList = new ArrayList<>();
for (List<Integer> cards : playerOutcardsMap.values()) {
resultList.addAll(cards);
}
for (List<Integer> chis : playerchisMap.values()) {
resultList.addAll(chis);
}
for (List<Integer> pengs : playerpengsMap.values()) {
resultList.addAll(pengs);
}
for (List<Integer> minggangs : playermingsMap.values()) {
resultList.addAll(minggangs);
}
for (List<Integer> 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<Integer> 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<Integer> 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("127.0.0.1","10", TaurusClient.ConnectionProtocol.Tcp);
List<Integer> 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);
}
}