master
fpgajie 2026-01-07 20:07:36 +08:00
parent 34b8efc4f8
commit 08d8666e50
30 changed files with 504 additions and 274 deletions

Binary file not shown.

View File

@ -1604,48 +1604,61 @@ public class HuNanChangSha {
ITObject params = TObject.newInstance(); ITObject params = TObject.newInstance();
TaurusClient tc = new TaurusClient("127.0.0.1","10", TaurusClient.ConnectionProtocol.Tcp); TaurusClient tc = new TaurusClient("127.0.0.1","10", TaurusClient.ConnectionProtocol.Tcp);
List<Integer> hands1 = new ArrayList<>(); List<Integer> hands1 = new ArrayList<>();
hands1.add(209);
hands1.add(209);
hands1.add(207); hands1.add(207);
hands1.add(207); hands1.add(206);
hands1.add(202);
hands1.add(202);
hands1.add(202); hands1.add(205);
hands1.add(109); hands1.add(109);
hands1.add(109); hands1.add(109);
hands1.add(109); hands1.add(107);
hands1.add(102); hands1.add(106);
hands1.add(104); hands1.add(105);
hands1.add(104); hands1.add(203);
hands1.add(102); hands1.add(202);
hands1.add(102); hands1.add(201);
int card= 109; int card= 109;
huNanChangSha.changShaCardInhand.addAll(hands1); huNanChangSha.changShaCardInhand.addAll(hands1);
TArray tiplist= new TArray(); TArray tiplist= new TArray();
ITArray opcard = TArray.newInstance(); ITArray opcard = TArray.newInstance();
opcard.addInt(109); opcard.addInt(207);
opcard.addInt(206);
// opcard.addInt(203); // opcard.addInt(203);
TObject tob = new TObject(); TObject tob = new TObject();
tob.putInt("weight",1); tob.putInt("weight",1);
tob.putInt("id",1); tob.putInt("id",1);
tob.putInt("type",2); tob.putInt("type",1);
tob.putInt("card",card); tob.putInt("card",card);
tob.putTArray("opcard", opcard); tob.putTArray("opcard", opcard);
tiplist.addTObject(tob); //tiplist.addTObject(tob);
ITArray opcard2 = TArray.newInstance(); ITArray opcard2 = TArray.newInstance();
opcard2.addInt(109); opcard2.addInt(109);
// opcard2.addInt(206); // opcard2.addInt(206);
TObject tob2 = new TObject(); TObject tob2 = new TObject();
tob2.putInt("weight",4); tob2.putInt("weight",1);
tob2.putInt("id",2); tob2.putInt("id",1);
tob2.putInt("type",3); tob2.putInt("type",2);
tob2.putInt("card",card); tob2.putInt("card",card);
tob2.putTArray("opcard", opcard2); tob2.putTArray("opcard", opcard2);
tiplist.addTObject(tob2); tiplist.addTObject(tob2);
ITArray opcard3 = TArray.newInstance();
opcard2.addInt(202);
// opcard2.addInt(206);
TObject tob3 = new TObject();
tob3.putInt("weight",3);
tob3.putInt("id",2);
tob3.putInt("type",3);
tob3.putInt("card",card);
tob3.putTArray("opcard", opcard2);
// tiplist.addTObject(tob3);
params.putTArray("tip_list",tiplist); params.putTArray("tip_list",tiplist);
System.out.println(params); System.out.println(params);
//已经吃掉数据 //已经吃掉数据

View File

@ -1296,6 +1296,21 @@ public class JiQiRens {
} else { } else {
// //
//重连
if ("22".equalsIgnoreCase(wanfaId)) { //湖南红中麻将
client = new TaurusClient("8.138.242.190:6421", "game", TaurusClient.ConnectionProtocol.Tcp);
}
if ("10".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("127.0.0.1:6311", "game", TaurusClient.ConnectionProtocol.Tcp);
}
//
if ("66".equalsIgnoreCase(wanfaId)) {
client = new TaurusClient("8.138.242.190:6841", "game", TaurusClient.ConnectionProtocol.Tcp);
}
client.connect();
} }
} }
}); });

View File

