当前位置:网站首页>斗地主游戏的案例开发

斗地主游戏的案例开发

2022-07-06 17:20:00 Haziy

斗地主游戏的案例开发


业务需求分析:

斗地主的做牌, 洗牌, 发牌, 排序(拓展知识), 看牌。
业务: 总共有54张牌。
点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2"
花色: "", "", "", ""
大小王: "" , ""
点数分别要组合4种花色,大小王各一张。
斗地主:发出51张牌,剩下3张作为底牌。

功能实现:

1.做牌。
2.洗牌。
3.定义3个玩家
4.发牌。
5.排序(拓展)
6.看牌

代码部分:

牌类及其属性方法:

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;
    }
}

game实现类:

public class GameDemo {
    /**
      1、定义一个静态的集合存储54张牌对象
     */
     public static List<Card> allCards = new ArrayList<>();

    /**
      2、做牌:定义静态代码块初始化牌数据
     */
    static {
        // 3、定义点数:个数确定,类型确定,使用数组
        String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        // 4、定义花色:个数确定,类型确定,使用数组
        String[] colors = {"", "", "", ""};
        // 5、组合点数和花色
        int index = 0; // 记录牌的大小
        for (String size : sizes) {
            index++;
            for (String color : colors) {
                // 6、封装成一个牌对象。
                Card c = new Card(size, color, index);
                // 7、存入到集合容器中去
                allCards.add(c);
            }
        }
        // 8 大小王存入到集合对象中去 "" , ""
        Card c1 = new Card("" ,  "", ++index);
        Card c2 = new Card("" ,  "",++index);
        Collections.addAll(allCards , c1 , c2);
        System.out.println("新牌:" + allCards);
    }

    public static void main(String[] args) {

        // 9.洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后" + allCards);

        // 10.发牌 (定义三个玩家,每个玩家的牌也是一个集合容器)
        List<Card> lingchuchong = new ArrayList<>();
        List<Card> jiumozhi = new ArrayList<>();
        List<Card> renyingying = new ArrayList<>();

        // 11.发牌 (从牌集合中发出51张牌给三个玩家,留3张底牌)
        for (int i = 0; i < allCards.size() - 3; i++) {
            //先拿到当前牌对象
            Card c = allCards.get(i);

            if (i % 3 == 0) {
                //请阿冲接牌
                lingchuchong.add(c);
            } else if (i % 3 == 1) {
                jiumozhi.add(c);
            } else if (i % 3 == 2) {
                renyingying.add(c);
            }
        }

        // 12.拿到最后三张牌(把最后三张牌截取成一个子集合)
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());

        // 13.给玩家的牌排序(从大到小)
        sortCards(lingchuchong);
        sortCards(jiumozhi);
        sortCards(renyingying);

        // 14.输出玩家的牌 和底牌
        System.out.println("令狐冲的牌:"+lingchuchong);
        System.out.println("鸠摩智的牌:"+jiumozhi);
        System.out.println("任盈盈的牌:"+renyingying);
        System.out.println("三张底牌:"+lastThreeCards);

    }

    /*
        public static <T> void sort(List<T> list, Comparator<? super T> c) {
            list.sort(c);
        }
     */
//    public static void sortCards(List<Card> cards) {
//        Collections.sort(cards, new Comparator<Card>() {
//            @Override
//            public int compare(Card o1, Card o2) {
//                return o1.getIndex() - o2.getIndex();
//            }
//        });
//
//    }
    public static void sortCards(List<Card> cards) {Collections.sort(cards, (o1, o2) -> o2.getIndex() - o1.getIndex());}


}

总结:

首先定义一个静态的集合存储54张牌对象,然后使用静态代码块将牌初始化,组合牌的花色大小并封装为一个对象,存储到静态集合容器中,使用Collections工具类进行洗牌操作,并定义三个玩家对象,将打乱后的牌按顺序分别发给三个对象,重写比较规则,按照规则,将三个对象的牌按 降序 进行排序并输出。

原网站

版权声明
本文为[Haziy]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/zhangyouren/p/16451642.html