德州扑克——逻辑判断

题目描述

初始有5张牌,每张牌由大小和花色组成,大小由数字2~10、J、Q、K、A,牌的花色有红桃、黑桃、梅花、方块四种。定义6种牌型,判断属于哪种牌型:

  • 牌型1:同花顺,同一个花色的顺子,例,红桃2红桃3红桃4红桃5红桃6;
  • 牌型2:四条,四张相同数字+单张,例,红桃A黑桃A梅花A方块A+黑桃K;
  • 牌型3:葫芦,三张相同数字+一对,例,红桃5黑桃5梅花5+方块9梅花9;
  • 牌型4:同花,同一花色,例,方块3方块7方块10方块J方块Q;
  • 牌型5:顺子,花色不一样的顺子,例,红桃2黑桃3红桃4红桃5方块6;
  • 牌型6:三条,三张相同+两张单。

说明:

  1. 五张牌里不会出现牌大小和花色完全相同的牌;
  2. 编号小的牌型较大,如同花顺比四条大,依此类推;
  3. 包含A的合法的顺子只有10、J、Q、K、A和A、2、3、4、5;类似K、A、2、3、4的序列不认为是顺子。

输入

输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。

输出

输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出。

用例

题目解析

这道题是一道逻辑题,输入了五张牌,然后我们需要对这五张牌进行六种情况的分

析,并且分析有优先级:

  1. 是否为同花顺
  2. 是否为四条
  3. 是否为葫芦
  4. 是否同花
  5. 是否为顺子
  6. 是否为三条

若满足了前面,则后面的就不需要再判断了。另外,同花顺的情况判断,其实就是同花+顺子,因此在写代码时可以再拆下代码。

Java源码

import java.util.*;

public class DezhouCards {
    static HashMap<String, Integer> numCount = new HashMap<>();//统计各个牌的大小的数量
    static HashSet<String> colorSet = new HashSet<>();//统计花色种类的数量
    static ArrayList<Integer> values;//各个牌大小数量的集合

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < 5; i++) {
            System.out.println("请输入数字:");
            String num = sc.next();//数字
            System.out.println("请输入花色:");
            String color = sc.next();//花色

            numCount.put(num, numCount.getOrDefault(num,0) + 1);//统计各个牌大小的数量
            colorSet.add(color);//统计花色种类数量
        }

        values = new ArrayList<>(numCount.values());//各个牌大小数量的集合
        values.sort((a, b) -> b - a);//数量降序

        int ans = 0;//牌型

        if(isFlush() && isStraights()){//同花顺
            ans = 1;
        }else if(isFour()){//四条
            ans = 2;
        }else if(isFullHouse()){//葫芦
            ans = 3;
        }else if(isFlush()){//同花
            ans = 4;
        }else if(isStraights()){//顺子
            ans = 5;
        }else if(isThree()){//三条
            ans = 6;
        }

        System.out.println("牌型为:"+ans);
    }

    public static int mapToNum(String card){//牌大小映射位数值
        switch(card){
            case "J":
                return 11;
            case "Q":
                return 12;
            case "K":
                return 13;
            case "A":
                return 14;
            default:
                return Integer.parseInt(card);
        }
    }

    //同花
    public static boolean isFlush(){
        return colorSet.size() == 1;//所有牌花色一样,同花
    }

    //顺子
    public static boolean isStraights(){
        ArrayList<String> list = new ArrayList<>(numCount.keySet());

        if(list.size() < 5){//顺子牌不低于5张
            return false;
        }

        list.sort((a, b) -> mapToNum(a) - mapToNum(b));//牌大小升序

        StringBuilder sb = new StringBuilder();
        list.forEach(sb :: append);

        //除了2345A顺子外,其余顺子最大牌值 - 最小牌值都为4
        return "2345A".contentEquals(sb) || mapToNum(list.get(list.size() - 1)) - mapToNum(list.get(0)) == 4;
    }

    //四条
    public static boolean isFour(){
        return values.size() == 2 && values.get(0) == 4;//四张相同数字+单张
    }

    //葫芦
    public static boolean isFullHouse(){
        return values.size() == 2 && values.get(0) == 3;//3张相同数字+一对
    }

    //三条
    public static boolean isThree(){
        return values.size() == 3 && values.get(0) == 3;//3张相同数字+2单张
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值