纯暴力解法 -- 按斗地主的方式比较就行
- 获取输入的两幅牌 - 带有空格的输出形式 和 不带空格的比较形式
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; } }