@ -508,6 +508,11 @@ public class ChangShaSuanFaTest {
} }
//先拆对子
//再拆门子
ai ai1 = new ai(); ai ai1 = new ai();
// ChangshaMahjongAI ai = new ChangshaMahjongAI(); // ChangshaMahjongAI ai = new ChangshaMahjongAI();
PlayerState playerState = new PlayerState(); PlayerState playerState = new PlayerState();
@ -532,17 +537,17 @@ public class ChangShaSuanFaTest {
} }
int bestDiscard = ai1.findBestDiscard(playerState); //int bestDiscard = ai1.findBestDiscard(playerState);
// System.out.println("bestDiscard:"+bestDiscard);
/* if (bestDiscard != 0) {
if (bestDiscard != 0) {
if (ai1.isTinAi) { if (ai1.isTinAi) {
isTin = true; isTin = true;
} }
System.out.println("Ai出牌长麻 ++++++++++++++++++++++++++++++++++++++"); System.out.println("Ai出牌长麻 ++++++++++++++++++++++++++++++++++++++");
log.info("Ai出牌长麻==============================="); log.info("Ai出牌长麻===============================");
return String.valueOf(bestDiscard); return String.valueOf(bestDiscard);
} }*/
@ -3833,15 +3838,15 @@ public class ChangShaSuanFaTest {
} }
boolean pph = false; boolean pph = false;
//3、碰碰胡 //3、碰碰胡
if (pengGrop.size()==3){ if (pengGrop.size()==3&&chowGrop.size()==0){
if (cpairs>3){ if (cpairs>3){
return 3; return 3;
} }
}else if (pengGrop.size()==6){ }else if (pengGrop.size()==6&&chowGrop.size()==0){
if (cpairs>2){ if (cpairs>2){
return 3; return 3;
} }
}else if (pengGrop.size()==9){ }else if (pengGrop.size()==9&&chowGrop.size()==0){
if (cpairs>1){ if (cpairs>1){
return 3; return 3;
} }
@ -3989,8 +3994,10 @@ public class ChangShaSuanFaTest {
if (entry.getValue().getInt("guzhang")>0){ if (entry.getValue().getInt("guzhang")>0){
tmp= tmp+entry.getValue().getInt("guzhang")*2; tmp= tmp+entry.getValue().getInt("guzhang")*2;
} }
System.out.println("tmp:"+tmp);
fell.put(entry.getKey(), tmp); fell.put(entry.getKey(), tmp);
} }
//找分数最高的id //找分数最高的id
int dangqianfen = 0; int dangqianfen = 0;
int dangqianid = 0; int dangqianid = 0;
@ -4141,7 +4148,15 @@ public class ChangShaSuanFaTest {
Map<String, Object> map2 = new HashMap<>(); Map<String, Object> map2 = new HashMap<>();
System.out.println(checkCards); System.out.println(checkCards);
Map<Integer,List<Integer>> xiatingList = new HashMap<>(); Map<Integer,List<Integer>> xiatingList = new HashMap<>();
pengGrop.add(card);
pengGrop.add(card);
pengGrop.add(card);
map2 = quyizhangChayou(checkCards,chowGroup,pengGrop,gangGrop,xiatingList); map2 = quyizhangChayou(checkCards,chowGroup,pengGrop,gangGrop,xiatingList);
Util.removeCard(pengGrop,card,3);
pengGrop.add(card);
pengGrop.add(card);
System.out.println("map2:"+map2); System.out.println("map2:"+map2);
System.out.println("xiatingList:"+xiatingList); System.out.println("xiatingList:"+xiatingList);
//比对 //比对
@ -4221,6 +4236,19 @@ public class ChangShaSuanFaTest {
chiob.putInt("teshu",5); chiob.putInt("teshu",5);
} }
} }
//检测是否有4对
int duizi = countPairs(yupanhandcard);
if (duizi>=4&&pengGrop.size()==0){
chiob.putInt("teshu",5);
}
if (duizi>=3&&pengGrop.size()==1){
chiob.putInt("teshu",8);
}
if (duizi>=2&&pengGrop.size()==2){
chiob.putInt("teshu",10);
}
System.out.println("peng:"+chiob); System.out.println("peng:"+chiob);
return chiob; return chiob;
} }
@ -4328,7 +4356,18 @@ public class ChangShaSuanFaTest {
Map<String, Object> map2 = new HashMap<>(); Map<String, Object> map2 = new HashMap<>();
System.out.println(checkCards); System.out.println(checkCards);
Map<Integer,List<Integer>> xiatingList = new HashMap<>(); Map<Integer,List<Integer>> xiatingList = new HashMap<>();
chowGroup.add(card);
for (int i=0;i<opcard.size();i++){
chowGroup.add(opcard.getInt(i));
}
map2 = quyizhangChayou(checkCards,chowGroup,pengGrop,gangGrop,xiatingList); map2 = quyizhangChayou(checkCards,chowGroup,pengGrop,gangGrop,xiatingList);
Util.removeCard(chowGroup,card,1);
for (int i=0;i<opcard.size();i++){
Util.removeCard(chowGroup,opcard.getInt(i),1);
}
System.out.println("map2:"+map2); System.out.println("map2:"+map2);
System.out.println("xiatingList:"+xiatingList); System.out.println("xiatingList:"+xiatingList);
//比对 //比对
@ -4390,7 +4429,8 @@ public class ChangShaSuanFaTest {
*/ */
public static List<Integer> handscardshifoutingpai(List<Integer> cardhand,List<Integer>chowGroup,List<Integer> pongGroup,List<Integer> gangdepai) { public static List<Integer> handscardshifoutingpai(List<Integer> cardhand,List<Integer>chowGroup,List<Integer> pongGroup,List<Integer> gangdepai) {
List<Integer> tpcards = new ArrayList<>(); List<Integer> tpcards = new ArrayList<>();
List<Integer> tmphc = cardhand; List<Integer> tmphc = new ArrayList<>();
tmphc.addAll(cardhand);
for (int j = 101; j <= 109; j++) { for (int j = 101; j <= 109; j++) {
WinCard win = new WinCard(tmphc, j); WinCard win = new WinCard(tmphc, j);
if (win.tryWin()) { if (win.tryWin()) {
@ -4398,8 +4438,9 @@ public class ChangShaSuanFaTest {
tpcards.add(j); tpcards.add(j);
} }
} }
Paixing px = new Paixing(); Paixing px = new Paixing();
if(px.tingCheck(cardhand,chowGroup,pongGroup,gangdepai)){ if(px.tingCheck(tmphc,chowGroup,pongGroup,gangdepai)){
if (!tpcards.contains(j)) { if (!tpcards.contains(j)) {
tpcards.add(j); tpcards.add(j);
} }
@ -4413,15 +4454,13 @@ public class ChangShaSuanFaTest {
tpcards.add(k); tpcards.add(k);
} }
} }
if(px.tingCheck(cardhand,chowGroup,pongGroup,gangdepai)){ if(px.tingCheck(tmphc,chowGroup,pongGroup,gangdepai)){
if (!tpcards.contains(k)) { if (!tpcards.contains(k)) {
tpcards.add(k); tpcards.add(k);
} }
} }
} }
//如果没有则检测大胡 //如果没有则检测大胡
return tpcards; return tpcards;
} }
@ -4465,7 +4504,9 @@ public class ChangShaSuanFaTest {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
Map<Integer,Map<String, Object>> bigMap = new HashMap<>(); Map<Integer,Map<String, Object>> bigMap = new HashMap<>();
List<Integer> tmphc = cardhand; List<Integer> tmphc = new ArrayList<>();
tmphc.addAll(cardhand);
System.out.println("tmphc1:"+tmphc);
for (int i = 0; i < cardhand.size(); i++) { for (int i = 0; i < cardhand.size(); i++) {
int tmpcard = tmphc.get(0); int tmpcard = tmphc.get(0);
tmphc.remove(0); tmphc.remove(0);
@ -4476,18 +4517,22 @@ public class ChangShaSuanFaTest {
//检查是否能下听 //检查是否能下听
List<Integer> tmxt = new ArrayList<>(); List<Integer> tmxt = new ArrayList<>();
tmxt =handscardshifoutingpai(tmphc,chowGroup,pongGroup,gangdepai); tmxt = handscardshifoutingpai(tmphc,chowGroup,pongGroup,gangdepai);
if (tmxt.size()>0){ if (tmxt.size()>0){
xiatingList.put(tmpcard,tmxt); xiatingList.put(tmpcard,tmxt);
} }
tmphc.add(tmpcard); tmphc.add(tmpcard);
} }
System.out.println(bigMap);
System.out.println("吃之后");
//遍历找最优解 //遍历找最优解
if (bigMap.size()==0){ if (bigMap.size()==0){
return map; return map;
} }
Map<String, Object> bestmap = gaiBestCardInMap(bigMap); Map<String, Object> bestmap = gaiBestCardInMap(bigMap);
return bestmap; return bestmap;
} }
private static Map<String, Object> gaiBestCardInMap(Map<Integer,Map<String, Object>> map){ private static Map<String, Object> gaiBestCardInMap(Map<Integer,Map<String, Object>> map){
@ -4505,6 +4550,7 @@ public class ChangShaSuanFaTest {
}else if (tmpr==entr){ }else if (tmpr==entr){
List<Integer> tl = (List<Integer>)tmpmap.get("cardResiue"); List<Integer> tl = (List<Integer>)tmpmap.get("cardResiue");
List<Integer> enl = (List<Integer>)entry.getValue().get("cardResiue"); List<Integer> enl = (List<Integer>)entry.getValue().get("cardResiue");
if (tl.size()>enl.size()){ if (tl.size()>enl.size()){
tmpmap = entry.getValue(); tmpmap = entry.getValue();
} }
@ -4521,6 +4567,7 @@ public class ChangShaSuanFaTest {
} }
} }
} }
return tmpmap; return tmpmap;
} }
@ -4528,20 +4575,20 @@ public class ChangShaSuanFaTest {
// 测试用例没有258将牌的情况 // 测试用例没有258将牌的情况
List<Integer> test1 = new ArrayList<Integer>(); List<Integer> test1 = new ArrayList<Integer>();
test1.add(109); test1.add(208);
test1.add(109); test1.add(208);
test1.add(208);
test1.add(201);
test1.add(201);
test1.add(108); test1.add(108);
test1.add(107); test1.add(107);
test1.add(107); test1.add(107);
test1.add(107);
test1.add(104);
test1.add(102);
test1.add(103); test1.add(103);
test1.add(102); test1.add(103);
test1.add(102); test1.add(101);
test1.add(101); test1.add(101);
test1.add(101); test1.add(101);
@ -4574,7 +4621,7 @@ public class ChangShaSuanFaTest {
//gangguopai.add(206); //gangguopai.add(206);
//gangguopai.add(206); //gangguopai.add(206);
int card = 105; int card = 202;
List<Integer>pengCard = new ArrayList<>(); List<Integer>pengCard = new ArrayList<>();
// pengCard.add(102); // pengCard.add(102);
//出牌求优 //出牌求优

View File

@ -2,10 +2,82 @@ package taurus.util;
import com.game.Util; import com.game.Util;
import java.sql.Array;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class ChangshaWinSplitCard { public class ChangshaWinSplitCard {
// 获取数值
// 获取数值
public static int GetCardValue(int cbCardData) {
return cbCardData % 100;
}
// 获取花色
public static int GetCardColor(int cbCardData) {
return cbCardData / 100;
}
// 扑克转换
public static int SwitchToCardData(int cbCardIndex) {
int cbCardColor = cbCardIndex / 10;
int cbCardValue = cbCardIndex % 10;
if (cbCardIndex < 27) { // 9 -> 200 + 1 //10 -> 202 //11 -> 203 // 17 -> 209 // 18 -> 301 19->302 20 ->
// 303 26->309
if (cbCardValue + (cbCardColor + 1) >= 10) {
return (cbCardColor + 2) * 100 + (cbCardValue + (cbCardColor + 1)) % 10 + 1;
} else {
return (cbCardColor + 1) * 100 + cbCardValue + (cbCardColor + 1);
}
} else { // 27 -> 400 //28 -> 403 // 29 -> 406 // 30 -> 409 //31 -> 412 // 32 -> 415 //
// 33 -> 418
if (cbCardValue + (cbCardColor + 1) >= 10) {
return (cbCardColor + 2) * 100 + (cbCardValue + (cbCardColor + 1)) % 10 * 3;
} else {
return (cbCardColor + 1) * 100 + (cbCardValue + cbCardColor) * 3;
}
}
}
// 扑克转换
public static int SwitchToCardIndex(int cbCardData) {
// 扑克属性
int cbCardColor = GetCardColor(cbCardData);
int cbCardValue = GetCardValue(cbCardData);
if (cbCardColor <= 3) {
return (cbCardColor - 1) * 10 + cbCardValue - cbCardColor;
} else {
return (cbCardColor - 1) * 10 + cbCardValue / 3 - cbCardColor + 1;
}
}
// 扑克转换
public static int[] SwitchToCardData(List<Integer> cardInhand) {
int[] cardIndex = new int[34];
for (int i = 0; i < cardIndex.length; i++) {
cardIndex[i] = 0;
}
for (int i = 0; i < cardInhand.size(); i++) {
int pos = SwitchToCardIndex(cardInhand.get(i));
cardIndex[pos]++;
}
return cardIndex;
}
// 扑克转换
public static List<Integer> SwitchToCardIndex(int[] cardIndex) {
List<Integer> cardIndexList = new ArrayList<Integer>();
for (int i = 0; i < cardIndex.length; i++) {
for (int j = 0; j < cardIndex[i]; j++) {
int card = SwitchToCardData(i);
cardIndexList.add(card);
}
}
return cardIndexList;
}
// 统计牌数 // 统计牌数
public static int[][] countTiles(List<Integer> cardInHand) { public static int[][] countTiles(List<Integer> cardInHand) {
@ -20,7 +92,6 @@ public class ChangshaWinSplitCard {
return counts; return counts;
} }
// 检测不带精湖 // 检测不带精湖
public static int checkNormalHu(List<Integer> cardInHand, Map<String, Object> map) { public static int checkNormalHu(List<Integer> cardInHand, Map<String, Object> map) {
String info = ""; String info = "";
@ -53,7 +124,8 @@ public class ChangshaWinSplitCard {
List<Integer> cardResiue = (List<Integer>) map.get("cardResiue"); List<Integer> cardResiue = (List<Integer>) map.get("cardResiue");
for (int i = 0; i < cardResiue.size() - 1; i++) { for (int i = 0; i < cardResiue.size() - 1; i++) {
if (cardResiue.get(i).equals(cardResiue.get(i + 1)) && (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5 || cardResiue.get(i) % 100 == 8)) { if (cardResiue.get(i).equals(cardResiue.get(i + 1))
&& (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5 || cardResiue.get(i) % 100 == 8)) {
cardResiue.remove(i); cardResiue.remove(i);
cardResiue.remove(i); cardResiue.remove(i);
break; break;
@ -68,40 +140,6 @@ public class ChangshaWinSplitCard {
return group; return group;
} }
public static void haveBetween(List<Integer> cards, List<Integer> cardInHand) {
if (cards.size() <= 1 || cardInHand.size() <= 1) {
return;
}
// 创建要删除的牌列表
Set<Integer> toRemove = new HashSet<>();
// 遍历手牌中的每一张牌
for (int handCard : cardInHand) {
// 检查cards中是否有与手牌形成靠章的牌
for (int card : cards) {
// 定义靠章规则:相同、相邻或隔一张
int diff = Math.abs(card - handCard);
if (diff == 1 || diff == 2) {
toRemove.add(card);
}
}
}
// 只有当cards中还有多于1张牌时才执行删除
//if (toRemove.size()- cards.size() > 1){
if(cards.size()-toRemove.size()>0){
cards.removeAll(toRemove);
}
// 可选:打印信息
if (!toRemove.isEmpty()) {
System.out.println("删除的牌: " + toRemove);
System.out.println("cards剩余: " + cards);
}
}
// 递归检查是否可以组成顺子或刻子 // 递归检查是否可以组成顺子或刻子
public static int checkMelds(int[][] counts, int remainingMelds, Map<String, Object> map) { public static int checkMelds(int[][] counts, int remainingMelds, Map<String, Object> map) {
if (remainingMelds == 0) { if (remainingMelds == 0) {
@ -150,24 +188,24 @@ public class ChangshaWinSplitCard {
// 判断孤章 // 判断孤章
List<Integer> cardResiue = convertCountToCards(counts); List<Integer> cardResiue = convertCountToCards(counts);
// System.out.println("只差几手牌" + remainingMelds + "," + cardResiue); // System.out.println("只差几手牌" + remainingMelds + "," + cardResiue);
if (cardResiue.size()!=0) { if (cardResiue.size() != 0) {
//优先保留连续张 // 优先保留连续张
removeConsecutivePairs1(cardResiue); removeConsecutivePairs1(cardResiue);
} }
if (cardResiue.size()!=0) { if (cardResiue.size() != 0) {
//第二优先保留对子 // 第二优先保留对子
removeConsecutivePairsTwo(cardResiue); removeConsecutivePairsTwo(cardResiue);
} }
//最后保留坎张 // 最后保留坎张
//如果坎张,为空则取边张 // 如果坎张,为空则取边张
if (cardResiue.size()!=0) { if (cardResiue.size() != 0) {
List<Integer> tmp3 = new ArrayList<>(); List<Integer> tmp3 = new ArrayList<>();
tmp3.addAll(cardResiue); tmp3.addAll(cardResiue);
removeConsecutivePairs2(cardResiue); removeConsecutivePairs2(cardResiue);
if (cardResiue.size() == 0) { if (cardResiue.size() == 0) {
//取边站 // 取边站
cardResiue = qubianzhang(tmp3); cardResiue = qubianzhang(tmp3);
} }
} }
@ -185,7 +223,8 @@ public class ChangshaWinSplitCard {
map.put("cardResiue", cardResiue); map.put("cardResiue", cardResiue);
} }
for (int i = 0; i < cardResiue.size() - 1; i++) { for (int i = 0; i < cardResiue.size() - 1; i++) {
if (cardResiue.get(i).equals(cardResiue.get(i + 1)) && (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5 || cardResiue.get(i) % 100 == 8)) { if (cardResiue.get(i).equals(cardResiue.get(i + 1))
&& (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5 || cardResiue.get(i) % 100 == 8)) {
cardResiue.remove(i); cardResiue.remove(i);
cardResiue.remove(i); cardResiue.remove(i);
if (remainingMelds >= 2) { if (remainingMelds >= 2) {
@ -196,14 +235,20 @@ public class ChangshaWinSplitCard {
} }
if (Integer.parseInt(map.get("remainingMelds").toString()) >= remainingMelds && cardResiue.size() > 0) { if (Integer.parseInt(map.get("remainingMelds").toString()) >= remainingMelds && cardResiue.size() > 0) {
// 如果没有258做将则需要进入这里判断 // 如果没有258做将则需要进入这里判断
if (remainingMelds == 1 && cardResiue.size() == 2) { if (remainingMelds == 1 && cardResiue.size() == 2) {
for (int i = 0; i < cardResiue.size(); i++) { for (int i = 0; i < cardResiue.size(); i++) {
int diff = Math.abs(cardResiue.get(0) - cardResiue.get(1)); int diff = Math.abs(cardResiue.get(0) - cardResiue.get(1));
if (diff>1) { if (diff > 1) {
map.put("remainingMelds", remainingMelds + 1);// 删除符合258做将的牌if (cardResiue.size() > 1) {cardResiue.remove(i);}map.put("cardResiue", cardResiue); map.put("remainingMelds", remainingMelds + 1);// 删除符合258做将的牌
if (cardResiue.size() > 1) {
cardResiue.remove(i);
}
map.put("cardResiue", cardResiue);
}else { } else {
if (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5 || cardResiue.get(i) % 100 == 8) { if (cardResiue.get(i) % 100 == 2 || cardResiue.get(i) % 100 == 5
|| cardResiue.get(i) % 100 == 8) {
// 删除符合258做将的牌 // 删除符合258做将的牌
if (cardResiue.size() > 1) { if (cardResiue.size() > 1) {
cardResiue.remove(i); cardResiue.remove(i);
@ -219,7 +264,7 @@ public class ChangshaWinSplitCard {
} }
} }
} else if (remainingMelds == 1) { } else {
map.put("remainingMelds", remainingMelds); map.put("remainingMelds", remainingMelds);
map.put("cardResiue", cardResiue); map.put("cardResiue", cardResiue);
} }
@ -256,7 +301,6 @@ public class ChangshaWinSplitCard {
cards.addAll(result); cards.addAll(result);
} }
// 辅助方法 // 辅助方法
public static void removeConsecutivePairs1(List<Integer> cards) { public static void removeConsecutivePairs1(List<Integer> cards) {
if (cards == null || cards.size() < 2) { if (cards == null || cards.size() < 2) {
@ -289,7 +333,7 @@ public class ChangshaWinSplitCard {
public static List<Integer> qubianzhang(List<Integer> cards) { public static List<Integer> qubianzhang(List<Integer> cards) {
List<Integer> result = new ArrayList<>(); List<Integer> result = new ArrayList<>();
for (int i = 0; i < cards.size(); i++) { for (int i = 0; i < cards.size(); i++) {
if (cards.get(i)%100 == 1||cards.get(i)%100 == 9) { if (cards.get(i) % 100 == 1 || cards.get(i) % 100 == 9) {
result.add(cards.get(i)); result.add(cards.get(i));
} }
} }
@ -315,7 +359,7 @@ public class ChangshaWinSplitCard {
if (!toRemove[j]) { // 如果这张牌还没被标记删除 if (!toRemove[j]) { // 如果这张牌还没被标记删除
int diff = sorted.get(j) - sorted.get(i); int diff = sorted.get(j) - sorted.get(i);
if (diff == 2 && sorted.size()>2) { if (diff == 2 && sorted.size() > 2) {
// 找到隔张,标记删除 // 找到隔张,标记删除
toRemove[i] = true; toRemove[i] = true;
toRemove[j] = true; toRemove[j] = true;
@ -351,12 +395,49 @@ public class ChangshaWinSplitCard {
cards.addAll(result); cards.addAll(result);
} }
public static void haveBetween(List<Integer> cards, List<Integer> cardInHand) {
if (cards.size() <= 1 || cardInHand.size() <= 1) {
return;
}
// 创建要删除的牌列表
Set<Integer> toRemove = new HashSet<>();
// 遍历手牌中的每一张牌
for (int handCard : cardInHand) {
// 检查cards中是否有与手牌形成靠章的牌
for (int card : cards) {
// 定义靠章规则:相同、相邻或隔一张
int diff = Math.abs(card - handCard);
if (diff == 1 || diff == 2) {
toRemove.add(card);
}
}
}
// 只有当cards中还有多于1张牌时才执行删除
if (cards.size() - toRemove.size() > 0) {
cards.removeAll(toRemove);
}
// 可选:打印信息
if (!toRemove.isEmpty()) {
System.out.println("删除的牌: " + toRemove);
System.out.println("cards剩余: " + cards);
}
}
// 从二维数组counts还原到手牌列表 // 从二维数组counts还原到手牌列表
private static List<Integer> convertCountToCards(int[][] counts) { private static List<Integer> convertCountToCards(int[][] counts) {
List<Integer> cardInHand = new ArrayList<>(); List<Integer> cardInHand = new ArrayList<>();
// counts数组结构[类型索引][牌值]
// 类型索引: 0=万, 1=筒, 2=条, 3=风, 4=箭 (根据您的编码规则)
// 牌值: 1-9表示牌面值
for (int suitIdx = 0; suitIdx < counts.length; suitIdx++) { for (int suitIdx = 0; suitIdx < counts.length; suitIdx++) {
int suit = suitIdx + 1; int suit = suitIdx + 1; // 还原百位数 (1,2,3,4,5)
for (int value = 1; value < counts[suitIdx].length; value++) { for (int value = 1; value < counts[suitIdx].length; value++) {
int count = counts[suitIdx][value]; int count = counts[suitIdx][value];
@ -371,6 +452,16 @@ public class ChangshaWinSplitCard {
return cardInHand; return cardInHand;
} }
public static int ckeckOutCard(List<Integer> cardInhand) {
int card = 0;
Collections.sort(cardInhand);
System.out.println("手牌:" + cardInhand);
Map<String, Object> map = new HashMap<String, Object>();
checkNormalHu(cardInhand, map);
return card;
}
public static List<Integer> checktingpai(List<Integer> cardhand) { public static List<Integer> checktingpai(List<Integer> cardhand) {
List<Integer> tpcards = new ArrayList<>(); List<Integer> tpcards = new ArrayList<>();
List<Integer> tmphc = cardhand; List<Integer> tmphc = cardhand;
@ -399,22 +490,21 @@ public class ChangshaWinSplitCard {
return tpcards; return tpcards;
} }
public static boolean isJiangPai(int card) {
public static boolean isJiangPai(int card){ if (card % 100 == 2 || card % 100 == 5 || card % 100 == 8) {
if (card%100==2||card%100==5||card%100==8){
return true; return true;
} }
return false; return false;
} }
public static int checkduijiang(List<Integer> cardInHand,Map<String,List<Integer>> map) { public static int checkduijiang(List<Integer> cardInHand, Map<String, List<Integer>> map) {
Map<Integer, Integer> countMap = new HashMap<>(); Map<Integer, Integer> countMap = new HashMap<>();
for (Integer item : cardInHand) { for (Integer item : cardInHand) {
countMap.put(item, countMap.getOrDefault(item, 0) + 1); countMap.put(item, countMap.getOrDefault(item, 0) + 1);
} }
int jiangnum = 0; int jiangnum = 0;
for (int key : countMap.keySet()) { for (int key : countMap.keySet()) {
if (isJiangPai(key)&&countMap.get(key)>=2){ if (isJiangPai(key) && countMap.get(key) >= 2) {
jiangnum++; jiangnum++;
List<Integer> tmpI = new ArrayList<>(); List<Integer> tmpI = new ArrayList<>();
tmpI.add(key); tmpI.add(key);
@ -427,48 +517,43 @@ public class ChangshaWinSplitCard {
// 分析最优出牌 // 分析最优出牌
public static List<Integer> analyzeBestDiscard(List<Integer> cardInHand) { public static List<Integer> analyzeBestDiscard(List<Integer> cardInHand) {
//听牌 // 听牌
//返回要打的牌,打后可以听牌 // 返回要打的牌,打后可以听牌
List<Integer> checktingpai = checktingpai(cardInHand); List<Integer> checktingpai = checktingpai(cardInHand);
System.out.println("打出这种牌后可以听牌 " + checktingpai); System.out.println("打出这种牌后可以听牌 " + checktingpai);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
Map<String, List<Integer>> jmap = new HashMap<>();//对将map Map<String, List<Integer>> jmap = new HashMap<>();// 对将map
//先定将,再做分析 // 先定将,再做分析
/* int jiangnum = checkduijiang(cardInHand,jmap); /*
System.out.println(jmap.get("jiangcard").get(0)); * int jiangnum = checkduijiang(cardInHand,jmap);
if (jiangnum==1){ * System.out.println(jmap.get("jiangcard").get(0)); if (jiangnum==1){ //如果只有一对将
//如果只有一对将 * //去将 后判断方案 List<Integer> tmphc = new ArrayList<>(); tmphc.addAll(cardInHand);
//去将 后判断方案 * Util.removeCard(tmphc,jmap.get("jiangcard").get(0),2); Map<String, Object>
List<Integer> tmphc = new ArrayList<>(); * tmap = new HashMap<>(); checkNormalHu(tmphc, tmap);
tmphc.addAll(cardInHand); *
Util.removeCard(tmphc,jmap.get("jiangcard").get(0),2); * //不去将 判断
Map<String, Object> tmap = new HashMap<>(); *
checkNormalHu(tmphc, tmap); * Map<String, Object> tmap2 = new HashMap<>(); System.out.println(cardInHand);
* checkNormalHu(cardInHand, tmap2); System.out.println(tmap2);
//不去将 判断 *
*
Map<String, Object> tmap2 = new HashMap<>(); *
System.out.println(cardInHand); *
checkNormalHu(cardInHand, tmap2); *
System.out.println(tmap2); * }else if(jiangnum>1){
*
* }else{
*
* }
*/
}else if(jiangnum>1){
}else{
}*/
checkNormalHu(cardInHand, map); checkNormalHu(cardInHand, map);
List<Integer> suggested = (List<Integer>) map.get("cardResiue"); List<Integer> suggested = (List<Integer>) map.get("cardResiue");
//返回要打的牌,打后可以听牌 // 返回要打的牌,打后可以听牌
List<Integer> zuizhongchupai = new ArrayList<>(); List<Integer> zuizhongchupai = new ArrayList<>();
//如果打出然后可以听牌,跟递归判断出来的牌一样,优先打出这张 // 如果打出然后可以听牌,跟递归判断出来的牌一样,优先打出这张
if (checktingpai.size() > 0) { if (checktingpai.size() > 0) {
for (Integer integer : checktingpai) { for (Integer integer : checktingpai) {
for (Integer integer1 : suggested) { for (Integer integer1 : suggested) {
@ -479,19 +564,17 @@ public class ChangshaWinSplitCard {
} }
} }
// 推荐打几个牌都能听牌,需要判断打哪个听的牌更多
//推荐打几个牌都能听牌,需要判断打哪个听的牌更多
if (checktingpai.size() > 1 && zuizhongchupai.size() == 0) { if (checktingpai.size() > 1 && zuizhongchupai.size() == 0) {
zuizhongchupai.addAll(checktingpai); zuizhongchupai.addAll(checktingpai);
} }
// 如果判断听牌和递归出来的牌不一样 优先以听牌为准
//如果判断听牌和递归出来的牌不一样 优先以听牌为准
if (zuizhongchupai.size() == 0) { if (zuizhongchupai.size() == 0) {
zuizhongchupai.addAll(checktingpai); zuizhongchupai.addAll(checktingpai);
} }
//如果判断最后打出牌还未听牌,就用递归判断的牌 // 如果判断最后打出牌还未听牌,就用递归判断的牌
if (zuizhongchupai.size() == 0) { if (zuizhongchupai.size() == 0) {
zuizhongchupai.addAll(suggested); zuizhongchupai.addAll(suggested);
} }
@ -628,10 +711,14 @@ public class ChangshaWinSplitCard {
// 牌的优先级(数字越小优先级越高) // 牌的优先级(数字越小优先级越高)
private static int getCardPriority(int value) { private static int getCardPriority(int value) {
if (value == 9) return 1; if (value == 9)
if (value == 1) return 2; return 1;
if (value == 2 || value == 8) return 3; // 靠近边张 if (value == 1)
if (value >= 3 && value <= 7) return 4; // 中间牌 return 2;
if (value == 2 || value == 8)
return 3; // 靠近边张
if (value >= 3 && value <= 7)
return 4; // 中间牌
return 5; // 其他 return 5; // 其他
} }
@ -712,7 +799,6 @@ public class ChangshaWinSplitCard {
} }
} }
// 都没有,返回第一张 // 都没有,返回第一张
return cards.get(0); return cards.get(0);
} }
@ -734,7 +820,6 @@ public class ChangshaWinSplitCard {
// test1.add(101); // test1.add(101);
// test1.add(101); // test1.add(101);
// test1.add(208); // test1.add(208);
// test1.add(207); // test1.add(207);
// test1.add(205); // test1.add(205);
@ -747,8 +832,6 @@ public class ChangshaWinSplitCard {
// test1.add(106); // test1.add(106);
// test1.add(205); // test1.add(205);
// test1.add(205); // test1.add(205);
// test1.add(203); // test1.add(203);
// test1.add(202); // test1.add(202);
@ -758,7 +841,6 @@ public class ChangshaWinSplitCard {
// test1.add(106); // test1.add(106);
// test1.add(105); // test1.add(105);
// test1.add(201); // test1.add(201);
// test1.add(107); // test1.add(107);
// test1.add(107); // test1.add(107);
@ -779,37 +861,37 @@ public class ChangshaWinSplitCard {
// test1.add(209); // test1.add(209);
// test1.add(209); // test1.add(209);
// //
// //
test1.add(206);
test1.add(205);
test1.add(204);
test1.add(203);
test1.add(202);
test1.add(209); test1.add(209);
test1.add(201); test1.add(208);
test1.add(108); test1.add(208);
test1.add(207);
test1.add(205);
test1.add(107); test1.add(107);
test1.add(106); test1.add(107);
test1.add(105);
test1.add(104); test1.add(104);
test1.add(103);
test1.add(103);
test1.add(103); test1.add(103);
test1.add(102); test1.add(102);
test1.add(101); test1.add(104);
// test1.add(103); // test1.add(103);
// test1.add(102); // test1.add(102);
System.out.println("手牌:" + test1); System.out.println("手牌:" + test1);
List<Integer> bestDiscard = analyzeBestDiscard(test1); List<Integer> bestDiscard = analyzeBestDiscard(test1);
// Integer integer = selectBestCardByPriority(bestDiscard); // Integer integer = selectBestCardByPriority(bestDiscard);
Integer integer1 = selectBestCardRemove258(bestDiscard); Integer integer1 = selectBestCardRemove258(bestDiscard);
System.out.println("ww" +integer1); Map<String, Object> mapSS = new HashMap<>();
checkNormalHu(test1, mapSS);
System.out.println("map:" + mapSS);
System.out.println("ww" + integer1);
// if (!bestDiscard.isEmpty()) { // if (!bestDiscard.isEmpty()) {
// System.out.println("建议出牌:" + bestDiscard.get(0)); // System.out.println("建议出牌:" + bestDiscard.get(0));
// } else { // } else {

View File

@ -37,23 +37,28 @@ public class Paixing {
List<Integer> opCards = new java.util.ArrayList<>(); List<Integer> opCards = new java.util.ArrayList<>();
//opCards.add(new OpCard(RuleWeight.TYPE_PONG, 109)); //opCards.add(new OpCard(RuleWeight.TYPE_PONG, 109));
//opCards.add(new OpCard(RuleWeight.TYPE_PONG, 209)); //opCards.add(new OpCard(RuleWeight.TYPE_PONG, 209));
cardInhand.add(207); cardInhand.add(206);
cardInhand.add(207); cardInhand.add(206);
cardInhand.add(202); cardInhand.add(206);
cardInhand.add(202); cardInhand.add(205);
cardInhand.add(202); cardInhand.add(101);
cardInhand.add(109); //cardInhand.add(204);
cardInhand.add(109); cardInhand.add(107);
cardInhand.add(109); cardInhand.add(107);
cardInhand.add(104); cardInhand.add(104);
cardInhand.add(104); cardInhand.add(104);
cardInhand.add(102); cardInhand.add(101);
cardInhand.add(102); cardInhand.add(101);
cardInhand.add(102); cardInhand.add(101);
//System.out.println(tingKongCheck( opCards,cardInhand,109,false)); List<Integer> chi = new ArrayList<>();
List<Integer> peng = new ArrayList<>();
List<Integer> gang = new ArrayList<>();
System.out.println(tingCheck( cardInhand,chi,peng,gang));
} }
private final static boolean quanqiuren(List<Integer> opCards,List<Integer> cardInhand, int drawCard) { private final static boolean quanqiuren(List<Integer> opCards,List<Integer> cardInhand, int drawCard) {

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="game_mj_changsha" />
</profile>
</annotationProcessing>
</component>
</project>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<gameSetting> <gameSetting>
<host>192.168.14.1</host> <host>192.168.0.18</host>
<intranet>192.168.14.1</intranet> <intranet>192.168.0.18</intranet>
<port>8842</port> <port>6311</port>
<serverId>8841</serverId> <serverId>8840</serverId>
<gameId>10</gameId> <gameId>10</gameId>
<loggerDebug>true</loggerDebug> <loggerDebug>true</loggerDebug>
</gameSetting> </gameSetting>

View File

@ -38,13 +38,13 @@
</poolConfig> </poolConfig>
<infos> <infos>
<info name="group1_db0" host="47.112.97.12" password="cssq@2020" port="6379" database="0" timeout="5000"/> <info name="group1_db0" host="8.138.242.190" password="cssq@2020" port="6379" database="0" timeout="5000"/>
<info name="group1_db1" host="47.112.97.12" password="cssq@2020" port="6379" database="1" timeout="5000"/> <info name="group1_db1" host="8.138.242.190" password="cssq@2020" port="6379" database="1" timeout="5000"/>
<info name="group1_db5" host="47.112.97.12" password="cssq@2020" port="6379" database="5" timeout="5000"/> <info name="group1_db5" host="8.138.242.190" password="cssq@2020" port="6379" database="5" timeout="5000"/>
<info name="group1_db8" host="47.112.97.12" password="cssq@2020" port="6379" database="8" timeout="5000"/> <info name="group1_db8" host="8.138.242.190" password="cssq@2020" port="6379" database="8" timeout="5000"/>
<info name="group1_db9" host="47.112.97.12" password="cssq@2020" port="6379" database="9" timeout="5000"/> <info name="group1_db9" host="8.138.242.190" password="cssq@2020" port="6379" database="9" timeout="5000"/>
<info name="group1_db10" host="47.112.97.12" password="cssq@2020" port="6379" database="10" timeout="5000"/> <info name="group1_db10" host="8.138.242.190" password="cssq@2020" port="6379" database="10" timeout="5000"/>
<info name="group1_db11" host="47.112.97.12" password="cssq@2020" port="6379" database="11" timeout="5000"/> <info name="group1_db11" host="8.138.242.190" password="cssq@2020" port="6379" database="11" timeout="5000"/>
</infos> </infos>
</plugin> </plugin>
</serivce-core> </serivce-core>

View File

@ -28,7 +28,7 @@
<!-- Bind socket addresses --> <!-- Bind socket addresses -->
<socketAddresses> <socketAddresses>
<socket address="0.0.0.0" port="8842" type="TCP" /> <socket address="0.0.0.0" port="6311" type="TCP" />
</socketAddresses> </socketAddresses>
<!-- Ip addresses filter--> <!-- Ip addresses filter-->

View File

@ -20,15 +20,15 @@ public class RoomCard {
public void init() { public void init() {
this.cardList.clear(); this.cardList.clear();
this.subCardList.clear(); this.subCardList.clear();
this.initCard(); //this.initCard();
this.shuffle(); //this.shuffle();
//this.initCard2(); this.initCard2();
} }
private void initCard2() { private void initCard2() {
List list = Arrays.asList(109, 109, 109, 207, 207, 207, 105, 106, 107, 202, 202, 203, 204); List list = Arrays.asList(207, 208, 207, 207, 207, 107, 107, 107, 104, 104, 202, 203, 204,202);
List list2 = Arrays.asList(209, 209, 209, 206, 206, 203, 203, 208, 208, 208, 202, 202, 202); List list2 = Arrays.asList(103, 103, 103, 104, 107, 107, 202, 107, 206, 206, 202, 202, 202);
List list3 = Arrays.asList(208, 201, 202, 103, 107, 107, 205, 208, 209, 207, 109, 203, 208, 104, 210, 106, 104, 107, 202, 105, 206, 206, 109, 202, 209, 210, 104, 206, 107, 101, 108, 210, 203, 101, 102, 106, 209); List list3 = Arrays.asList(207, 207, 104, 103, 107, 107, 205, 208, 209, 207, 109, 203, 208, 104, 210, 106, 104, 107, 202, 105, 206, 206, 109, 104, 209, 210, 104, 206, 107, 101, 108, 104, 203, 101, 104, 106, 209);
this.cardList.addAll(list); this.cardList.addAll(list);
this.cardList.addAll(list2); this.cardList.addAll(list2);
@ -150,7 +150,7 @@ public class RoomCard {
// 发牌 // 发牌
public List<Integer> deal(EXPlayer owner, int num) { public List<Integer> deal(EXPlayer owner, int num) {
List<Integer> dealCards = new ArrayList<>(); List<Integer> dealCards = new ArrayList<>();
shuffle(); // shuffle();
for (int index = 0; index < num ; index++) { for (int index = 0; index < num ; index++) {
double rand = Math.random() % 100 * 100; double rand = Math.random() % 100 * 100;

View File

@ -41,7 +41,7 @@ public class RuleOtherWin implements IRuleBase {
HashMap<Integer, WinCardType> map = new HashMap<Integer, WinCardType>(); HashMap<Integer, WinCardType> map = new HashMap<Integer, WinCardType>();
if (ok != null) { if (ok != null) {
for (int card : ok.drawList) { for (int card : ok.drawList) {
if (Paixing.checkWin(map, player.opCardList, player.cardInhand, card,!no_jiang, room.difen_score)) { if (Paixing.checkWin(map, player.opCardList, player.cardInhand, card,true, room.difen_score)) {
Paixing.putWinCardType(map, WinCardType.GANGSHANGPAO, 1,WinCardType.WIN_TYPE_SCORE); Paixing.putWinCardType(map, WinCardType.GANGSHANGPAO, 1,WinCardType.WIN_TYPE_SCORE);
map.remove(WinCardType.XIAOHU); map.remove(WinCardType.XIAOHU);
result = true; result = true;

View File

@ -38,7 +38,8 @@ public class RuleSelfWin implements IRuleBase {
HashMap<Integer, WinCardType> map = new HashMap<Integer, WinCardType>(); HashMap<Integer, WinCardType> map = new HashMap<Integer, WinCardType>();
if (ok != null) { if (ok != null) {
for (int card : ok.drawList) { for (int card : ok.drawList) {
if (Paixing.checkWin(map, player.opCardList, player.cardInhand, card,!no_jiang, room.difen_score)) { //jefe 杠上开花
if (Paixing.checkWin(map, player.opCardList, player.cardInhand, card,true, room.difen_score)) {
Paixing.putWinCardType(map, WinCardType.GANGSHANGHUA, 1,WinCardType.WIN_TYPE_SCORE); Paixing.putWinCardType(map, WinCardType.GANGSHANGHUA, 1,WinCardType.WIN_TYPE_SCORE);
map.remove(WinCardType.XIAOHU); map.remove(WinCardType.XIAOHU);
result = true; result = true;

View File

@ -406,6 +406,9 @@ public class Paixing {
} else { } else {
WinCard win = new WinCard(cardInhand, drawCard); WinCard win = new WinCard(cardInhand, drawCard);
win.jiang = jiang; win.jiang = jiang;
System.out.println("jiang"+jiang);
if (win.tryWin()) { if (win.tryWin()) {
putWinCardType(map, WinCardType.XIAOHU, 1, difen); putWinCardType(map, WinCardType.XIAOHU, 1, difen);
return true; return true;

View File

@ -7,10 +7,10 @@ import java.util.stream.Collectors;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
//// TPServer.me().start(); TPServer.me().start();
// // 统计每张牌出现的次数 // // 统计每张牌出现的次数
// //
List<Integer> handCards = new ArrayList<>(); /* List<Integer> handCards = new ArrayList<>();
List<Integer> resultList = new ArrayList<>(); List<Integer> resultList = new ArrayList<>();
handCards.add(103); handCards.add(103);
handCards.add(103); handCards.add(103);
@ -161,7 +161,7 @@ public class Main {
// return String.valueOf(maxCard); // return String.valueOf(maxCard);
} }
*/
} }

View File

@ -1,5 +1,3 @@
#Generated by Maven
#Sat Dec 20 22:45:11 CST 2025
version=1.0.0
groupId=com.game
artifactId=game_mj_changsha artifactId=game_mj_changsha
groupId=com.game
version=1.0.0

View File

@ -1,64 +1,64 @@
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfOpenKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleHaidi.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\PlayerRuleManager.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleQSWin.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherOpenKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongOpenKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\Paixing.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\WinCardType.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleChow.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerQSWinTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherWinState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePongOpenKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\SettleLog.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfWin.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerKongWinState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePongKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerQSWinTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXMainServer.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXPlayBack.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\RoomCard.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomStartGameState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXScore.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\Tip.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\QSLog.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDisCardTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXGameController.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRChowState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleZTWin.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDrawState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomStartGameState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\CardNiao.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerTianTingTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherWinState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\SettleLog.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\OpenKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDiscardState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerHaidiTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerKongWinState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePongKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherOpenKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXPlayer.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\Config.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfOpenKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfOpenKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerTianTingTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherWin.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\TipManager.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\CardNiao.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\OpCard.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\OpenKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDiscardState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerWaitKongWinState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherWin.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleHaidi.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfWin.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\Paixing.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfWinState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomSetpState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\PlayerRuleManager.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\RuleWeight.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\WinCard.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerZTWinTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleZTWin.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\Action.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleQSWin.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongOpenKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RulePongOpenKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDrawTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleSelfOpenKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDisCardTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomSetpState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRChowState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\CardUtil.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerOpenKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerZTWinTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDrawState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerOpenKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXRoom.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\QSLog.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXPlayer.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongKongState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherOpenKong.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\RoomCard.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerPiaoNiaoTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXRoom.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\WinCard.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXActionEvent.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfWinState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherOpenKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomDealState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXScore.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXPlayBack.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleOtherKong.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerWaitState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerPiaoNiaoTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerHaidiTipState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerWaitState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRPongKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\RuleWeight.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXActionEvent.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\room\state\EXRoomDealState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\uitl\CardUtil.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\IRuleBase.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXMainServer.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\Config.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\IRuleBase.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\WinCardType.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rule\RuleChow.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\Action.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PRSelfKongState.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerDrawTipState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\TipManager.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\state\EXPlayerWaitKongWinState.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\tip\Tip.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\EXGameController.java
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\OpCard.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\main\java\extend\mj\player\rulestate\PROtherKongState.java

View File

@ -1 +1 @@
D:\aga\ceshi\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\test\java\game_mj_changsha\Main.java D:\robotpro\robot_ceshi\xtserver_anchou\majiang\changsha\game_mj_cs\src\test\java\game_mj_changsha\Main.java