使用集合的方法实现欢乐斗地主发牌过程的代码详细步骤

        我们知道再学习完数组之后,与之类似又比之精妙的集合出现了。其中附带了许多种方法方便了我们对其中的值和索引进行各种操作,这也方便了我们实现斗地主的过程。

        首先我们要准备一副牌,这副牌由大小王和52张牌组成,那我们首先定义四种花色,红桃♥、黑桃♠、方片♦、梅花♣。再定义由2~A的十三张数字牌。将花色和数字牌搭配起来,再加上两个王就得到了一副完整的扑克牌。

        我们拿到一副牌之后需要进行洗牌,用collections中的shuffle方法即可实现洗牌效果。洗牌之后我们要给三名玩家发牌,并且留三张地主牌。之后我们要根据一定的规则选出地主,我的规则是选择的是持有♥3的玩家当地主。选完地址之后,将那三张牌给这名玩家。

        接着我们给这三名玩家整理牌的顺序,此时会有一个难点。就是说我们的扑克牌是花色+数字 的搭配,那么我们牌肯定不按照花色来排序,所以首先排除掉花色的干扰,可以用subString的方法对字符串行截取,得到后面数字。得到后面的数字后,仍然有一个问题,我们所谓的3,4,5……和J,Q,K,A的大小和编译器所认为的3,4,5……和J,Q,K,A的大小并不是一致的。因此我们不能按照数值的大小来排序,既然如此,那么我们在定义数字的时候默认按照升序的顺序排列。比较他们的下表大小即可得到牌面之间的大小。我用的是数组和集合的方式来存储这有序序列,也可以用Map集合来排列,将key键定义成大小顺序,元素按照key键排序即可得到有序的排列。排序方式为了简单,采用了冒泡排序来依次对玩家的牌排序。

        代码如下,后面让他们斗地主的我觉得太麻烦,不写了。毕竟和我们的集合知识关系不大,本代码主要为了练习集合的使用。

public class BeatLandlord {

    //定义给玩家牌排序的方法。
    public ArrayList<String> sortPokers(ArrayList<String> player, ArrayList<String> another){
        //遍历玩家的扑克牌
        //冒泡排序:
        //模仿冒泡排序的方法,排序

        //先拿出大王小王 否则影响排序
        boolean flag1 = player.remove("bigJoker");
        boolean flag2 = player.remove("minJoker");
        for (int j = 0; j < player.size()-1; j++) {
            for (int k = 0; k < player.size()-1-j; ++k) {
                if (another.indexOf(player.get(k).substring(1)) > another.indexOf(player.get(k + 1).substring(1))) {
                    String temp = player.get(k);
                    player.set(k,player.get(k+1));
                    player.set(k+1,temp);
                }
            }
        }
        if (flag2)player.add("minJoker");
        if (flag1)player.add("bigJoker");
        return player;
    }

    public static void main(String[] args) {
        //准备一桌牌
        //定义三个玩家、
        //给玩家发牌
        //给牌排序投好
        //让他们抢地主

        //准备牌
        String[] color = new String[]{"♥", "♠", "♦", "♣"};
        String[] number = new String[]{"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        ArrayList<String> pokers = new ArrayList<>();

        //先将大小王放入数组
        pokers.add("bigJoker");
        pokers.add("minJoker");

        //将剩下五十二张牌放入poker中
        int count = 0;//记牌器
        for (int i = 0; i < color.length; i++) {
            for (int j = 0; j < number.length; j++) {
                pokers.add(color[i] + number[j]);
            }
        }
        System.out.println(pokers);

        //洗牌,多洗几遍
        Collections.shuffle(pokers);
        Collections.shuffle(pokers);
        Collections.shuffle(pokers);
        Collections.shuffle(pokers);

        //定义三个玩家
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();

        //给三个玩家发牌
        int beauty = 0;//性感荷官在线发牌
        while (beauty < pokers.size() - 3) {
            player1.add(pokers.get(beauty++));
            player2.add(pokers.get(beauty++));
            player3.add(pokers.get(beauty++));
        }

        //发牌结束,剩下地主牌
        List<String> pokerOfLandlord = pokers.subList(beauty - 1, pokers.size() - 1);

        //选地主,红桃3在哪里谁就是地主
        ArrayList<Integer> heart3 = new ArrayList<>();
        heart3.add(player1.indexOf("♥3"));
        heart3.add(player2.indexOf("♥3"));
        heart3.add(player3.indexOf("♥3"));
        int i = 0;
        for (; i < heart3.size(); i++) {
            if (heart3.get(i) >= 0) {
                break;
            }
        }
        switch (i + 1) {
            case 1:
                player1.addAll(pokerOfLandlord);
                break;
            case 2:
                player2.addAll(pokerOfLandlord);
                break;
            case 3:
                player3.addAll(pokerOfLandlord);
                break;
            default:
        }
        System.out.println("玩家" + (i + 1) + "成为地主");
        System.out.println("整理牌之前:");
        System.out.println(player1);
        System.out.println(player2);
        System.out.println(player3);

        //给三个玩家整理牌
        //定义一个集合让他存放number数组的元素,以方便操作
        ArrayList<String> another = new ArrayList<>();
        for (int i1 = 0; i1 < number.length; i1++) {
            another.add(number[i1]);
        }

        //开始整理
        BeatLandlord bl = new BeatLandlord();
        player1 = bl.sortPokers(player1,another);
        player2 = bl.sortPokers(player2,another);
        player3 = bl.sortPokers(player3,another);

        System.out.println("排序后的牌是:");
        System.out.println(player1);
        System.out.println(player2);
        System.out.println(player3);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值