纸牌游戏的牌型分析和出牌策略

本文介绍了如何分析和处理纸牌游戏中四人跑得快的牌型,包括手牌整理、上家出牌牌型分析及出牌策略。通过整理手牌、分析牌型如单张、对子、三张、炸弹、顺子、飞机等,制定出牌策略。代码实现中着重展示了飞机牌型的判断和部分出牌函数,旨在分享处理牌型和出牌思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间遇到这个问题,想了一些,也搜了一些,发现网上也只是零星讲了一些笼统思想,复杂的我也没看懂,便自己去尝试写了一些代码来处理这个问题。还是先说明一下适用场景,只是针对一副牌去掉大小王,规则是常见的四人跑得快游戏规则。大致流程,先分析整理手牌,再分析上家出牌牌型,然后对比自家手牌出牌,显示剩余手牌。只是实现这个精简的且有代表性的步骤。
1、整理手牌
获取一段字符串,整理并记录手牌

HashMap<String, Integer> cmpMap = new HashMap<String, Integer>();
// 存储牌大小的对比库,I代表10,A用14记录,215记录
        cmpMap.put("A", 14);
        cmpMap.put("2", 15);
        cmpMap.put("3", 3);
        cmpMap.put("4", 4);
        cmpMap.put("5", 5);
        cmpMap.put("6", 6);
        cmpMap.put("7", 7);
        cmpMap.put("8", 8);
        cmpMap.put("9", 9);
        cmpMap.put("I", 10);
        cmpMap.put("J", 11);
        cmpMap.put("Q", 12);
        cmpMap.put("K", 13);

再用一个数组int[] myCard = new int[16];// 有效范围myCard[3]~myCard[15]下标对应cmpMap的纸牌大小,该下标对应数组值是手牌的张数。

String temp;
int length = mypoker.length();//mypoker是输入手牌字符串
int weight;// 牌大小临时变量
for (int i = 0; i < length; i++) {
            temp = mypoker.substring(i, i + 1);
            if (cmpMap.containsKey(temp)) {
                weight = cmpMap.get(temp);
                myCard[weight]++;
            } else {
                System.out.println("ERROR");
                return;
            }
        }

接下来是存储手牌单双三炸

    //有效范围3~15,小标对应牌大小,值对应是否存在这样牌型
    //至于为什么要区分开,是为后续出牌策略的妥协
    boolean[] myCardType1 = new boolean[16];//存在一张牌
    boolean[] myCardSingle = new boolean[16];//只是一张牌
    boolean[] myCardType2 = new boolean[16];
    boolean[] myCardDouble = new boolean[16];
    boolean[] myCardType3 = new boolean[16];
    boolean[] myCardTreble = new boolean[16];
    boolean[] myCardType4 = new boolean[16];

        for (int i = 3; i < 16; i++) {
            if (myCard[i] < 0 || myCard[i] > 4) {
                System.out.println("ERROR");
                return;
            }
            switch (myCard[i]) {
            case 4:
                myCardType1[i] = true;
                myCardType2[i] = true;
                myCardType3[i] = true;
                myCardType4[i] = true;
                break;
            case 3:
                myCardType1[i] = true;
                myCardType2[i] = true;
                myCardType3[i] = true;
                myCardTreble[i] = true;
                break;
            case 2:
                myCardType1[i] = true;
                myCardType2[i] = true;
                myCardDouble[i] = true;
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值