Java基础--斗地主项目

本文介绍了如何使用Java编程实现一个简单的扑克游戏,包括创建Room类、Card类,构造器的使用,以及洗牌(利用Collections.shuffle)、发牌和看牌(使用Collections.sort和自定义Comparator)的过程。
摘要由CSDN通过智能技术生成

业务需求:实现做牌、洗牌、发牌、看牌。

目录

做牌与洗牌

发牌与看牌、排序


做牌与洗牌

代码逻辑:创建一个room类,在main方法中每实例化一个room类,等价于开了一个游戏房间,一局游戏开始

这里充分体现了构造器的优越性。我们可以在实例化一个类的时候,可以顺带着完成对象的初识化,而无需在main方法另写代码对对象进行赋值以及调用必要的方法。

构造器的优越性:在实例化类时,同时完成对象的初始化。初始化的东西即为该类所有的对象都要执行的代码。

做牌时,首先要清楚每一张牌有两种属性,因此一副牌即是牌类所有对象的集合

洗牌 :洗牌的操作充分发挥了java众多api的优越性,我们无需要自己再写算法去打乱集合,只需要调用Collections.shuffle()即可

public class card {
    private String num;
    private int size;

    public String getNum() {
        return num;
    }
//    toString方法是Java中的一个常用方法,它用于返回对象的字符串表示。当我们打印(sout)一个对象时,
//    本质上调用的就是对象的toString方法。
//    在Java中,toString方法默认定义于object类中,它返回一个由类名和对象的哈希码组成的字符串。
//    我们可以重写toString方法,以便返回更有意义的对象字符串表示。
    @Override
    public String toString() {
        return "card{" +
                "num='" + num + '\'' +
                ", size=" + size +
                '}';
    }

    public void setNum(String num) {
        this.num = num;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}
public class room {
    private List<card> cards = new ArrayList<>() ;

    public List<card> getCards() {
        return cards;
    }

    public void setCards(List<card> cards) {
        this.cards = cards;
    }

    //一进入房间,就自动创建好一副牌并完成洗牌,为了完成这个初始化,需要调用无参构造器,此即为无参构造器的作用
    public room(){
        String[] strings= {"3","4","5","6","7","8","9","10","A","J","Q","K","2"};
        for(int i = 0 ; i < 4;++i){
            int size = 0 ;
            for (String string : strings) {
                card card = new card();
                card.setNum(string);
                card.setSize(size);
                ++size;
                cards.add(card);
            }
        }
        card joker = new card();
        joker.setNum("joker");
        joker.setSize(13);
        cards.add(joker);
        card king = new card();
        joker.setNum("king");
        joker.setSize(14);
        cards.add(king);
        //洗牌
        Collections.shuffle(cards);

    }




}

发牌与看牌、排序

房间已经创好,接下来便是玩家入场,并且系统自动给他们发牌

下述代码中,使用了一个Collections.sort()进行排序。

该排序接口的使用有两种方式:

1.确保所要排序集合中的元素实现Comparable接口

2.在Collections.sort()额外传一个Comparator对象参数,来指定排序规则,这里一般直接定义一个匿名内部类(父类为Comparator对象,无具体类名以及对象名

Collections.sort(Rain, new Comparator<card>() {
            @Override
            public int compare(card o1, card o2) {

                return o1.getSize() - o2.getSize();
            }
        });

返回值的作用:

1.若为负,sort方法的内部算法会自动将o1排在前面

2.若为正,sort方法的内部算法会自动将o1排在后面

3.若为零,sort方法的内部算法会使两者在集合中的相对位置保持不变

下述是发牌看牌的完整代码

public class main {
    public static void main(String[] args) {
        room room = new room();

//        创建两个农民以及一个地主 这里令Rain为地主
        List<card> John = new ArrayList<>();
        List<card> Jack = new ArrayList<>();
        List<card> Rain = new ArrayList<>();
//        给玩家发牌 注意这里只发了51张牌 还有三张牌要另发给地主

//        增强for循环极其类似于c语言中的指针遍历数组,不利用索引进行集合的遍历
        for (int i = 0 ; i < room.getCards().size() - 3 ;++i) {
//            算法思路:模三为0 给JOhn 模三为1给Jack 模三为2给Rain
            if(i % 3 == 0){
                John.add(room.getCards().get(i));
            }
            if(i % 3 == 1){
                Jack.add(room.getCards().get(i));
            }
            if(i % 3 == 2){
                Rain.add(room.getCards().get(i));
            }
        }
//        在Java中,如果你直接打印一个列表对象,它会调用列表的toString()方法来打印出列表的内容。
//        因为list对象的tostring方法自动重写了

//        将剩下三张牌分给地主
        int cout = 3;
        while(!(cout == 0)){
            int Index = room.getCards().size()  - cout;
            Rain.add(room.getCards().get(Index));
            cout--;
        }
//         看牌
        System.out.println(Rain);

//        将Rain的牌进行排序
        Collections.sort(Rain, new Comparator<card>() {
            @Override
            public int compare(card o1, card o2) {

                return o1.getSize() - o2.getSize();
            }
        });
        System.out.println(John);
    }

}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值