|
|
@@ -0,0 +1,123 @@
|
|
|
+package org.dromara.business.utils;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.databind.JsonNode;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class PokerCardParserUtils {
|
|
|
+
|
|
|
+ // 枚举映射:Suit 和 Rank
|
|
|
+ //CLUBS: 梅花(♣)
|
|
|
+ //DIAMONDS: 方块(♦)
|
|
|
+ //HEARTS: 红桃(♥)
|
|
|
+ //SPADES: 黑桃(♠)
|
|
|
+ public enum Suit {
|
|
|
+ CLUBS, DIAMONDS, HEARTS, SPADES
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum Rank {
|
|
|
+ TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
|
|
|
+ }
|
|
|
+
|
|
|
+ // 用于将 Rank 枚举转为字符串表示(2~A)
|
|
|
+ private static final String[] RANK_SYMBOLS = {
|
|
|
+ "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"
|
|
|
+ };
|
|
|
+
|
|
|
+ // 用于将 Suit 枚举转为符号表示(♣♦♥♠)
|
|
|
+ private static final char[] SUIT_SYMBOLS = { '♣', '♦', '♥', '♠' };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析 boardCards 字符串,返回标准扑克牌表示的列表
|
|
|
+ * @param boardCards 格式如 "111,33,110,00"
|
|
|
+ * @return 牌的字符串列表,如 ["K♦", "5♠", "Q♦", "2♣"]
|
|
|
+ */
|
|
|
+ public static List<String> parseBoardCards(String boardCards) {
|
|
|
+ List<String> result = new ArrayList<>();
|
|
|
+ String[] parts = boardCards.split(",");
|
|
|
+
|
|
|
+ for (String part : parts) {
|
|
|
+ if (part.length() < 2 || !part.matches("\\d+")) {
|
|
|
+ continue; // 忽略非法格式
|
|
|
+ }
|
|
|
+
|
|
|
+ int suitIndex = Character.getNumericValue(part.charAt(0));
|
|
|
+ int rankIndex = Integer.parseInt(part.substring(1));
|
|
|
+
|
|
|
+ if (suitIndex < 0 || suitIndex > 3 || rankIndex < 0 || rankIndex > 12) {
|
|
|
+ continue; // 忽略非法索引
|
|
|
+ }
|
|
|
+
|
|
|
+ String card = RANK_SYMBOLS[rankIndex] + SUIT_SYMBOLS[suitIndex];
|
|
|
+ result.add(card);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析 showdown 节点并打印玩家的手牌
|
|
|
+ *
|
|
|
+ * @param jsonInput 完整的 JSON 字符串
|
|
|
+ */
|
|
|
+ public static void parseShowdown(String jsonInput) throws Exception {
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ JsonNode rootNode = mapper.readTree(jsonInput);
|
|
|
+
|
|
|
+ JsonNode showdownNode = rootNode.path("showdown");
|
|
|
+
|
|
|
+ for (JsonNode playerNode : showdownNode) {
|
|
|
+ int seatId = playerNode.get("seatId").asInt();
|
|
|
+ String holeCards = playerNode.get("holeCards").asText();
|
|
|
+
|
|
|
+ List<String> parsedHoleCards = parseHoleCards(holeCards);
|
|
|
+ System.out.println("Seat ID: " + seatId + ", Hole Cards: " + String.join(", ", parsedHoleCards));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析 holeCards 字符串,返回标准扑克牌表示的列表
|
|
|
+ *
|
|
|
+ * @param holeCards 格式如 "210,211"
|
|
|
+ * @return 牌的字符串列表,如 ["Q♥", "K♥"]
|
|
|
+ */
|
|
|
+ public static List<String> parseHoleCards(String holeCards) {
|
|
|
+ List<String> result = new ArrayList<>();
|
|
|
+ String[] parts = holeCards.split(",");
|
|
|
+
|
|
|
+ for (String part : parts) {
|
|
|
+ if (part.length() != 3 || !part.matches("\\d{3}")) {
|
|
|
+ continue; // 忽略非法格式
|
|
|
+ }
|
|
|
+
|
|
|
+ int suitIndex = Character.getNumericValue(part.charAt(0));
|
|
|
+ int rankIndex = Integer.parseInt(part.substring(1));
|
|
|
+
|
|
|
+ if (suitIndex < 0 || suitIndex > 3 || rankIndex < 0 || rankIndex > 12) {
|
|
|
+ continue; // 忽略非法索引
|
|
|
+ }
|
|
|
+
|
|
|
+ String card = RANK_SYMBOLS[rankIndex] + SUIT_SYMBOLS[suitIndex];
|
|
|
+ result.add(card);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 测试方法
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String boardCards = "19,21,10,210,01";
|
|
|
+ List<String> parsedCards = parseBoardCards(boardCards);
|
|
|
+ System.out.println("解析后的公共牌:");
|
|
|
+ for (String card : parsedCards) {
|
|
|
+ System.out.println(card);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|