|
@@ -53,24 +53,116 @@ public final class JDGDUtils {
|
|
|
|
|
|
/**
|
|
|
* 比较两组牌的大小(仅在牌型相同时调用)
|
|
|
+ *
|
|
|
* @param previousCards 上一手牌
|
|
|
* @param disCardList 当前玩家出的牌
|
|
|
* @param curLevel 当前级数
|
|
|
+ * @param cardType 牌型
|
|
|
* @return 正数表示当前牌较大,负数表示上一手牌较大,0表示相等
|
|
|
*/
|
|
|
- public static int compareCardStrength(int[] previousCards, int[] disCardList, int curLevel) {
|
|
|
- List<Integer> previousPoints = new ArrayList<>();
|
|
|
- for (int card : previousCards) {
|
|
|
- previousPoints.add(getCardPoint(card, curLevel));
|
|
|
- }
|
|
|
+ public static int compareCardStrength(int[] previousCards, int[] disCardList, int curLevel, CardType cardType) {
|
|
|
+ List<Integer> previousPoints = Arrays.stream(previousCards)
|
|
|
+ .map(card -> getCardPoint(card, curLevel))
|
|
|
+ .sorted()
|
|
|
+ .boxed()
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
|
- List<Integer> currentPoints = new ArrayList<>();
|
|
|
- for (int card : disCardList) {
|
|
|
- currentPoints.add(getCardPoint(card, curLevel));
|
|
|
+ List<Integer> currentPoints = Arrays.stream(disCardList)
|
|
|
+ .map(card -> getCardPoint(card, curLevel))
|
|
|
+ .sorted()
|
|
|
+ .boxed()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ switch (cardType) {
|
|
|
+ case SINGLE:
|
|
|
+ case PAIR:
|
|
|
+ case TRIPLE:
|
|
|
+ case STRAIGHT:
|
|
|
+ // 单张、对子、三不带、顺子直接比较最大点数
|
|
|
+ return Integer.compare(
|
|
|
+ currentPoints.get(currentPoints.size() - 1),
|
|
|
+ previousPoints.get(previousPoints.size() - 1)
|
|
|
+ );
|
|
|
+
|
|
|
+ case TRIPLE_WITH_TWO:
|
|
|
+ // 三带二:优先比较三张部分,再比较两张部分
|
|
|
+ int currentTriple = getMaxFrequencyCard(currentPoints, 3);
|
|
|
+ int previousTriple = getMaxFrequencyCard(previousPoints, 3);
|
|
|
+
|
|
|
+ if (currentTriple != previousTriple) {
|
|
|
+ return Integer.compare(currentTriple, previousTriple);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果三张部分相等,比较附带的两张部分
|
|
|
+ List<Integer> currentPair = currentPoints.stream()
|
|
|
+ .filter(point -> point != currentTriple)
|
|
|
+ .sorted(Comparator.reverseOrder())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<Integer> previousPair = previousPoints.stream()
|
|
|
+ .filter(point -> point != previousTriple)
|
|
|
+ .sorted(Comparator.reverseOrder())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ for (int i = 0; i < currentPair.size(); i++) {
|
|
|
+ int cmp = Integer.compare(currentPair.get(i), previousPair.get(i));
|
|
|
+ if (cmp != 0) {
|
|
|
+ return cmp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ case PAIR_SEQUENCE:
|
|
|
+ case TRIPLE_SEQUENCE:
|
|
|
+ // 连对、三顺:逐一比较点数
|
|
|
+ for (int i = 0; i < currentPoints.size(); i++) {
|
|
|
+ int cmp = Integer.compare(currentPoints.get(i), previousPoints.get(i));
|
|
|
+ if (cmp != 0) {
|
|
|
+ return cmp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ case BOMB:
|
|
|
+ case FOUR_BOMB:
|
|
|
+ case FIVE_BOMB:
|
|
|
+ case SIX_BOMB:
|
|
|
+ case SEVEN_BOMB:
|
|
|
+ case EIGHT_BOMB:
|
|
|
+ case FOUR_KINGS:
|
|
|
+ // 炸弹:按炸弹的牌型权重比较
|
|
|
+ int currentWeight = getCardTypeWeight(determineCardType(disCardList, curLevel));
|
|
|
+ int previousWeight = getCardTypeWeight(determineCardType(previousCards, curLevel));
|
|
|
+
|
|
|
+ if (currentWeight != previousWeight) {
|
|
|
+ return Integer.compare(currentWeight, previousWeight);
|
|
|
+ }
|
|
|
+ // 若权重相等,比较炸弹点数
|
|
|
+ return Integer.compare(
|
|
|
+ currentPoints.get(currentPoints.size() - 1),
|
|
|
+ previousPoints.get(previousPoints.size() - 1)
|
|
|
+ );
|
|
|
+
|
|
|
+ default:
|
|
|
+ // 对于未定义类型的比较,按最大点数处理
|
|
|
+ return Integer.compare(
|
|
|
+ currentPoints.get(currentPoints.size() - 1),
|
|
|
+ previousPoints.get(previousPoints.size() - 1)
|
|
|
+ );
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // 比较最高点
|
|
|
- return currentPoints.get(currentPoints.size() - 1) - previousPoints.get(previousPoints.size() - 1);
|
|
|
+ /**
|
|
|
+ * 获取指定频率的最大点数
|
|
|
+ *
|
|
|
+ * @param points 点数列表
|
|
|
+ * @param frequency 目标频率(如 3 表示三张)
|
|
|
+ * @return 满足频率的最大点数
|
|
|
+ */
|
|
|
+ private static int getMaxFrequencyCard(List<Integer> points, int frequency) {
|
|
|
+ return points.stream()
|
|
|
+ .filter(p -> Collections.frequency(points, p) == frequency)
|
|
|
+ .max(Integer::compareTo)
|
|
|
+ .orElse(0);
|
|
|
}
|
|
|
|
|
|
/**
|