Java基础——斗地主游戏案例

案例:

  • 在启动游戏房间的时候,应该提前准备好54张牌,完成洗牌,发牌,牌排序,逻辑。

分析:

 定义一个牌类:

//定义一个牌类,用于集合存储牌对象
public class Card {
    private String size;//点数
    private String color;//花色
    private int index;//牌的大小--》用于后面对牌进行排序

    public Card() {
    }

    public Card(String size, String color, int index) {
        this.size = size;
        this.color = color;
        this.index = index;
    }


    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    @Override
    public String toString() {
        return size + color;
    }
}

1.定义一个静态的集合存储54张牌对象 :

public static List<Card> allCards = new ArrayList<>();

 2.做牌(将花色与点数组合成一副牌),定义静态代码块初始化数据(类被加载的时候被执行,且优先于各种代码块和构造函数):

    //2.做牌(将花色与点数组合成一副牌),定义静态代码块初始化数据(类被加载的时候被执行,且优先于各种代码块和构造函数)
    static {
        //2.1定义点数,个数确定,类型确定,使用数组
        String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        //2.2定义花色,个数确定,类型确定,使用数组
        String[] colors = {"♠","♣","♥","♦"};
        //2.3组合点数和花色
        int index = 0;//记录牌的大小
        for (String size : sizes) {
            index++;//每遍历一个点数,牌的大小加1
            for (String color : colors) {
                //2.4封装成一个牌对象
                Card c = new Card(size,color,index);
                //2.5存入集合容器
                allCards.add(c);
            }
        }
        //2.6将大小王存进集合对象中
        Card c1 = new Card("","大王",++index);
        Card c2 = new Card("","小王",++index);
        Collections.addAll(allCards,c1,c2);
        System.out.println("新牌:" + allCards);
    }

3.洗牌:

        //3.洗牌,使用public static void shuffle(List<?> List)打乱集合顺序
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);

4.发牌:

        //4.发牌(定义三个玩家,每个玩家的牌也是集合容器)
        List<Card> player01 = new ArrayList<>();
        List<Card> player02 = new ArrayList<>();
        List<Card> player03 = new ArrayList<>();
        //4.1开始发牌(从总牌集合中发出51张牌给三位玩家,剩余三张牌作为地主牌)
        for (int i = 0; i < allCards.size() - 3; i++) {
            //4.1.1先拿到当前牌对象
            Card c = allCards.get(i);
            //4.1.2判断三位玩家怎么拿到相应的牌————》以三个索引为一组,每组的每个索引除3取余都是0,1,2,所以将三位玩家对应索引的余数得到相应的牌
            if (i % 3 == 0){
                //余数为0————》player01
                player01.add(c);
            }else if (i % 3 == 1){
                //余数为1————》player02
                player02.add(c);
            }else if (i % 3 == 2){
                //余数为2————》player03
                player03.add(c);
            }
        }
        //4.1.3地主牌(把最后三张牌截取成一个子集合)
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());

5.给玩家的牌排序:

        //5.给玩家的牌进行排序(从大到小)创建一个方法对各个玩家的牌进行排序
        sortCards(player01);
        sortCards(player02);
        sortCards(player03);


    /**
     * 给玩家的牌进行排序
     * @param cards 各个玩家得到的牌
     */
    private static void sortCards(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o2.getIndex() - o1.getIndex();
            }
        });
    }

6.输出各位玩家的牌和地主牌:

        //6.输出各玩家的牌和地主牌
        System.out.println("player01:" + player01);
        System.out.println("player02:" + player02);
        System.out.println("player03:" + player03);
        System.out.println("地主牌:" + lastThreeCards);

猜你喜欢

转载自blog.csdn.net/weixin_61275790/article/details/130034733
今日推荐