算法三:扎金花

 * 说明:棋牌
 * 共有52张普通牌面,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张;每人抓三张牌。两人比较手中三张牌大小,大的为胜。
 * 规则:
 * 1、三张牌一样即为豹子
 * 2、三张牌相连为顺子(A23不是顺子)
 * 3、有且仅有两张牌一样的为对子
 * 豹子>顺子>对子>普通牌型
 * 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104)二人均无特殊牌型时,依次比较三张排中最大的。
 * 大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37k>89Q)如二人牌面相同,则为平局。
 *
 * 输入描述:输入两个字符串代表两个玩家的牌(如:“10KQ”"354")先输入的玩家1,后输入的玩家2
 * 输出描述:1代表玩家1赢;0代表平局;-1代表玩家2赢;-2代表不合法的输入
 * 输入例子:KQ3 3Q9,10QA 6102,5810 7KK
 * 输出例子:1,1,-1

实现代码与思路:

public class Chess {
    /**
     * 方法一:
     * 思路:(1)将牌数字化2-14
     * (2)将牌进行排序
     * (3)规定牌型,4-豹子,3-顺子,2-对子,1-普通
     * (4)比较牌型数值,如果牌型一样,进入(5)
     * (5)比较牌值大小
     */
    private static int compareChecss1(String[] params1,String[] params2){
        int num=-2;
        int num1=ChecssType1(params1);
        int num2=ChecssType1(params2);
//        System.out.println("方式一牌值比较:"+num1+","+num2);
        if(num1==0 || num2==0){ //判断不合法输入
        }else if(num1>num2){
            num= 1;
        }else if(num1<num2){
            num= -1;
        }else if(num1==num2){
            num= compareChecss(params1,params2);
        }
        return num;
    }
    
    private static int compareChecss(String[] params1,String[] params2){
        int num=0;
        List<Integer> lists = listSort(params1);
        List<Integer> lists2 = listSort(params2);
        if(lists==null || lists2==null){   //判断不合法输入
            return num=-2;
        }
//        System.out.println("方式一等值牌型比较:"+lists.toString()+","+lists2.toString());
        for (int i = 0; i < lists.size(); i++) {
            if(lists.get(i)>lists2.get(i)){
                num= 1;
                break;
            }else if(lists.get(i)<lists2.get(i)){
                num= -1;
                break;
            }
        }
        return num;
    }
    /**
     * 方式二:
     * (1)将牌进行数字化,2-14,
     * (2)排序
     * (3)规定:
     * ①普通牌型不动
     * ②如果是对子,将对子牌值*10倍(保证:普通牌值最大14*3<对子最小牌值2*25)
     * ③如果是顺子,将顺子牌值*100倍(保证:对子最大牌值140*3<顺子最小牌值2*250)
     * ④如果是豹子,将豹子牌值*1000倍(保证:顺子最大牌值1400*3<豹子最小牌值2*2500)
     * (4)比较牌值大小
     */
    private static int compareChecss2(String[] params1,String[] params2){
        int num=-2;
        int num1=ChecssType2(params1);
        int num2=ChecssType2(params2);
//        System.out.println("方式二牌值比较:"+num1+","+num2);
        if(num1==0 || num2==0){ //不合法输入
        }else if(num1>num2){
            num= 1;
        }else if(num1<num2){
            num= -1;
        }else if(num1==num2){
            num= 0;
        }
        return num;
    }
    /**
     * 方式一
     * 判断牌型
     * @param data
     * @return
     */
    private static int ChecssType1(String[] data) {
        List<Integer> lists = new ArrayList<Integer>();
        int type = 1;
        int num=0;
        if (data != null) {
            Set<String> sets = new HashSet<String>(Arrays.asList(data));
            type = sets.size();
            // 判断豹子,对子
            switch (type) {
            case 1:
                type = 4;
                break;
            case 2:
                type = 2;
                break;
            case 3:
                for (String str : sets) {
                    num= checkToNumber(str);
                    if(num==0){//不合法输入
                        return type;
                    }
                    lists.add(checkToNumber(str));
                }
                // 倒叙排列
                Collections.sort(lists);
                Collections.reverse(lists);
                if (lists.get(0) == (lists.get(1) + 1) && (lists.get(2) + 1) == lists.get(1)) {
                    type = 3;
                } else {
                    type = 1;
                }
                break;
            default:
                type = 0;
                break;
            }
        }
        return type;
    }
    
