BD-13-8.8-集合完成斗地主发牌

三人斗地主  集合完成

     编写一个自动发牌程序,模拟三人斗地主的摸牌场景。首先要给出提示,谁首先开始摸牌,并且摸牌要和现实摸牌一样,三人循环摸牌,最后还要剩余三张底牌,同时给出地主牌,摸到地主牌的玩家拥有三张底牌。三张底牌三人都可以看到。当三张底牌派发给地主后提示玩家摸牌结束 

实现思路:

 (1)首先将一副牌的四种花色和对应的牌面值随机组合放进Set集合,因为Set集合是非重复集合,所以无需考虑重复的问题,另外,因为每个牌面值出现的次数只能是四次,所以,当该牌面值出现了四次以后,将该牌面删除。

​        (2)获取洗牌结束的牌组(用Set集合作为初始化数据集),随机额抽取三张牌,作为底牌,不对玩家展示,并从剩余的牌组中随机选取一个张牌,作为地主牌,对所有人展示但不移动其位置。

​        (3)顺序循环发牌,直到牌组没有牌为止,将底牌展示并发给地主。提示玩家发牌结束。

package org.judy.card;

import java.util.*;


public class CardDemo {


    //定义基本属性

    //1 随机牌的存储
    List<String> cardList = new ArrayList<>();

    private List<String> bottomCards = new ArrayList<>(); //底牌组

    private String LandCrad = null;  //地主牌

    private Random rm = new Random();  //随机数类

    // 定义玩家

    private List<String> playA = new ArrayList<>();  //玩家A

    private List<String> playB = new ArrayList<>(); //玩家B

    private List<String> playC = new ArrayList<>(); //玩家C


    //定义随机牌组的生成方法
    public Set<String> getCardSet() {


        Set<String> cardSet = new HashSet<>();  //随机的Set牌组

        Map<String, Integer> timesCount = new HashMap<>(); //牌面出现的次数

        List<String> cardColors = getColor(); //编写方法完成

        List<String> cardValues = getCardValue();

        while (!cardValues.isEmpty()) {  //牌组开始初始化

            //获取牌面的颜色 (随机)  红桃
            String cardColor = cardColors.get(rm.nextInt(cardColors.size()));

            //获取牌面的值(随机) 

            String cardValue = cardValues.get(rm.nextInt(cardValues.size()));

            String card = cardColor + " " + cardValue; //随机获得一张牌

            if (cardSet.add(card)) {  //如果插入底牌组成功 说明这是第一次插入

                //如果牌面的值不是第一次插入 将牌面的值计数累加

                if (timesCount.containsKey(cardValue)) {

                    timesCount.put(cardValue, timesCount.get(cardValue) + 1);

                    if (4 == timesCount.get(cardValue)) {  //牌面出现4次

                        cardValues.remove(cardValue); //从牌面值list中删除
                    }
                } else {

                    timesCount.put(cardValue, 1);
                }
            }


        }

        //增加大王 小王
        cardSet.add("大王");

        cardSet.add("小王");


        return cardSet;
    }


    //牌面值的方法

    public List<String> getCardValue() {


        List<String> cardValue = new ArrayList<>();

        cardValue.add("A");
        cardValue.add("2");
        cardValue.add("3");
        cardValue.add("4");
        cardValue.add("5");
        cardValue.add("6");
        cardValue.add("7");
        cardValue.add("8");
        cardValue.add("9");
        cardValue.add("10");
        cardValue.add("J");
        cardValue.add("Q");
        cardValue.add("K");

        return cardValue;
    }

    public List<String> getColor() {


        List<String> cardColor = new ArrayList<>();

        cardColor.add("黑桃");
        cardColor.add("红桃");
        cardColor.add("梅花");
        cardColor.add("方片");

        return cardColor;
    }


    //发牌程序

    public void deCard() {

        cardList = new ArrayList<>(getCardSet());
        //获得三张底牌
        while (bottomCards.size() < 3) {

            //从随机牌组中 抽出(删除)一张牌 放到底牌组
            bottomCards.add(cardList.remove(rm.nextInt(cardList.size())));
        }

        // 从剩余牌组中 抽出一张牌作为地主牌
        LandCrad = cardList.get(rm.nextInt(cardList.size()));

        System.err.println("地主牌是" + LandCrad);

        //循环发牌给玩家

        int cardNum = cardList.size();

        System.out.println("发牌开始");

        for (int i = 1; i <= cardNum; i++) {

            if (i % 3 == 0) {

                playC.add(cardList.get(i - 1));
            } else if (i % 3 == 1) {

                playB.add(cardList.get(i - 1));
            } else {

                playA.add(cardList.get(i - 1));

            }
        }
        System.out.println("发牌结束");

        System.out.println("底牌是" + bottomCards);

        if (playA.contains(LandCrad)) {

            System.out.println("地主是玩家A");

            while (!bottomCards.isEmpty()) {

                playA.add(bottomCards.remove(0));
            }
        } else if (playB.contains(LandCrad)) {

            System.out.println("地主是玩家B");

            while (!bottomCards.isEmpty()) {

                playB.add(bottomCards.remove(0));
            }

        } else {
            System.out.println("地主是玩家C");

            while (!bottomCards.isEmpty()) {

                playC.add(bottomCards.remove(0));
            }

        }

    }


    public static void show(List<String> list) {


        System.out.println("【");

        int count = 0;

        while (!(list.size() == 1)) {

            count++;

            System.out.print(list.remove(0) + "、");

            if (count % 6 == 0) {

                System.out.println();
            }
        }

        System.out.println(list.remove(0) + " 】");
    }


    public static void main(String[] args) {

        CardDemo card = new CardDemo();

        card.deCard();  //发牌

        System.out.println("玩家A的手牌是");
        show(card.playA);
        System.out.println("玩家B的手牌是");
        show(card.playB);
        System.out.println("玩家C的手牌是");
        show(card.playC);

    }

}

猜你喜欢

转载自blog.csdn.net/weixin_42474930/article/details/81514502
今日推荐