diff --git a/robots/puke/robot_pk_pdk/src/main/java/robot/mj/Config.java b/robots/puke/robot_pk_pdk/src/main/java/robot/mj/Config.java index c9d007d..23087ce 100644 --- a/robots/puke/robot_pk_pdk/src/main/java/robot/mj/Config.java +++ b/robots/puke/robot_pk_pdk/src/main/java/robot/mj/Config.java @@ -47,9 +47,6 @@ public class Config { public static final String DEFAULT_PID = "66"; /** 默认群组ID */ - public static final String DEFAULT_GROUP_ID = "330800"; + public static final String DEFAULT_GROUP_ID = "762479"; - /** 主要群组ID */ - public static final String MAIN_GROUP_ID = "762479"; - } \ No newline at end of file diff --git a/robots/puke/robot_pk_pdk/src/main/java/robot/mj/EXMainServer.java b/robots/puke/robot_pk_pdk/src/main/java/robot/mj/EXMainServer.java index 935c4d5..8fd73be 100644 --- a/robots/puke/robot_pk_pdk/src/main/java/robot/mj/EXMainServer.java +++ b/robots/puke/robot_pk_pdk/src/main/java/robot/mj/EXMainServer.java @@ -35,7 +35,7 @@ public class EXMainServer extends MainServer{ //startConnectionCheckScheduler(); //测试 Jedis jedis2 = Redis.use("group1_db2").getJedis(); - String robotskey = "g{"+Config.MAIN_GROUP_ID+"}:play:"+ Config.DEFAULT_PID; + String robotskey = "g{"+Config.DEFAULT_GROUP_ID+"}:play:"+ Config.DEFAULT_PID; Map maprobot = jedis2.hgetAll(robotskey); for(Map.Entry entry : maprobot.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); @@ -45,7 +45,7 @@ public class EXMainServer extends MainServer{ robotUser.setPassword(Config.DEFAULT_PASSWORD); robotUser.setGameHost(Config.GAME_SERVER_HOST); robotUser.setGamePort(Config.GAME_SERVER_PORT); - robotUser.setRobotGroupid(Config.MAIN_GROUP_ID); + robotUser.setRobotGroupid(Config.DEFAULT_GROUP_ID); robotUser.setRobotPid(Config.DEFAULT_PID); robotRoomMapping.put(entry.getKey(), robotUser); diff --git a/robots/puke/robot_pk_pdk/src/main/java/taurus/util/test_smart.java b/robots/puke/robot_pk_pdk/src/main/java/taurus/util/test_smart.java index b421661..c4e5fe5 100644 --- a/robots/puke/robot_pk_pdk/src/main/java/taurus/util/test_smart.java +++ b/robots/puke/robot_pk_pdk/src/main/java/taurus/util/test_smart.java @@ -1037,15 +1037,52 @@ public class test_smart { if (!trioWithTwo.isEmpty()) { double value = 0.7 + evaluation.comboPotential * 0.15; double risk = 0.15; + + // 优化:如果三带二能带走小牌,增加额外价值 + CardObj carryCard = findCarryCardInTrioWithTwo(trioWithTwo, handCards); + if (carryCard != null && carryCard.cardMod <= CARD_8) { + value += 0.1; // 带小牌额外加分 + System.out.println("[三带二优化] 携带小牌" + getCardName(carryCard.cardMod) + ",增加出牌价值"); + } + options.add(new PlayOption("三带二", trioWithTwo, value, risk, "中等价值组合")); } // 炸弹 List bomb = findSmallestBomb(handCards); if (!bomb.isEmpty()) { - double value = 0.9; + // 炸弹价值应该极低,除非特殊情况 + double value = 0.3 + evaluation.controlStrength * 0.1; // 大幅降低基础分 double risk = 0.1; - options.add(new PlayOption("炸弹", bomb, value, risk, "最强威慑力")); + + // 首轮出牌时几乎禁止使用炸弹 + if (handCards.size() > 8) { + value *= 0.3; // 手牌多时严重抑制炸弹使用 + System.out.println("[炸弹策略] 首轮手牌较多,严格限制炸弹使用"); + } + + // 只有在特殊情况下才考虑炸弹 + boolean shouldUseBomb = false; + String bombReason = ""; + + // 情况1:手牌很少(≤3张)且需要快速出完 + if (handCards.size() <= 3) { + shouldUseBomb = true; + bombReason = "手牌极少,用于快速结束"; + } + // 情况2:有绝佳的控制机会 + else if (evaluation.controlStrength > 0.8 && handCards.size() <= 6) { + shouldUseBomb = true; + bombReason = "强控制力且手牌较少"; + } + + if (shouldUseBomb) { + System.out.println("[炸弹使用] 特殊情况允许使用炸弹 - 原因:" + bombReason); + options.add(new PlayOption("炸弹", bomb, value, risk, "特殊情况下的强力手段")); + } else { + System.out.println("[炸弹策略] 当前情况不适合使用炸弹,优先考虑其他牌型"); + // 不添加炸弹选项,确保不会被选择 + } } // 对子 @@ -2105,10 +2142,13 @@ public class test_smart { System.out.println("[智能响应] 收到出牌请求 - 报告类型:" + getCardTypeName(type) + ", 最小牌:" + getCardName(minCard) + ", 长度:" + len); // 智能纠错:根据牌数和常见模式推断真实牌型 + System.out.println("[智能响应] 原始报告类型:" + getCardTypeName(type) + ", 牌数:" + len + ", 最小牌:" + getCardName(minCard)); int correctedType = correctCardTypeByPattern(type, len, minCard); if (correctedType != type) { System.out.println("[智能纠错] 检测到类型推断可能有误,原始:" + getCardTypeName(type) + " -> 纠正:" + getCardTypeName(correctedType)); type = correctedType; + } else { + System.out.println("[智能纠错] 类型判断一致,无需纠正"); } // 直接分析实际牌面构成,这才是真正的智能! @@ -2720,6 +2760,27 @@ public class test_smart { .orElse(new ArrayList<>()); } + /** 辅助方法:找出三带二中的携带牌 */ + private static CardObj findCarryCardInTrioWithTwo(List trioWithTwo, List handCards) { + if (trioWithTwo.size() != 5) return null; + + // 统计各牌值的数量 + Map valueCounts = trioWithTwo.stream() + .collect(Collectors.groupingBy(CardObj::getCardMod, Collectors.counting())); + + // 找出数量为1或2的牌值(携带牌) + for (Map.Entry entry : valueCounts.entrySet()) { + if (entry.getValue() == 1 || entry.getValue() == 2) { + return trioWithTwo.stream() + .filter(card -> card.cardMod == entry.getKey()) + .findFirst() + .orElse(null); + } + } + + return null; + } + private static List findSmallestTrioWithTwo(List handCards) { System.out.println("[主动三带二] 寻找最优的三带二组合"); @@ -3329,13 +3390,14 @@ public class test_smart { } } - // 典型错误情况4:5-12张牌优先判断为顺子而非三带二 + // 典型错误情况4:5-12张牌的合理判断 if (len >= 5 && len <= 12) { - // 关键修复:5张顺子经常被错误识别为三带二 - if (reportedType == TYPE_TRIO_WITH_TWO) { - System.out.println("[模式纠错] ⚠️ " + len + "张牌被报告为三带二,更可能是顺子"); - System.out.println("[模式纠错] 建议:将类型从三带二纠正为顺子"); - return TYPE_STRAIGHT; + // 5张牌的特殊处理:需要根据具体内容判断 + if (len == 5 && reportedType == TYPE_TRIO_WITH_TWO) { + // 5张三带二是合理的牌型,不应该盲目纠正为顺子 + System.out.println("[模式纠错] 5张牌报告为三带二是合理的牌型"); + // 不进行纠正,保持原类型 + return reportedType; } // 其他连续牌情况 @@ -3454,7 +3516,7 @@ public class test_smart { if (cardCount == 5) { boolean hasThree = uniqueValues.stream().anyMatch(v -> countMap.get(v) == 3); // 三带二有两种情况:三带一对,或者三带两张单牌 - boolean hasValidCarry = uniqueValues.size() == 3; // 总共3个不同的牌值 + boolean hasValidCarry = uniqueValues.size() == 2 || uniqueValues.size() == 3; // 2种不同牌值(三带对)或3种不同牌值(三带两张单牌) if (hasThree && hasValidCarry) { System.out.println("[牌型分析] 结论: 三带二");