    /**
     * 方式二
     * 判断牌型,并改变牌值
     * @param data
     * @return
     */
    private static int ChecssType2(String[] data) {
        int type = 0;
        if (data != null) {
            List<Integer> list = listSort(data);
            if(list!=null){
                if(list.get(0)==list.get(1) && list.get(2)==list.get(1)){ //豹子
                    type=list.get(0)*2500;
                    type=type+type+type;
                }else if(list.get(0)==(list.get(1)+1) && (list.get(2)+1)==list.get(1)){//顺子
                    type=list.get(0)*250+list.get(1)*250+list.get(2)*250;
                }else if(list.get(0)==list.get(1) || list.get(2)==list.get(1)){ //对于
                    type=list.get(0)*25+list.get(1)*25+list.get(2)*25;
                }else{
                    type=list.get(0)+list.get(1)+list.get(2);
                }
            }
        }
        return type;
    }
    /**
     * 排序
     */
    private static List<Integer> listSort(String[] data){
        List<Integer> lists=new ArrayList<Integer>();
        int num=0;
        if(data==null || data.length<=0){
            return null;
        }else{
            for (String params : data) {
                num= checkToNumber(params);
                if(num==0){    //不合法输入
                    return null;
                }
                lists.add(checkToNumber(params));
            }
//            List<Integer> list=Arrays.asList(data);
            //倒叙排列
            Collections.sort(lists); //顺序排列
            Collections.reverse(lists);//翻转
            return lists;
        }
    }
    /**
     * 将牌进行数字化2-14
     */
    private static int checkToNumber(String params){
        int num=0;
        if(params!=null && params.length()>0){
            params=params.toUpperCase();
            if(params.equals("A") || params.equals("J") || params.equals("Q") || params.equals("K")){
                switch (params.toUpperCase()) {
                case "J":
                    num=11;
                    break;
                case "Q":
                    num=12;
                    break;
                case "K":
                    num=13;
                    break;
                default:
                    num=14;
                    break;
                }
            }else{
                num=Integer.parseInt(params);
                if(num<2 || num>10){//不合法输入
                    num=0;
                }
            }
        }
        return num;
    }
    /**
     * 输出结果
     */
    private static void printResult(int params){
        switch (params) {
        case 1:
            System.out.println("玩家1赢====="+params);
            break;
        case 0:
            System.out.println("平局======="+params);
            break;
        case -1:
            System.out.println("玩家1赢======"+params);
            break;
        default:
            System.out.println("输入不合法======"+params);
            break;
        }
    }
    public static void main(String[] args) {
        String[] data1_1={"K","Q","3"};String[] data2_1={"3","Q","9"};
        String[] data1_2={"10","Q","A"};String[] data2_2={"6","10","2"};
        String[] data1_3={"5","8","10"};String[] data2_3={"7","k","k"};
        String[] data1_4={"6","3","2"};String[] data2_4={"7","4","J"};
//        String[] data1_5={"10","10","2"};String[] data2_5={"K","7","7"};
//        String[] data1_6={"J","K","J"};String[] data2_6={"9","2","6"};
//        String[] data1_7={"6","8","K"};String[] data2_7={"2","7","A"};
        
        System.out.println("=====方式1——打印比较结果1==========");
        printResult(compareChecss1(data1_1,data2_1));
        System.out.println("=====方式2——打印比较结果1==========");
        printResult(compareChecss2(data1_1,data2_1));
        
        System.out.println("=====方式1——打印比较结果2==========");
        printResult(compareChecss1(data1_2,data2_2));
        System.out.println("=====方式2——打印比较结果2==========");
        printResult(compareChecss2(data1_2,data2_2));
        
        System.out.println("=====方式1——打印比较结果3==========");
        printResult(compareChecss1(data1_3,data2_3));
        System.out.println("=====方式2——打印比较结果3==========");
        printResult(compareChecss2(data1_3,data2_3));
        
        System.out.println("=====方式1——打印比较结果4==========");
        printResult(compareChecss1(data1_4,data2_4));
        System.out.println("=====方式2——打印比较结果4==========");
        printResult(compareChecss2(data1_4,data2_4));
    }
    
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值