纯暴力解法 -- 按斗地主的方式比较就行

  • 获取输入的两幅牌 - 带有空格的输出形式 和 不带空格的比较形式
String [] str = in.nextLine().split("-"); // 带空格输出形式
String [] str1 = str[0].split(" "); // 去掉空格,两手牌进行比较的形式
String [] str2 = str[1].split(" "); // 去掉空格,两手牌进行比较的形式
  • 扑克牌中存在 J Q K A 2 joker JOKER 这7张牌,不能直接进行比较所以需要先转换一下。此处使用map,将大小存储在value中
private static Map<String, Integer> map = new HashMap<>();
        map.put("3", 3);
        map.put("4", 4);
        map.put("5", 5);
        map.put("6", 6);
        map.put("7", 7);
        map.put("8", 8);
        map.put("9", 9);
        map.put("10", 10);
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
        map.put("A", 14);
        map.put("2", 15);
        map.put("joker", 16);
        map.put("JOKER", 17);
        map.put("joker JOKER", 18);
  • 明确大小比较原则(单个、对子、三个、炸弹、顺子、两王)
  • 最大:两王
  • 同类型牌 : 比较第一张牌,谁大,输出谁
  • 不同类型牌
  • 炸弹 和 其他:输出炸弹
  • 其他 和 其他:ERROR
  • 如何比较 ?
  • 因为最大是两王,所以分为两种情况比较,有 两王的牌 和 其他牌
if (str[0].equals("joker JOKER") || str[1].equals("joker JOKER")) {
                System.out.println("joker JOKER");
            } 
  • 其他牌的比较前提:出的牌在规则内(即属于单个、对子、三个、炸弹、顺子),所以需要判断
  • 对子:两张牌相同;
  • 三个:三张牌相同;
  • 炸弹:四张牌相同;
  • 顺子:五张牌连续,且在 3 ~ A之间的牌
public static boolean samePk(String[] str) {
        int len = str.length;
        for (int i = 0; i < len - 1; i++) {
            if (!str[i].equals(str[i + 1])) {
                return false;  // 不相同,错误出牌-ERROR
            }
        }
        return true;
    }
public static boolean checkSequence(String[] a) {
        if (map.get(a[4]) > 14) {
            return false;
        }
        for (int i = 0; i < 4; i++) {
            if (map.get(a[i + 1]) - map.get(a[i]) != 1) {
                return false; // 不连续,错误出牌-ERROR
            }
        }
        return true;
    }
  • 确定手牌符合规则后,开始进行比较,可以分为2种情况 -- 出牌数量一样(同类型)和 出牌数量不一样(不同类型)
  • 牌数一样,比较首张牌的大小
  • 牌数不一样
  • 有炸弹 - 有 输出炸弹
  • 没有 - 错误出牌方式
public static boolean newCompare(String[] a, String[] b) {
        if (map.get(a[0]) > map.get(b[0])) {
            return true;
        }
        return false;
    }

下面为完整代码

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static Map<String, Integer> map = new HashMap<>();

    public static void main(String[] args) {
        map.put("3", 3);
        map.put("4", 4);
        map.put("5", 5);
        map.put("6", 6);
        map.put("7", 7);
        map.put("8", 8);
        map.put("9", 9);
        map.put("10", 10);
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
        map.put("A", 14);
        map.put("2", 15);
        map.put("joker", 16);
        map.put("JOKER", 17);
        map.put("joker JOKER", 18);

        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            // 划分两付手牌
            String [] str = in.nextLine().split("-");
            String [] str1 = str[0].split(" ");
            String [] str2 = str[1].split(" ");
            // 先判断是否有两王
            if (str[0].equals("joker JOKER") || str[1].equals("joker JOKER")) {
                System.out.println("joker JOKER");
            } else { // 无两王判断长度是否一样
                if (str1.length == str2.length) {
                    if (str1.length == 1) {  // 长度一样,单个牌比较
                        System.out.println(newCompare(str1, str2) ? str[0] : str[1]);
                    } else if (str1.length == 5) { // 长度一样,顺子 - 先比较是否连续
                        System.out.println(checkSequence(str1) &&
                                           checkSequence(str2) ? (newCompare(str1, str2) ? str[0] : str[1]) : "ERROR");
                    } else {  // 其他长度,先判断是否都一样,在比较大小
                        System.out.println(samePk(str1) &&
                                           samePk(str2) ? (newCompare(str1, str2) ? str[0] : str[1]) : "ERROR");
                    }
                } else {
                    // 长度不一样,但是有炸弹
                    if (str1.length == 4) {
                        System.out.println(samePk(str1) ? str[0] : "ERROR");
                    } else if (str2.length == 4) {
                        System.out.println(samePk(str2) ? str[1] : "ERROR");
                    } else {
                        System.out.println( "ERROR");
                    }
                }
            }
        }
    }
    /**
    * 判断打出的两个、三个、炸弹是否符合规则
    */
    public static boolean samePk(String[] str) {
        int len = str.length;
        for (int i = 0; i < len - 1; i++) {
            if (!str[i].equals(str[i + 1])) {
                return false;
            }
        }
        return true;
    }
    
    /**
    * 比较两幅手牌第一张牌的大小
    */
    public static boolean newCompare(String[] a, String[] b) {
        if (map.get(a[0]) > map.get(b[0])) {
            return true;
        }
        return false;
    }

    /**
    * 判断5张牌的情况下是否是顺子
    */
    public static boolean checkSequence(String[] a) {
        if (map.get(a[4]) > 14) {
            return false;
        }
        for (int i = 0; i < 4; i++) {
            if (map.get(a[i + 1]) - map.get(a[i]) != 1) {
                return false;
            }
        }
        return true;
    }
}