JavaSE基础加强、集合案例 斗地主

 


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Playpoker {
    //斗地主游戏
    //1、使用静态代码块在游戏启动前加载好54张牌
    //创建静态的字符串集合,公开化,一个房间只需要一副牌
    public static List<Card> allCards = new ArrayList<>();
    static {
        //存放点数
        //个数确定,类型确定,用数组
        String[] num = {"3","4","5","6","7","8","9","10","J","Q","k","A","2"};
        //存放花色
        String[] colors = {"♠","♥","♦","♣"};
        //开始生成扑克牌
        //记录牌的真实大小
        int index = 0;
        for (String s : num) {
            //每取一组牌index值加一
            //[♠3, ♥3, ♦3, ♣3, ♠4, ♥4, ♦4, ♣4,
            //  0   0   0   0   1   1    1   1
            index++;
            for (String color : colors) {
                //封装成一个扑克牌对象
                Card card = new Card(s,color,index);
                allCards.add(card);
            }
        }
        //2、将大小王加进去
        //++index 先进行加一操作
        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) {
        //3、开始洗牌
        Collections.shuffle(allCards);

        //4、定义三个玩家,三个玩家手中的牌也是一个集合容器
        List<Card> zhangsan = new ArrayList<>();
        List<Card> lisi = new ArrayList<>();
        List<Card> wangwu = new ArrayList<>();

        //5、开始发牌
        //allCards=[♠3, ♥3, ♦3, ♣3, ♠4, ♥4, ♦4, ♣4,..
        //           0   1   2   0   1   2   0   1 ...  %3 使用轮循,对3求余,每一轮发给三个对象
        for (int i = 0; i < allCards.size() - 3; i++) {
            //先拿当前牌对象
            Card c = allCards.get(i);
            if (i % 3 == 0){
                //张三接牌
                zhangsan.add(c);
            }else if (i % 3 == 1){
                //李四接牌
                lisi.add(c);
            }else if (i % 3 == 2){
                //王五接牌
                wangwu.add(c);
            }
        }

        //6、拿到最后三种底牌
        //List集合的切片操作 subList(int fromIndex,int toIndex)
        //截取集合的后三张牌成一个子集合
        List<Card> lastCard = allCards.subList(allCards.size()-3,allCards.size());//包前不包后 51-53

        //7、给玩家牌进行排序
        sortCard(zhangsan);
        sortCard(lisi);
        sortCard(wangwu);

        //8、输出玩家牌
        System.out.println("张三" + zhangsan);
        System.out.println("李四" + lisi);
        System.out.println("王五" + wangwu);
        System.out.println("地主牌" + lastCard);
    }

    /**
     * 对玩家牌进行排序
     * @param c
     */
    private static void sortCard(List<Card> c) {
        Collections.sort(c, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o1.getIndex() - o2.getIndex();
            }
        });

    }

}
public class Card{
    //扑克牌类
    //牌的点数
    private String size;
    private String color;
    //牌的真正大小
    private int index;

    public Card() {
    }

    public int getIndex() {
        return index;
    }

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

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

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


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值